MA020TOK em resumo
- Onde fica
- rotina
MATA020(Cadastro de Fornecedores), validação de confirmação. - Quando dispara
- ao confirmar a inclusão, antes de gravar.
- PARAMIXB
- não recebe nada. A chamada é feita sem parâmetros.
- Retorno
- usado.
.F.impede a gravação. Valor que não seja lógico é tratado como.T.. - Serve para bloquear?
- Sim, só na inclusão.
Consulta rápida7 seções
Ele ainda dispara?
Sim. A chamada existe nos dois caminhos do cadastro:
| Caminho | Quando é usado | O que chama o ponto de entrada |
|---|---|---|
| Tela clássica | Ambiente sem a tabela G3Q no dicionário | Rotina de validação do OK, no caso da inclusão |
| Modelo MVC | Ambiente com a tabela G3Q | Evento do modelo, no pós-validação, antes da gravação |
A escolha entre os dois é feita pela própria rotina, pela presença da G3Q no dicionário. Para você, a consequência prática é boa: o mesmo User Function MA020TOK vale nos dois caminhos, sem versão separada para cada um. O evento MVC chama o ponto de entrada nos mesmos momentos da rotina antiga.
Por isso, se você leu em algum lugar que o ponto de entrada não funciona mais, teste no seu ambiente antes de reescrever a regra. O que o código confirma é que a chamada continua lá.
Só inclusão
O MA020TOK roda apenas quando a operação é inclusão. No MVC o desvio por operação é exato:
- Inclusão: chama
MA020TOK. - Alteração: chama
MA020ALTno lugar dele (outro ponto de entrada, com nome e momento próprios). - Exclusão: segue pelo
A020DELE.
Na tela clássica há uma diferença: na inclusão, depois do MA020TOK, a verificação de avaliação do fornecedor também executa o MA020ALT. Ou seja, ali o MA020ALT roda nas duas operações e também pode reprovar uma inclusão.
Uma regra que precisa valer para inclusão e alteração não pode ficar só no MA020TOK. Quem coloca a regra aqui esperando que ela proteja a edição de um fornecedor antigo vai ver o cadastro aceitar o dado errado na alteração.
Retorno e o que o padrão faz depois
O retorno é testado como lógico. Se você devolver Nil, texto ou número, o padrão converte para .T. e segue. Com .F., a inclusão não é gravada.
Na tela clássica, a chamada só acontece se a verificação de código duplicado (ExistChav) já passou, e o ponto de entrada de template de mesmo nome, se existir, roda em seguida. Depois dele ainda vêm a verificação de avaliação do fornecedor (que executa o MA020ALT) e as integrações com outros módulos, que também podem reprovar.
No MVC, a ordem é fixa e verificada no evento: primeiro o ponto de entrada MA020TDOK, e só se ele aprovar o MA020TOK é chamado.
Sem PARAMIXB: de onde vêm os dados
Como nada chega por parâmetro, a função lê o fornecedor que está sendo incluído do contexto:
- Tela clássica: variáveis de memória
M->A2_COD,M->A2_LOJAe demais campos da SA2. - MVC: o modelo ativo. O evento deixa a variável privada
l020Autovisível dentro do ponto de entrada e a calcula pela view ativa: ela é verdadeira quando o cadastro não foi aberto pela tela do MATA020, como acontece em rotina automática.
Para detalhes de por que conferir PARAMIXB mesmo quando ele não é esperado, veja
PARAMIXB: o array que às vezes não é seu.
Exemplo
A regra do exemplo: pessoa jurídica precisa ter CNPJ informado. Ele funciona nos dois caminhos, buscando o valor no modelo quando há um ativo e nas variáveis de memória quando não há.
#Include "Protheus.ch"
/*/{Protheus.doc} MA020TOK
Executado ao confirmar a INCLUSAO de fornecedor, antes de gravar.
Nao recebe PARAMIXB.
@type user function
@return logical, .F. impede a gravacao
/*/
User Function MA020TOK()
Local lRet := .T.
Local oModel := FWModelActive()
Local cTipo := ""
Local cCgc := ""
Local lAuto := (Type("l020Auto") == "L" .And. l020Auto)
// No MVC existe modelo ativo; na tela classica, nao.
If ValType(oModel) == "O" .And. oModel:GetId() == "CUSTOMERVENDOR"
cTipo := oModel:GetValue("SA2MASTER", "A2_TIPO")
cCgc := oModel:GetValue("SA2MASTER", "A2_CGC")
Else
cTipo := M->A2_TIPO
cCgc := M->A2_CGC
EndIf
If cTipo == "J" .And. Empty(cCgc)
lRet := .F.
If !lAuto
Help(" ", 1, "MA020TOK",, ;
"Fornecedor pessoa juridica exige CNPJ informado.", 1, 0)
Else
ConOut("[MA020TOK] Inclusao recusada: CNPJ vazio.")
EndIf
EndIf
Return lRetO Return lRet explícito importa: sem ele o padrão trata o retorno como não lógico e aprova.
Armadilhas
Esperar PARAMIXB. Não há. Não escreva a regra apoiada em PARAMIXB: leia o fornecedor do modelo ou das variáveis de memória.
Usar o ponto de entrada para regra de alteração. Ele não dispara na alteração. Use o MA020ALT, lembrando que na tela clássica ele também roda na inclusão.
Bloquear sem mensagem. Com .F. e sem aviso, o usuário clica em OK e nada acontece. Mostre Help(), e em rotina automática (l020Auto) grave no log em vez de abrir diálogo.
Confundir com o MA020TDOK. Os dois são chamados pelo padrão, em momentos diferentes. Este artigo trata só do MA020TOK.
Os vizinhos
| PE | Operação | Observação |
|---|---|---|
MA020TOK | Inclusão | Retorno lógico bloqueia |
MA020ALT | Alteração (no MVC); na tela clássica também na inclusão, depois do MA020TOK | Valida a edição do fornecedor |
MA020TDOK | Inclusão e alteração | Assunto de outro artigo; no MVC roda antes do MA020TOK |
Para a mesma ideia em outro cadastro, veja o A010TOK. Para o mecanismo geral de chamada, veja Ponto de entrada no Protheus.
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.