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ção | Conteú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 SF1, 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:
- o bloco de gravação, dentro de transação;
- a contabilização e outras rotinas posteriores à transação;
- o
MT100AGR, que também roda no fim da gravação, mas semPARAMIXB; - 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
#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
ReturnTroque 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
Continue por aqui
- Vídeo
DesenvolvimentoReferência técnica
F340VALOK: o ponto de entrada que barra o OK da compensação a pagar
F340VALOK roda ao clicar OK na lista de títulos da compensação a pagar, recebe a lista em PARAMIXB e, retornando .F., mantém o usuário na lista.
- Vídeo
DesenvolvimentoReferência técnica
F340VLD: o ponto de entrada que barra a compensação no Contas a Pagar
F340VLD roda ao confirmar a primeira tela da compensação a pagar (FINA340), sem PARAMIXB. Retornando .F., a tela não fecha e nenhum título chega a ser listado.
- Vídeo
DesenvolvimentoReferência técnica
F40DELPR: o ponto de entrada que troca a baixa do provisório pela exclusão
F40DELPR roda ao abrir a substituição de título provisório no Contas a Receber, sem PARAMIXB. Retornando .T., o provisório é excluído em vez de baixado.