Pragiva — Tecnologia na prática

MT120TEL o ponto de entrada da tela do Pedido de Compra

MT120TEL não é ponto de aprovação nem de bloqueio: entrega a janela do pedido (oDlg) e as colunas do cabeçalho para um campo novo.

Desenvolvimento Referência técnica 4 min de leitura

Assista o vídeo

MT120TEL em resumo

Onde fica
função A120Pedido(), do MATA120 (Pedido de Compra e Autorização de Entrega).
Quando dispara
depois que o padrão desenha os campos do cabeçalho na janela e antes de criar o grid de itens e os folders do rodapé.
PARAMIXB
{oDlg, aPosGet, aObj, nOpcx, nReg, aDlgFields} — seis posições.
Retorno
ignorado. O padrão chama o ponto de entrada e não lê o que ele devolve.
Serve para bloquear?
Não. Ele existe para acrescentar objetos de tela.
Consulta rápida5 seções

Se você chegou aqui procurando um ponto de aprovação ou de alçada, este não é ele: o MT120TEL não recebe dados de aprovação nem tem como interromper a operação pelo retorno. O nome vem de “tela”.

Para o mecanismo geral de ponto de entrada, veja Ponto de entrada no Protheus.

Como o padrão chama

ADVPL / TLPP
If lMt120TEL
    ExecBlock("MT120TEL",.F.,.F.,{@oDlg, aPosGet, aObj, nOpcx, nReg, @aDlgFields} )
EndIf

A variável lMt120TEL vem de ExistBlock("MT120TEL"), avaliada no início da função. Não há captura de retorno: nada do que a User Function devolver muda o fluxo.

A chamada está dentro do trecho que só monta a janela quando !l120Auto .Or. lWhenGet. Numa rotina automática comum, sem lWhenGet, a janela não é construída e o MT120TEL não é executado. Não há condição sobre nOpcx na chamada, então, quando a janela existe, o ponto de entrada dispara seja qual for a operação; se a regra vale só para uma delas, teste nOpcx no seu fonte.

O que ele recebe

PosiçãoConteúdo
PARAMIXB[1]oDlg: a janela do pedido, onde você cria os novos objetos
PARAMIXB[2]aPosGet: colunas de tela do cabeçalho, uma linha do array por faixa de campos
PARAMIXB[3]aObj: array reservado pelo padrão para os objetos dos folders; os folders só são criados depois desta chamada, então não conte com objetos nele
PARAMIXB[4]nOpcx: a opção da rotina. O fonte trata 3 como inclusão e 5 como exclusão
PARAMIXB[5]nReg: o parâmetro nReg da função A120Pedido()
PARAMIXB[6]aDlgFields: lista de pares {campo, variável} dos campos do cabeçalho

Duas coisas para notar:

  • aPosGet só traz colunas. As linhas do cabeçalho o padrão calcula a partir de aPosObj, que é variável local da função e não vai no PARAMIXB. A coordenada vertical do seu campo é decisão sua, e você acerta olhando a tela. Se o problema for o tamanho da área do cabeçalho, quem recebe e devolve aPosObj é o MT120GET, que roda antes.
  • aDlgFields tem um formato claro. O padrão preenche com pares de texto, como {"C7_NUM","cA120Num"}: nome do campo e nome da variável de tela que guarda o valor. Um campo de cabeçalho que você criar pode entrar na lista seguindo o mesmo par.

Sobre como a posição e o tipo do PARAMIXB mudam de um ponto de entrada para outro, veja PARAMIXB: o array que às vezes não é seu.

Exemplo

O exemplo desenha, no cabeçalho, um campo somente leitura com o nome do usuário logado. Ele não grava nada.

ADVPL / TLPP
#Include "Protheus.ch"

/*/{Protheus.doc} MT120TEL
Executado em A120Pedido(), depois dos campos do cabeçalho e antes do grid.
Acrescenta um campo informativo (somente leitura) ao cabeçalho do pedido.
@type user function
/*/
User Function MT120TEL()

    Local oDlg    := Nil
    Local aPosGet := {}
    Local nOpcx   := 0
    Local cInfo   := ""
    Local nLin    := 52   // provisório: ajuste olhando a tela

    If Type("PARAMIXB") <> "A" .Or. Len(PARAMIXB) < 4
        Return Nil
    EndIf

    oDlg    := PARAMIXB[1]
    aPosGet := PARAMIXB[2]
    nOpcx   := PARAMIXB[4]

    If ValType(oDlg) <> "O" .Or. ValType(aPosGet) <> "A"
        Return Nil
    EndIf

    // Só na inclusão; nas demais operações, a tela segue como está.
    If nOpcx <> 3
        Return Nil
    EndIf

    cInfo := PadR(cUserName, 25)

    @ nLin+1, aPosGet[2,1] SAY   "Digitado por" OF oDlg PIXEL SIZE 040,006
    @ nLin,   aPosGet[2,2] MSGET cInfo WHEN .F.  OF oDlg PIXEL SIZE 090,006

Return Nil

Pontos do exemplo:

  • Valida PARAMIXB antes de usar; se a chamada vier diferente do esperado, a tela abre normal.
  • Return Nil é suficiente, porque o padrão não lê o retorno.
  • nLin é um valor provisório. Use as colunas do aPosGet (elas acompanham a resolução), mas acerte a linha na tela do seu ambiente e confira se o campo não cai em cima de outro.
  • Guardar o valor digitado num campo customizado exige tratar a gravação do pedido em outro ponto; o MT120TEL só desenha.

Armadilhas específicas

Esperar bloquear a operação. Retornar .F. aqui não faz nada. Regra de validação vai para um ponto que use o retorno.

Tratar aPosGet como coordenadas completas. Ele traz colunas, não linhas. Copiar o valor de linha de outro fonte quebra em resolução diferente.

Achar que roda em toda execução. Sem janela (rotina automática comum), o ponto de entrada não é chamado. Regra que precisa valer também na rotina automática não pode depender dele.

Criar o objeto e esquecer a variável. O objeto MSGET precisa de uma variável que continue viva enquanto a janela existe e de outro ponto para gravar o conteúdo.

Quando outro ponto de entrada é mais adequado

Na mesma função, na ordem em que aparecem no fonte:

Ponto de entradaRecebeQuando dispara
MT120GET{aPosObj, nOpcx}Antes do cabeçalho: devolve aPosObj redefinido. Usado para mudar as coordenadas da área
MT120TELver tabela acimaDepois dos campos do cabeçalho; acrescenta objetos
MT120FOL{nOpcx, aPosGet}Depois de criar os folders do rodapé; o comentário do padrão o descreve para incluir folders, usado em conjunto com o MT120TEL e a variável aTitles
MT120SCRoDlg (por referência)No fim da montagem, depois dos folders

Se o que você precisa é de um folder novo no rodapé, o caminho é o MT120FOL. Se precisa só de um objeto solto na tela, MT120SCR entrega o oDlg mais tarde, quando os folders já existem; o MT120TEL é a escolha quando o objeto tem de estar criado antes do grid e dos folders.

Continue por aqui