Como criar um Ponto de Entrada

Tutorial passo-a-passo: como criar um Ponto de Entrada Protheus, registrar no RPO e validar que esta sendo disparado.

Ponto de Entrada (PE) e o jeito oficial de customizar comportamento de uma rotina padrao TOTVS sem alterar o fonte original. O sistema chama o PE em momentos pre-definidos (antes de gravar, validar, etc.).

1. Descobrir qual PE usar

Cada rotina tem PEs documentados no TDN. Exemplos comuns:

Procure no TDN: "<nome-rotina> pontos de entrada".

2. Escrever o fonte

#INCLUDE "PROTHEUS.CH"

/*/{Protheus.doc} MA030VLD
Bloqueia inclusao se CNPJ ja existir em outra filial.
/*/
User Function MA030VLD()
    Local lOk    := .T.
    Local cCgc   := M->A1_CGC
    Local cQuery := ""

    cQuery := "SELECT COUNT(*) AS N "
    cQuery += "  FROM " + RetSqlName("SA1") + " SA1 "
    cQuery += " WHERE A1_CGC = '" + cCgc + "' "
    cQuery += "   AND A1_FILIAL <> '" + xFilial("SA1") + "' "
    cQuery += "   AND D_E_L_E_T_ = ' ' "

    If TCSqlExec(cQuery) // simplificado
        // tem em outra filial
        Help(,,"HELP",,"CNPJ ja cadastrado em outra filial", 1, 0)
        lOk := .F.
    EndIf
Return lOk

3. Compilar e validar

  1. Salve como MA030VLD.prw
  2. Compile: Ctrl+F9 no TDS-VSCode ou /advpl-compile no Claude Code
  3. O fonte vai pro RPO — automaticamente o sistema vai chamar quando a rotina alvo executar
  4. Teste: abra MATA030, tente cadastrar cliente com CNPJ duplicado em outra filial — deve bloquear

4. Verificar se esta sendo disparado

Se nao funcionar, adicione log no inicio do PE:

User Function MA030VLD()
    ConOut("MA030VLD disparado em " + Time() + " - user: " + cUserName)
    // ... resto ...
Return lOk

Olhe no console do AppServer (ou console.log em logs/). Se nao aparecer, possiveis causas:

5. Boas praticas

Veja também