Pragiva — Tecnologia na prática

MA020TOK o ponto de entrada da validação do Cadastro de Fornecedor

MA020TOK ainda dispara no MATA020, na tela clássica e no modelo MVC, mas só na inclusão. Não recebe PARAMIXB e o .F. bloqueia a gravação do fornecedor.

Desenvolvimento Referência técnica 3 min de leitura

Assista o vídeo

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:

CaminhoQuando é usadoO que chama o ponto de entrada
Tela clássicaAmbiente sem a tabela G3Q no dicionárioRotina de validação do OK, no caso da inclusão
Modelo MVCAmbiente com a tabela G3QEvento 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 MA020ALT no 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_LOJA e demais campos da SA2.
  • MVC: o modelo ativo. O evento deixa a variável privada l020Auto visí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á.

ADVPL / TLPP
#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 lRet

O 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

PEOperaçãoObservação
MA020TOKInclusãoRetorno lógico bloqueia
MA020ALTAlteração (no MVC); na tela clássica também na inclusão, depois do MA020TOKValida a edição do fornecedor
MA020TDOKInclusão e alteraçãoAssunto 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