Pragiva — Tecnologia na prática

MT103FIM o ponto de entrada do fim do Documento de Entrada

MT103FIM dispara no final do MATA103, depois da gravação, e recebe a opção da tela e a confirmação; o retorno é ignorado.

Desenvolvimento Referência técnica 3 min de leitura

Assista o vídeo

MT103FIM em resumo

Onde fica
função A103NFiscal(), do MATA103 (Documento de Entrada), no fim da rotina.
Quando dispara
no fim da rotina, depois do bloco de gravação (que só grava com a tela confirmada), já fora da transação de gravação. Só se a gravação não falhou (lRet) e se a rotina não foi chamada apenas para atualizar impostos.
PARAMIXB
{nOpcao, nConfirma}, dois elementos numéricos.
Retorno
ignorado. A chamada não captura o que a função devolve.
Serve para bloquear?
Não. Se o usuário confirmou a tela (PARAMIXB[2] == 1), o documento já foi gravado quando o PE roda. O disparo em si não testa a confirmação.
Consulta rápida6 seções

Para o mecanismo geral, veja Ponto de entrada no Protheus.

O que ele recebe

PosiçãoConteúdo
PARAMIXB[1]A opção do menu escolhida: 2 visualizar, 3 incluir, 4 classificar, 5 excluir
PARAMIXB[2]1 quando o usuário confirmou a tela, 0 quando cancelou

O primeiro elemento vem da quarta coluna do aRotina do MATA103, e é assim que o menu do padrão define as opções. O segundo é a variável interna que a tela marca com 1 no botão de confirmar e com 0 no cancelamento. Repare que o PE não manda o número do documento: ele vem da , que os trechos seguintes do próprio padrão continuam lendo como posicionada.

Como a posição e o tipo do PARAMIXB mudam de um PE para outro, vale ler PARAMIXB: o array que às vezes não é seu.

Quando exatamente ele roda

Na ordem em que o padrão chama, na mesma rotina:

  1. o bloco de gravação, dentro de transação;
  2. a contabilização e outras rotinas posteriores à transação;
  3. o MT100AGR, que também roda no fim da gravação, mas sem PARAMIXB;
  4. o MT103FIM.

Duas consequências práticas. Primeiro, quem chega ao MT103FIM com a tela confirmada encontra estoque, título e lançamentos já feitos: é o lugar de completar um processo (enviar aviso, gravar log, chamar integração), não de decidir se a nota pode ser gravada. Segundo, como está fora da transação, um erro seu aqui não desfaz nada do que o padrão gravou.

A condição de disparo, no fonte, exige três coisas ao mesmo tempo: gravação sem falha, rotina não chamada só para atualizar impostos, e não ser exclusão (com uma exceção ligada à compensação de adiantamento). Se o documento falhou e foi desarmado, o PE não roda.

Relação com a pré-nota

O MT103FIM existe só no MATA103. A pré-nota (MATA140) não tem chamada a ele. O que liga os dois assuntos é a opção Classificar, que é a opção 4 do menu do MATA103: é por ela que uma nota sem status passa a ser um documento de entrada completo. Se a sua regra vale para a nota “que acabou de ser classificada”, o PE recebe PARAMIXB[1] == 4. Para entender a diferença entre as duas telas, veja Pré-nota ou documento de entrada?.

Exemplo

ADVPL / TLPP
#Include "Protheus.ch"

/*/{Protheus.doc} MT103FIM
Executado no fim do MATA103, depois da gravação do Documento de Entrada.
Registra no console a inclusão ou a classificação de notas de serviço.
@type user function
/*/
User Function MT103FIM()

    Local nOpcao    := 0
    Local nConfirma := 0

    If Type("PARAMIXB") <> "A" .Or. Len(PARAMIXB) < 2
        Return
    EndIf

    nOpcao    := PARAMIXB[1]
    nConfirma := PARAMIXB[2]

    // Só age se o usuário confirmou. Parênteses explícitos: .And. vale
    // antes de .Or., e sem eles a confirmação só filtraria a classificação.
    If nConfirma == 1 .And. (nOpcao == 3 .Or. nOpcao == 4)

        If AllTrim(SF1->F1_ESPECIE) $ "NFS|NFSE"
            ConOut("[MT103FIM] Nota de servico gravada: " + ;
                SF1->F1_DOC + "/" + SF1->F1_SERIE + " fornecedor " + ;
                SF1->F1_FORNECE + "-" + SF1->F1_LOJA)
        EndIf

    EndIf

Return

Troque o ConOut pela ação real da sua regra. Como o retorno é ignorado, o Return sem valor é aceito.

Armadilhas

Precedência de .And. e .Or.. Escrever nOpcao == 3 .Or. nOpcao == 4 .And. nConfirma == 1 faz a confirmação valer só para a classificação, e a inclusão passa mesmo se o usuário cancelou. O .And. é avaliado primeiro; use parênteses. Detalhes em Operadores em ADVPL.

Tentar bloquear. Return .F. não tem efeito: o padrão não lê o retorno e, com a tela confirmada (PARAMIXB[2] == 1), o documento já está gravado. Para impedir a gravação, o momento é o MT100GRV.

Não filtrar PARAMIXB[2]. A condição do fonte não olha nOpc, então um PE que age sem testar a confirmação pode rodar sem que o usuário tenha gravado nada. O que acontece exatamente em visualização e cancelamento fica para você conferir no ambiente. O padrão tem um ponto de entrada próprio para o cancelamento, o MT103CAN.

Perder a SF1. O PE não recebe a chave do documento. Se a regra abre outras áreas de trabalho, salve e restaure com GetArea/RestArea (veja GetArea e RestArea em ADVPL).

Quando outro ponto de entrada é mais adequado

  • Bloquear ou validar antes da escrita: MT100GRV.
  • Mexer na parcela de título gerada: MT100GE2.
  • Tratar o clique em Cancelar: MT103CAN.

Continue por aqui