Tempo de leitura: 6 minutos
No ecossistema Protheus, a rotina de Pedido de Compras (MATA120) é o coração do processo de suprimentos. No entanto, em cenários de alta integração — como e-commerces, sistemas de WMS ou planejamento de demanda — a digitação manual é inviável. A função MSExecAuto em ADVPL é a solução definitiva para automatizar essa rotina, permitindo a criação de registros de forma programática e sem interface visual. Este é um conceito fundamental para quem domina Rotinas Automáticas.
Neste guia técnico, você aprenderá como estruturar os arrays de cabeçalho e itens para utilizar o MSExecAuto MATA120, garantindo agilidade e padronização no seu Backoffice.
O que é o MSExecAuto e por que automatizar o MATA120?
O MSExecAuto (ou simplesmente ExecAuto) é uma ferramenta da linguagem ADVPL que simula a ação de um usuário em uma rotina padrão. Ela executa todas as validações de negócio da rotina, garantindo a integridade dos dados na tabela SC7 (Pedidos de Compra).
Automatizar o MATA120 traz benefícios imediatos:
- Integração: Importe pedidos de sistemas externos diretamente para o Protheus.
- Performance: Processe centenas de pedidos em segundos através de Jobs agendados.
- Conformidade: Garanta que todos os pedidos sigam as mesmas regras de preenchimento, eliminando o erro humano.
Detalhes Técnicos
- Rotina Base: MATA120 (Pedido de Compras)
- Módulo: Compras (SIGACOM)
- Tabela Principal: SC7 (Pedidos de Compra)
- Opção de Execução: 3 (Inclusão), 4 (Alteração), 5 (Exclusão)
Exemplo Prático em ADVPL: Usando MSExecAuto MATA120
Abaixo, apresentamos um fonte de exemplo em ADVPL que utiliza o MSExecAuto para incluir um novo Pedido de Compras no módulo Compras do Protheus.
#include "protheus.ch"
#include "parmtype.ch"
/*/{Protheus.doc
@FN fExecAPC
@DI Criar Pedido de Compras (MATA120) via MSExecAuto (ADVPL)
@AUTHOR Blog ProtheusAdvpl
@VERSION 1.00
@Inscreva-se no Blog ProtheusAdvpl:
https://www.protheusadvpl.com.br
@Inscreva-se no Canal ProtheusAdvpl:
https://www.youtube.com/protheusadvpl
@Siga-nos no Instagram:
https://www.instagram.com/protheusadvpl
@Conheça os Cursos do ProtheusAdvpl:
https://cursos-e-formacoes-protheusadvpl.gr-site.com/
@Participe de nossas comunidades no WhatsApp:
-Comunidade Protheus Backoffice:https://chat.whatsapp.com/KMUIAjwZ6EZ6eAHsLkPTyb
-Comunidade Protheus-RH:https://chat.whatsapp.com/L5dUyAna6xU4ylG5DUgfOW
-Comunidade Protheus-Programação:https://chat.whatsapp.com/LsD6z0apdqKHlOz67bcaEn
-Comunidade Protheus-Framework:https://chat.whatsapp.com/BzUFpjaSnTC3vtsfa77jmG
|Se esse conteúdo foi útil pra você nos ajude divulgando
ele e nossas redes sociais!!|
@TYPE Function
@OBS O Protheus deve estar com o Ambiente de Compras configurado e com cadastros válidos.
@FOLDER AUTOMACAO_COMPRAS
*/
User Function fExecAPC()
Local aArea := GetArea()
Local lRet := .F.
Local aC7Cab := {} // Array para o Cabeçalho (Tabela SC7)
Local aC7Itens := {} // Array para os Itens (Tabela SC7)
Local aC7Dados := {} // Array Geral para o ExecAuto
// Necessário definir a Filial correta para o ExecAuto
// Se o ExecAuto estiver sendo chamado de um ponto de entrada/gatilho, essa definição pode ser omitida.
//MsAppEnvSet("MV_FILIAL", "D M C 01") // Ajuste "D M C 01" para sua Filial!
//---------------------------------------------------------
// 1. MONTAGEM DO ARRAY DE CABEÇALHO (Tabela SC7)
//---------------------------------------------------------
aAdd(aC7Cab, {'C7_FILIAL', 'D M C 01', Nil}) // Filial (Ajuste conforme a linha acima)
aAdd(aC7Cab, {'C7_FORNECE', 'FORN', Nil}) // Código do Fornecedor (Ex: "F O R N")
aAdd(aC7Cab, {'C7_LOJA', '01', Nil}) // Loja do Fornecedor
aAdd(aC7Cab, {'C7_EMISSAO', DToC(Date()), Nil}) // Data de Emissão (Hoje)
aAdd(aC7Cab, {'C7_CONDPAG', '001', Nil}) // Condição de Pagamento (Ex: "0 0 1")
aAdd(aC7Cab, {'C7_MOEDA', '01', Nil}) // Moeda (Ex: "0 1" - Real)
aAdd(aC7Cab, {'C7_TPDESC', '1', Nil}) // Tipo de Desconto (1- Percentual / 2- Valor)
aAdd(aC7Cab, {'C7_BLQ', '1', Nil}) // Bloqueado (1- Liberado / 2- Bloqueado)
aAdd(aC7Cab, {'C7_DESC', 0, Nil}) // Percentual de Desconto
aAdd(aC7Cab, {'C7_FRETE', 0, Nil}) // Valor do Frete
aAdd(aC7Cab, {'C7_OBS', 'PEDIDO CRIADO VIA EXEC AUTO', Nil}) // Observação do Pedido
//---------------------------------------------------------
// 2. MONTAGEM DO ARRAY DE ITENS (Tabela SC7)
//---------------------------------------------------------
// --- Item 1 ---
Local aItem1 := {}
aAdd(aItem1, {'C7_PRODUTO', 'PRODUTO 01', Nil}) // Código do Produto (Ex: "P R O D U T O 0 1")
aAdd(aItem1, {'C7_QUANT', 10, Nil}) // Quantidade (10)
aAdd(aItem1, {'C7_PRECO', 5.50, Nil}) // Preço Unitário (R$ 5,50)
aAdd(aItem1, {'C7_TOTAL', 55.00, Nil}) // Valor Total (10 * 5,50)
aAdd(aItem1, {'C7_UM', 'UN', Nil}) // Unidade de Medida
aAdd(aItem1, {'C7_DATPRF', DToC(Date()+15), Nil}) // Data de Previsão de Entrega (15 dias)
aAdd(aC7Itens, aItem1) // Adiciona o Item 1 ao Array Geral de Itens
// --- Item 2 ---
Local aItem2 := {}
aAdd(aItem2, {'C7_PRODUTO', 'P R O D U T O 0 2', Nil}) // Código do Produto (Ex: "P R O D U T O 0 2")
aAdd(aItem2, {'C7_QUANT', 5, Nil}) // Quantidade (5)
aAdd(aItem2, {'C7_PRECO', 12.00, Nil}) // Preço Unitário (R$ 12,00)
aAdd(aItem2, {'C7_TOTAL', 60.00, Nil}) // Valor Total (5 * 12,00)
aAdd(aItem2, {'C7_UM', 'UN', Nil}) // Unidade de Medida
aAdd(aItem2, {'C7_DATPRF', DToC(Date()+15), Nil}) // Data de Previsão de Entrega (15 dias)
aAdd(aC7Itens, aItem2) // Adiciona o Item 2 ao Array Geral de Itens
//---------------------------------------------------------
// 3. MONTAGEM DO ARRAY FINAL DO EXEC AUTO
//---------------------------------------------------------
aAdd(aC7Dados, aC7Cab) // Posição 1: Cabeçalho
aAdd(aC7Dados, aC7Itens) // Posição 2: Itens
//---------------------------------------------------------
// 4. CHAMADA DO MSEXECAUTO MATA120
//---------------------------------------------------------
// Parametros:
// 1 - Rotina: MATA120 (Pedido de Compras)
// 2 - Opção: 3 (Incluir)
// 3 - Array de Dados: aC7Dados
// 4 - Array Opcional: {} (Vazio, mas pode ser usado para Rateio, etc.)
// 5 - Bloqueio de Tela: 1 (Silencioso - Não mostra interface)
lRet := MSExecAuto("MATA120", 3, aC7Dados, {}, 1)
If lRet
ConOut("## Pedido de Compras Criado com Sucesso! ##")
Else
ConOut("## Erro na Criação do Pedido de Compras! ##")
EndIf
RestArea(aArea)
Return lRet
Nota Importante sobre ADVPL e Protheus: Garanta que os códigos de Fornecedor, Produto, Condição de Pagamento e Filial (‘FORN’, ‘PRODUTO 01’, ‘001’, ‘D M C 0 1’) utilizados no exemplo existam no seu ambiente de teste Protheus, ou a rotina falhará.
Domine as Rotinas Automáticas e o Backoffice
Para dominar este conceito em cenários de alta complexidade, como o tratamento de erros em lote, integração via Web Services REST e customizações avançadas no SIGACOM, conheça o Portal ProtheusAdvpl. Lá, exploramos a fundo a arquitetura do Protheus e as melhores práticas para desenvolvedores seniores.
Cursos Recomendados para Programação e Backoffice:
Dicas de Especialista
- Validação de Erros: Sempre utilize a função MostraErro() ou verifique a variável global lMsErroAuto para capturar o motivo exato de uma falha na inclusão.
- Ambiente: Garanta que o ambiente de compras esteja devidamente aberto (RpcSetEnv) se o ExecAuto for chamado a partir de um processo externo (como um Job).
- Performance: Para grandes volumes, considere desabilitar temporariamente índices não essenciais ou processar em Threads separadas.
Conclusão
O MSExecAuto MATA120 é uma ferramenta indispensável para qualquer desenvolvedor que busca excelência em automação no Protheus. Ao dominar essa função, você transforma processos lentos e manuais em fluxos ágeis e seguros. Dominar ADVPL Avançado é o que separa um programador comum de um consultor de alto valor.
Links de referência(s):