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.