Pragiva — Tecnologia na prática

MT120OK o ponto de entrada da validação final do Pedido de Compra

MT120OK roda no TudoOk do MATA120, sem PARAMIXB, só depois de o padrão aprovar o pedido. Retornar .F. impede o OK da tela; retorno que não é lógico é ignorado.

Desenvolvimento Referência técnica 2 min de leitura

Assista o vídeo

MT120OK em resumo

Onde fica
função A120TudOk(), a validação do pedido inteiro no MATA120.
Quando dispara
ao confirmar a tela (e na rotina automática), depois das validações do padrão e antes de qualquer gravação.
PARAMIXB
nenhum. O padrão chama o ponto sem passar array.
Retorno
usado se for lógico. .F. impede o OK; qualquer outro tipo é ignorado.
Serve para bloquear?
Sim, e o padrão já aprovou o pedido antes de chamar você.
Consulta rápida5 seções

Como o padrão chama o ponto

A chamada no padrão é, em essência, esta:

ADVPL / TLPP
If lRet .And. lMT120OK
    lRet120OK := ExecBlock("MT120OK",.F.,.F.)
    If Valtype( lRet120OK ) == "L"
        lRet := lRet120OK
    EndIf
EndIf

Duas coisas que importam:

  1. O ponto só é chamado se lRet ainda for .T.. Cabeçalho, condição de pagamento, linhas, permissões, bloqueio contábil e as validações do módulo de planejamento e controle orçamentário já passaram. Retornar .T. aqui não desfaz uma reprovação do padrão, ao contrário do que acontece no MT410TOK.
  2. Só retorno lógico vale. Se a função terminar sem Return explícito, ou devolver Nil ou outro tipo, o padrão segue como se estivesse tudo certo. Por isso o Return precisa ser sempre um lógico.

Depois do MT120OK o padrão ainda executa outras checagens, como a de adiantamentos, então um .T. seu não significa que o pedido será gravado.

O que ele recebe

Nada em PARAMIXB. A chamada não envia array, então o ponto trabalha com o que já está em memória na tela do pedido: as variáveis de memória do cabeçalho (M->C7_...) e o grid em aHeader e aCols. Localize a coluna pelo nome do campo, nunca pela posição, e ignore a linha deletada, que o padrão testa na última posição de cada linha de aCols:

ADVPL / TLPP
nPosQtd := aScan(aHeader, {|x| AllTrim(x[2]) == "C7_QUANT"})
lDeletada := aCols[nX][Len(aCols[nX])]

Como não há operação em PARAMIXB, use as variáveis INCLUI e ALTERA para restringir a regra, como o próprio padrão faz nesta função.

Exemplo

Regra de exemplo: o pedido não confirma se algum item ativo estiver com quantidade ou preço zerados.

ADVPL / TLPP
#Include "Protheus.ch"

/*/{Protheus.doc} MT120OK
Executado em A120TudOk(), ao confirmar o pedido de compra e antes de gravar.
Bloqueia item ativo sem quantidade ou sem preço.
@type user function
@return logical, .F. impede a confirmação
/*/
User Function MT120OK()

    Local lRet     := .T.
    Local nPosQtd  := aScan(aHeader, {|x| AllTrim(x[2]) == "C7_QUANT"})
    Local nPosPrc  := aScan(aHeader, {|x| AllTrim(x[2]) == "C7_PRECO"})
    Local nX       := 0

    // Só inclusão e alteração. Em outra operação a regra não se aplica.
    If !(INCLUI .Or. ALTERA)
        Return .T.
    EndIf

    If nPosQtd == 0 .Or. nPosPrc == 0
        Return .T.
    EndIf

    For nX := 1 To Len(aCols)
        // Última posição de cada linha é o flag de deletada
        If aCols[nX][Len(aCols[nX])]
            Loop
        EndIf

        If aCols[nX][nPosQtd] <= 0 .Or. aCols[nX][nPosPrc] <= 0
            // Sem mensagem, o OK parece travado.
            Help(" ", 1, "MT120OK",, ;
                "Item " + cValToChar(nX) + " sem quantidade ou sem preço.", 1, 0)
            lRet := .F.
            Exit
        EndIf
    Next

Return lRet

Armadilhas

Retornar .F. sem mensagem. O padrão não exibe nada em nome do seu ponto. Sem Help() ou equivalente, o usuário clica em OK e nada acontece.

Retornar algo que não seja lógico. É ignorado em silêncio. Não é bloqueio.

Abrir diálogo na rotina automática. A rotina automática também passa pela A120TudOk(). O padrão testa l120Auto antes de abrir telas próprias; faça o mesmo se a sua regra usar MsgYesNo ou Aviso.

Usar PARAMIXB. Não existe aqui. O que parece ser PARAMIXB é o conteúdo de outro ponto; veja PARAMIXB: o array que às vezes não é seu.

Esperar que ele rode quando o pedido já foi reprovado. Se o padrão barrou antes, o ponto nem é chamado. Para depurar, confirme primeiro que o pedido chegou até ele; veja Meu ponto de entrada executou?.

Os vizinhos

PEMomentoRetorno é usado?
MT120TELMontagem da telaVer o artigo
MT120OKAo confirmar, validação do pedido inteiro, sem PARAMIXBSim, se lógico
MT120GRVDepois do OK da tela, antes de gravar, com PARAMIXB de número e operaçãoSim, .F. cancela

No botão OK da tela, o padrão primeiro exige a validação do grid (TudoOk, onde está o MT120OK) e só então segue para a gravação, onde o MT120GRV é chamado. Se a sua regra precisa saber a operação e o número do pedido por parâmetro, o lugar é o MT120GRV; se ela depende só do conteúdo da tela, é o MT120OK.

Continue por aqui