FA050INC em resumo
- Onde fica
FA050Inclu(), dentro doFINA050(Contas a Pagar).- Quando dispara
- na validação final da inclusão do título (o “tudo OK” da tela), depois de várias validações do próprio padrão.
- PARAMIXB
- não existe. O padrão chama o ponto de entrada sem array.
- Retorno
- usado —
.F.barra a inclusão. - Serve para bloquear?
- Sim, na inclusão. Alteração tem outro ponto de entrada, o
FA050ALT.
Consulta rápida6 seções
Como não há PARAMIXB, a regra trabalha com o que já está em memória: as
variáveis M->E2_* do título que está sendo incluído.
Para o mecanismo geral de como o padrão chama um PE, veja Ponto de entrada no Protheus. Para o ponto de entrada do menu do mesmo programa, veja F050ROT.
Como o padrão monta a chamada
O FA050Inclu() não chama o PE na hora. Ele monta uma string de validação
(cTudoOK) somando condições com .AND.. Se o ponto de entrada estiver
compilado, a chamada dele, sem array de parâmetros, é acrescentada a essa
cadeia.
Duas consequências, ambas lidas nessa montagem:
- O retorno entra numa expressão lógica. Devolva sempre
.T.ou.F., nuncaNilou outro tipo. - Como ele vem no meio da cadeia, roda depois das validações que o padrão já
concatenou antes (entidades contábeis, por exemplo) e antes das que vêm
depois (
FA050VLMV(),F050VlCpos(),F050VldVlr()e outras). Se uma condição anterior já reprovou, é esperado que o PE nem seja chamado — é o comportamento normal do.AND.(inferido, não testado no ambiente).
O mesmo cTudoOK alimenta a tela e a inclusão automática, então o PE precisa
funcionar nos dois cenários.
Na tela: .F. mantém o usuário na inclusão
Na inclusão manual o padrão entrega o cTudoOK à AxInclui, como parâmetro de
validação do OK. Um .F. do PE deixa a tela aberta. Por isso a regra precisa
avisar (Help()): sem mensagem, o botão parece não funcionar.
Por ExecAuto: o que dá para afirmar
Quando o título vem por MsExecAuto com o FINA050, o FA050Inclu() segue
outro caminho, e há dois pontos de validação:
- Antes de gravar, o padrão chama
EnchAuto(cAlias, aAutoCab, cTudoOk, nOpc). Se ela devolver.F., o padrão fazlMsErroAuto := .T.elRet := .F.. - Depois, na gravação, chama
AxIncluiAuto(cAlias, cTudoOk, ...). Aqui o fonte é explícito: se ocTudoOkfor falso, a função registra no logProcesso invalido, devolve3e não grava. Ela não atribuilMsErroAutonesse trecho.
O que isso significa para o FA050INC:
- O título não é gravado quando o PE retorna
.F.(verificado emAxIncluiAuto). - O log automático traz só
Processo invalido, sem a sua mensagem. Quem chama não sabe qual regra barrou. - Neste caminho o
FA050Inclu()não marcalMsErroAutopor conta própria. Se oEnchAutojá avaliar ocTudoOk(ela é função compilada, sem fonte para conferir), o erro sobe por ali; se não avaliar, o.F.do PE só chega aoAxIncluiAutoe o chamador pode verlMsErroAutoainda.F.com o título não gravado. O fonte compilado não permite confirmar qual dos dois acontece.
Para saber qual é o caso no seu ambiente, chame o ExecAuto com E2_HIST vazio
usando o exemplo abaixo e olhe lMsErroAuto e o log ao voltar. Por segurança, o PE deve fazer o que ele mesmo controla: escrever a causa no
log da rotina automática com AutoGRLog() e marcar lMsErroAuto := .T. quando
a variável existir. Isso não depende de saber o que o EnchAuto faz. Para ler
esse log do lado de quem chama, veja
MsExecAuto: como descobrir por que a rotina falhou.
Para saber se está sob ExecAuto, o FINA050 declara lF050Auto como Private
(verdadeira quando a rotina recebe o array de campos). Ela é a chave certa para
decidir entre Help() e log.
Exemplo
Regra de demonstração: não deixar incluir título sem histórico (E2_HIST).
O campo não é obrigatório no dicionário padrão, então a regra é da empresa.
#Include "Protheus.ch"
/*/{Protheus.doc} FA050INC
Executado na validacao final da inclusao do titulo (FA050Inclu).
Nao recebe PARAMIXB: le as variaveis de memoria M->E2_*.
@type user function
@return logical, .F. barra a inclusao
/*/
User Function FA050INC()
Local lRet := .T.
Local lAuto := (Type("lF050Auto") == "L" .And. lF050Auto)
Local cMsg := "Informe o histórico do título (E2_HIST)."
If Empty(M->E2_HIST)
lRet := .F.
If lAuto
// Sem tela: a causa vai para o log do ExecAuto
AutoGRLog("FA050INC: " + cMsg)
If Type("lMsErroAuto") == "L"
lMsErroAuto := .T.
EndIf
Else
Help(" ", 1, "FA050INC",, cMsg, 1, 0)
EndIf
EndIf
Return lRetRepare que o retorno é sempre lógico e que a mensagem tem dois destinos: tela
ou log. Sem tela, quem lê o resultado do ExecAuto só enxerga o log, não um
Help().
Armadilhas
Retornar .F. calado. Na tela o botão OK parece travado; no ExecAuto o
chamador só vê Processo invalido.
Esperar PARAMIXB. Não existe. Ler PARAMIXB[1] aqui é erro.
Retornar outro tipo. O retorno entra numa cadeia .AND.; Nil ou texto
quebra a avaliação.
Aplicar a regra a título que não é seu. O FA050Inclu() também é chamado
por outros fluxos (a substituição de títulos e uma rotina do módulo jurídico,
por exemplo), então o PE pode rodar fora da tela de inclusão comum. Se a regra
vale só para certa origem, filtre por M->E2_ORIGEM ou pelo que identifica o
seu caso.
Os vizinhos
| PE | Momento | Bloqueia? |
|---|---|---|
F050ROT | Montagem do menu | Não |
FA050INC | Validação final da inclusão | Sim |
FA050ALT | Validação final da alteração | Sim |
Não confunda com F050INC, sem o “A”: o FINA050 também chama esse nome, e a
chamada fica depois da gravação do título, não na validação do OK.
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.