Automação de Requisições — Power Automate Desktop + ERP Delphi/Firebird
Visão Geral
Automação que monitora requisições novas no ERP (Delphi + Firebird 2.5), gera PDF via UI automation, salva no servidor de rede e imprime na impressora Brother — tudo orquestrado pelo Power Automate Desktop (PAD) com controle de estado em SQLite local.
Esta automação implementa parte do que está descrito em geracao-req-producao — especificamente, a geração do PDF da ficha de pesagem (comando de produção) a partir dos dados da REQ no ERP Delphi.
Arquitetura
┌──────────────┐ ODBC/SQL ┌──────────────┐
│ Firebird │◄────────────────│ Power │
│ ERP 2.5 │ leitura only │ Automate │
└──────────────┘ │ Desktop │
│ │
┌──────────────┐ ODBC/SQL │ (roda no │
│ SQLite │◄───────────────►│ server1) │
│ pad_logs.db │ leitura/escrita│ │
└──────────────┘ └──────┬───────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
UI Automation Salva PDF em Print Brother
no ERP Delphi \\server1\req\ via SumatraPDF
{numero}.pdf CLI silencioso
Decisões de Projeto
| Decisão | Escolha | Motivo |
|---|---|---|
| Ferramenta de orquestração | Power Automate Desktop (PAD) | Precisa interagir com UI Win32 do ERP Delphi — PAD cloud não serve |
| Detecção de reqs novas | Query periódica no Firebird via ODBC | Robusto; alternativa (scraping visual da listagem) é frágil |
| Controle de estado | SQLite local no server1 | Zero dependência do banco do ERP; escala pra outros logs futuros |
| Reprocessamento | Comparação de timestamps (não flag booleano) | Se o ERP regravar a req com data mais nova, o PAD reprocessa automaticamente |
| Impressão física (Brother) | SumatraPDF CLI (portable) | Silencioso, não abre janela, fecha sozinho; mais confiável que Start-Process -Verb PrintTo |
| Path dos PDFs | \\server1\req\{numero_req}.pdf direto | Sem subpastas; o ERP já gera 1 PDF multipágina por requisição |
| Polling | Loop com wait no PAD ou Agendador de Tarefas do Windows | Agendador é mais resiliente — reinicia se o fluxo crashar |
| Ambiente de teste | Desktop do operador (enxerga server1 na rede) | Depois de validado, migra pro server1 com usuário admin exclusivo logado |
Infraestrutura Necessária
Firebird ODBC
- Driver: Firebird ODBC 2.5.x (32-bit — o PAD usa ODBC 32-bit)
- Download: https://firebirdsql.org/en/odbc-driver/
- DSN (System DSN, 32-bit):
- Nome:
ERP_Firebird - Database:
IP_DO_SERVER:C:\caminho\banco.fdb - Client:
C:\Program Files (x86)\Firebird\Firebird_2_5\bin\fbclient.dll - User:
SYSDBA - Password: (senha do ERP)
- Character Set:
WIN1252ouUTF8(verificar no DBeaver)
- Nome:
- Connection string no PAD:
DSN=ERP_Firebird;UID=SYSDBA;PWD=suasenha
SQLite ODBC
- Driver: SQLite3 ODBC Driver
- Download: http://www.ch-werner.de/sqliteodbc/
- DSN (System DSN, 32-bit):
- Nome:
PAD_Logs - Database:
\\server1\pad\pad_logs.db
- Nome:
SumatraPDF
- Versão: Portable (sem instalação)
- Path sugerido:
\\server1\tools\SumatraPDF.exeouC:\Tools\SumatraPDF\SumatraPDF.exe
Impressoras
- PDF: Microsoft Print to PDF (nativa do Windows)
- Física: Brother HL-XXXX (nome exato via
Get-Printer | Select-Object Nameno PowerShell)
Banco de Dados — SQLite (pad_logs.db)
Criação
CREATE TABLE processamentos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
numero_req TEXT NOT NULL,
data_inclusao_erp TIMESTAMP,
data_processamento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status TEXT DEFAULT 'ok',
erro TEXT
);
CREATE INDEX idx_req ON processamentos(numero_req);Campos
| Campo | Tipo | Função |
|---|---|---|
numero_req | TEXT | Número da requisição no ERP |
data_inclusao_erp | TIMESTAMP | Data de inclusão/modificação no ERP — usado pra detectar reprocessamento |
data_processamento | TIMESTAMP | Quando o PAD processou |
status | TEXT | ok ou erro |
erro | TEXT | Descrição do erro (null se ok) |
Queries
Buscar requisições no Firebird (ERP)
-- Query inicial de teste (top 5)
SELECT FIRST 5 numero_req, data_inclusao
FROM requisicoes
ORDER BY data_inclusao DESC
-- Query de produção (todas)
SELECT numero_req, data_inclusao
FROM requisicoes
WHERE data_inclusao >= '2025-01-01' -- ajustar conforme necessidadeNota: os nomes de tabela e colunas (
requisicoes,numero_req,data_inclusao) são placeholders — ajustar para os nomes reais do banco do ERP. Consultar no DBeaver.
Verificar se precisa processar (SQLite)
SELECT COUNT(*) AS n
FROM processamentos
WHERE numero_req = :req
AND data_processamento >= :data_inclusao_erp
AND status = 'ok'Se retorna 0 → precisa processar (nunca processou, ou ERP regravou com data mais nova, ou processamento anterior falhou).
Registrar processamento (SQLite)
-- Sucesso
INSERT INTO processamentos (numero_req, data_inclusao_erp, status)
VALUES (:req, :data_inclusao, 'ok');
-- Erro
INSERT INTO processamentos (numero_req, data_inclusao_erp, status, erro)
VALUES (:req, :data_inclusao, 'erro', :mensagem_erro);Fluxo PAD — Estrutura Completa
1. Open SQL Connection → ERP_Firebird → %ConnERP%
2. Open SQL Connection → PAD_Logs → %ConnSQLite%
3. Execute SQL → %ConnERP% → busca requisições → %ReqList%
4. For each %CurrentItem% in %ReqList%
│
│ 5. Execute SQL → %ConnSQLite% →
│ verifica se já processou com sucesso e data >= ERP
│ → %CheckResult%
│
│ 6. If %CheckResult[0][0]% = 0
│ │
│ │ ── UI AUTOMATION ──────────────────────────────
│ │ 7. Navega no ERP até busca de requisições
│ │ 8. Preenche campo busca com %CurrentItem[0]%
│ │ 9. Abre a requisição
│ │ 10. Wait for UI element → ícone de print
│ │ 11. Clica no ícone de print
│ │ 12. Wait for UI element → diálogo de impressão Windows
│ │ 13. Seleciona "Microsoft Print to PDF"
│ │ 14. Clica "Imprimir"
│ │ 15. Wait for UI element → diálogo "Salvar como"
│ │ 16. Preenche nome do arquivo:
│ │ \\server1\req\%CurrentItem[0]%.pdf
│ │ 17. Clica "Salvar"
│ │ ── FIM UI AUTOMATION ──────────────────────────
│ │
│ │ 18. Wait / Loop até arquivo existir (timeout 15s)
│ │
│ │ 19. If file exists
│ │ │ 20. Run PowerShell → SumatraPDF print na Brother
│ │ │ 21. INSERT SQLite → status = 'ok'
│ │ │
│ │ Else
│ │ │ 22. INSERT SQLite → status = 'erro', erro = 'PDF não gerado'
│ │ End If
│ │
│ │ On Error (qualquer falha na UI)
│ │ │ 23. INSERT SQLite → status = 'erro' + mensagem
│ │ │ 24. Continue loop (próxima req)
│ │
│ End If
│
End For
25. Close SQL Connection → %ConnERP%
26. Close SQL Connection → %ConnSQLite%
27. Wait X segundos (ou fim — se disparado pelo Agendador de Tarefas)
Print na Brother — PowerShell
# Opção recomendada — SumatraPDF (silencioso)
$pdfPath = "\\server1\req\NUMERO_REQ.pdf"
$printer = "Brother HL-XXXX series" # nome exato do Get-Printer
& "C:\Tools\SumatraPDF\SumatraPDF.exe" -print-to "$printer" -silent "$pdfPath"# Alternativa nativa (menos confiável, pode abrir janela)
Start-Process -FilePath $pdfPath -Verb PrintTo -ArgumentList $printer -WindowStyle HiddenDescobrir nome exato da impressora
Get-Printer | Select-Object NamePasso a Passo de Implementação
Passo 1 — Conectividade
- Instalar Firebird ODBC 2.5 (32-bit)
- Configurar System DSN
ERP_Firebirdno ODBC 32-bit - Testar conexão no DSN
- Instalar SQLite ODBC Driver
- Criar pasta
\\server1\pad\ - Configurar System DSN
PAD_Logs - No PAD: Open SQL Connection → Execute SQL de teste em ambos
- No PAD: executar CREATE TABLE no SQLite
Passo 2 — UI Automation
- Abrir o ERP no desktop
- No PAD, usar o Recorder para gravar a sequência:
- Buscar requisição por número → abrir → clicar print → diálogo Windows → salvar PDF
- Revisar ações gravadas:
- Trocar valores fixos por variáveis (
%CurrentItem[0]%) - Adicionar “Wait for UI element” antes de cada clique crítico
- Adicionar “If file exists” pós-salvamento com timeout
- Envolver em bloco “On error”
- Trocar valores fixos por variáveis (
- Testar com 2-3 requisições manualmente
Passo 3 — Loop Completo
- Montar a estrutura de loop conforme diagrama acima
- Conectar queries Firebird + SQLite + UI automation + tratamento de erro
- Testar end-to-end com 3-4 requisições
Passo 4 — Print Físico
- Baixar SumatraPDF portable, colocar em
C:\Tools\SumatraPDF\ - Descobrir nome exato da Brother (
Get-Printer) - Adicionar ação “Run PowerShell script” no fluxo após confirmação do PDF
- Testar impressão
Passo 5 — Produção
- Validar no desktop com volume real (10+ reqs)
- Instalar PAD no server1
- Criar usuário admin exclusivo logado no server1
- Configurar DSNs no server1
- Configurar Agendador de Tarefas para disparar o fluxo a cada X minutos
- Criar pasta
\\server1\req\se não existir - Monitorar SQLite por erros nos primeiros dias
Pontos de Atenção
- Nomes de tabela/coluna no Firebird —
requisicoes,numero_req,data_inclusaosão placeholders. Verificar nomes reais no DBeaver. - Diálogo de impressão — o ERP mostra o diálogo padrão do Windows (confirmado). Se algum popup inesperado aparecer, o “On error” captura e loga.
- Character set do Firebird — verificar se é WIN1252 ou UTF8 antes de configurar o DSN, senão caracteres especiais quebram.
- Timeout de geração — o ERP costuma levar no máximo 3s para gerar a tela, mas usar “Wait for UI element” é mais resiliente que timer fixo.
- Concorrência — se uma atendente estiver usando o ERP no mesmo momento que o PAD, a UI automation pode conflitar. No server1 com sessão exclusiva isso não acontece, mas no desktop de teste pode.
- Microsoft Print to PDF — se a pasta de destino UNC não existir, o diálogo de salvar vai falhar silenciosamente. Garantir que
\\server1\req\existe.
Relação com processos
- geracao-req-producao — este é o processo de negócio que esta automação implementa parcialmente (geração do PDF da ficha de pesagem)
- conferencia-automatica-ag-impressao — a conferência automática consome dados que esta automação ajuda a produzir
- contexto-print-service-neofarma — o Print Service unificado subsume esta automação como o job de “fichas”
- guia-print-service-implementacao — guia prático de implementação do service que orquestra esta automação