Pragiva — Tecnologia na prática

MT120GRV o ponto de entrada da gravação do Pedido de Compra

Dispara no MATA120 depois do OK da tela e antes da gravação. Recebe número e operação, e retornar .F. cancela inclusão, alteração ou exclusão do pedido.

Desenvolvimento Referência técnica 2 min de leitura

Assista o vídeo

MT120GRV em resumo

Onde fica
função A120Pedido, do MATA120 (Pedido de Compras).
Quando dispara
depois que o usuário confirma a tela e antes de qualquer gravação, só em inclusão, alteração ou exclusão. Em visualização não dispara.
PARAMIXB
{cNumPedido, lInclusao, lAlteracao, lExclusao, aAdiantamentos}.
Retorno
usado. Lógico .F. cancela a operação.
Serve para bloquear?
Sim, e ainda dá tempo: nada foi gravado.
Consulta rápida6 seções

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

O que chega em PARAMIXB

PosiçãoConteúdo
1Número do pedido ()
2.T. se for inclusão (a cópia de pedido também marca inclusão)
3.T. se for alteração
4.T. se for exclusão
5Array de adiantamentos selecionados para o pedido (vazio por padrão)

Só uma das três flags fica .T. por chamada. Como o array é montado pela rotina, confira o tipo antes de indexar; o cuidado geral está em PARAMIXB: o array que às vezes não é seu.

Como o retorno é tratado

O padrão só olha o retorno se ele for lógico. Se for .F., as três flags de operação são zeradas e a rotina não chama a gravação. Qualquer outro retorno (.T., Nil, texto) deixa o fluxo seguir. Por isso, retorne sempre .T. explicitamente no caminho feliz.

Na chamada que o fonte faz, não há mensagem ao usuário: quem bloqueia deve avisar (Help, MsgStop) dentro do próprio PE.

Onde ele cai no fluxo

  1. O usuário confirma a tela.
  2. O padrão trata transferência e aglutinação de pedidos; se falharem, a operação já é cancelada e o PE nem roda.
  3. MT120GRV.
  4. Se ainda houver operação ativa, inicia a gravação (preparo do fiscal e da contabilização, depois a gravação do pedido).

O PE roda antes do Begin Transaction desse trecho. Portanto, o que ele gravar não fica na transação do pedido. Prefira validar no PE e gravar em ponto posterior.

Exemplo: impedir exclusão de pedido já atendido

Regra de exemplo, com nomes neutros: bloquear a exclusão se algum item já teve quantidade entregue (). Ela só exemplifica o mecanismo; o padrão pode ter validações próprias.

ADVPL / TLPP
#Include "Protheus.ch"

User Function MT120GRV()
	Local cNumPed   := PARAMIXB[1]
	Local lExclusao := PARAMIXB[4]
	Local aArea     := GetArea()
	Local aAreaSC7  := SC7->(GetArea())
	Local lRet      := .T.

	If lExclusao
		SC7->(DbSetOrder(1))
		If SC7->(MsSeek(xFilial("SC7") + cNumPed))
			While !SC7->(Eof()) .And. SC7->C7_FILIAL + SC7->C7_NUM == xFilial("SC7") + cNumPed
				If SC7->C7_QUJE > 0
					lRet := .F.
					Exit
				EndIf
				SC7->(DbSkip())
			EndDo
		EndIf

		If !lRet
			MsgStop("Pedido " + cNumPed + " tem itens já entregues e não pode ser excluído.", "Exclusão bloqueada")
		EndIf
	EndIf

	RestArea(aAreaSC7)
	RestArea(aArea)
Return lRet

Repare no RestArea: o PE roda com a posicionada pela rotina, e mover o ponteiro sem restaurar altera o que vem depois.

A armadilha: retornar .F. sem explicar

No trecho da chamada, o padrão não exibe mensagem ao cancelar. Um .F. sem aviso deixa o usuário sem saber o motivo. Toda regra de bloqueio precisa da própria mensagem.

Alçada e aprovação

A pauta associa este PE a alçada, mas a chamada não confirma isso: ele não recebe dado de aprovação e roda antes da gravação. Se o objetivo é regra de alçada, este artigo não sustenta o PE como o lugar certo.

Continue por aqui