No artigo de hoje, vamos demonstrar em como adicionar uma validação no campo F1_CHVNFE através de ponto de entrada.
Pessoal, só fazendo um adendo antes de iniciar o artigo, eu pesquisei e não encontrei uma forma de adicionar uma validação direto no campo F1_CHVNFE, mesmo colocando na validação de usuário (X3_VLDUSER), o sistema não passava pela User Function.
Por isso, foi optado por fazer via ponto de entrada, pois nesse cenário, o cliente tinha solicitado criar uma tratativa, para que logo após o usuário informar a chave de acesso, disparasse uma customização.
Então a lógica feita foi a seguinte:
- Foi usado o ponto de entrada MA103BUT, que é acionado no carregamento da tela do documento de entrada, para adicionar opções extras no Outras Ações da tela de manutenção
- É capturado a informação de todos os objetos da tela através da GetWndDefault() e do atributo aControls
- É feito um laço de repetição, percorrendo todos os objetos
- Onde tiver ReadVar e encontrar que tem help de campo apontando para o F1_CHVNFE, pega a informação de validação do campo através do atributo bValid
- Vamos converter o bloco de código para uma string através da função GetCBSource()
- Vamos adicionar nesse bloco de código, o acionamento de uma função customizada antes desse bloco, que vai ser a nossa customizada u_zVldChv()
- Depois basta adicionarmos a lógica na zVldChv()
Abaixo o código fonte desenvolvido conforme a lógica acima:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function MA103BUT
Ponto de entrada para adicionar outras ações na tela de Documento de Entrada
@type Function
@author Atilio
@since 04/12/2024
@see https://tdn.totvs.com/pages/releaseview.action?pageId=102269141
/*/
User Function MA103BUT()
Local aButtons := {}
//Percorre os objetos da tela
If ! IsBlind()
fPercCampos()
EndIf
Return aButtons
Static Function fPercCampos()
Local aArea := GetArea()
Local nAtual := 0
Local cBlocoCod := ""
//Variáveis de controle
Private nAtuPvt := 0
Private oPai := GetWndDefault()
Private aControles := oPai:aControls
//Percorrendo os objetos criados da tela
For nAtual := 1 To Len(aControles)
nAtuPvt := nAtual
//Se tiver variável e descrição
If Type("aControles[nAtuPvt]:cReadVar") != "U" .And. Type("aControles[nAtuPvt]:cSX1Hlp") != "U"
//Se tiver ReadVar e for do campo F1_CHVNFE
If ! Empty(aControles[nAtuPvt]:cSX1Hlp) .And. Upper(aControles[nAtuPvt]:cSX1Hlp) == "F1_CHVNFE"
//Captura o bloco de código
cBlocoCod := GetCBSource(aControles[nAtuPvt]:bValid)
//Muda o refresh individual (para não dar variable does not exist), para acionar no lugar a GetDRefresh()
cBlocoCod := StrTran(cBlocoCod, "AOBJETOS[13]:REFRESH()", "GETDREFRESH()")
//Adiciona a nossa função customizada para ver se já foi lançado a chave da nota
cBlocoCod := "{|| Iif(u_zVldChv(), eVal(" + cBlocoCod + "), .F.)}"
//Atualiza a validação do campo
aControles[nAtuPvt]:bValid := &(cBlocoCod)
EndIf
EndIf
Next
RestArea(aArea)
Return
/*/{Protheus.doc} zVldChv
Função que valida ao digitar a chave de acesso
@type user function
@author Atilio
@since 04/12/2024
/*/
User Function zVldChv()
Local aArea := FWGetArea()
Local aAreaSF1 := SF1->(FWGetArea())
Local lRet := .T.
Local cChaveNfe := &(ReadVar())
//Se não tiver vazio a chave
If ! Empty(cChaveNfe)
//to-do : aqui você adiciona sua customização para validar a variável cChaveNfe
// caso precise abortar a operação, defina o lRet como .F.
EndIf
FWRestArea(aAreaSF1)
FWRestArea(aArea)
Return lRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.