Adicionar validação no campo F1_CHVNFE

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:

  1. 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
  2. É capturado a informação de todos os objetos da tela através da GetWndDefault() e do atributo aControls
  3. É feito um laço de repetição, percorrendo todos os objetos
  4. 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
  5. Vamos converter o bloco de código para uma string através da função GetCBSource()
  6. 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()
  7. 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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação