Como fazer validações em um ParamBox

No artigo de hoje vou demonstrar 4 exemplos de validações e gatilhos em um ParamBox.

Geralmente alguns alunos me perguntam como fazer validações em um ParamBox, então nesse exemplo, irei mostrar 4 cenários e exemplos de como realizar esses itens.

1. Validar o conteúdo do parâmetro

Nessa validação, você pode acionar diretamente na digitação do parâmetro, usando desde funções padrões (ExistCPO, Positivo, etc), como funções customizadas (u_SuaFuncao).

Exemplo de validação ao digitar valor negativo

Static Function fExemplo1()
    Local aPergs   := {}
    Local cProduto := Space(TamSX3('B1_COD')[01])
    Local nPercent := 0
    
    //Adiciona os parâmetros
    aAdd(aPergs, {1, "Código do Produto",      cProduto,  "",             "ExistCpo('SB1', &(ReadVar()))", "SB1", ".T.", 80,  .T.})
    aAdd(aPergs, {1, "Percentual de Aumento",  nPercent,  "@E 99.99",     "Positivo()",                    "",    ".T.", 40,  .T.})
    
    //Se a pergunta foi confirmada
    If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bOK*/, /*aButtons*/, /*lCentered*/, /*nPosX*/, /*nPosY*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        //MV_PAR01 -> contém código do produto
        //MV_PAR02 -> contém o percentual
    EndIf
Return

2. Validar ao clicar no botão confirmar

Já essa validação é acionada no botão confirmar, então você consegue verificar se algum MV está vazio, ou validar o conteúdo de algum outro.

Exemplo de validação customizada

Static Function fExemplo2()
    Local aPergs   := {}
    Local cProduto := Space(TamSX3('B1_COD')[01])
    Local nPercent := 0
    
    //Adiciona os parâmetros
    aAdd(aPergs, {1, "Código do Produto",      cProduto,  "",             "ExistCpo('SB1', &(ReadVar()))", "SB1", ".T.", 80,  .T.})
    aAdd(aPergs, {1, "Percentual de Aumento",  nPercent,  "@E 99.99",     "Positivo()",                    "",    ".T.", 40,  .T.})
    
    //Se a pergunta foi confirmada
    If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, {|| fValidOk()}, /*aButtons*/, /*lCentered*/, /*nPosX*/, /*nPosY*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        //MV_PAR01 -> contém código do produto
        //MV_PAR02 -> contém o percentual
    EndIf
Return

Static Function fValidOK()
    Local lRet := .T.
    Local nPercent := MV_PAR02

    //Se o percentual for maior que 20%, barra a continuidade
    If nPercent > 20
        MsgStop("O Percentual, não pode ser maior que 20%")
        lRet := .F.
    EndIf
Return lRet

3. “Gatilhar” uma informação de um parâmetro para outro usando linha de comando

Para preencher o valor de um parâmetro através de outro usando linha de comando, basta colocar entre parênteses na validação, e a última parte ser um .T., isso pode ser útil para parâmetros calculados.

Digitando uma data de vencimento e preenchendo automaticamente a data real

Static Function fExemplo3()
    Local aPergs   := {}
    Local dVencim  := sToD("")
    Local dVenReal := sToD("")
    
    //Adiciona os parâmetros
    aAdd(aPergs, {1, "Digite a data de vencimento",  dVencim,   "",     "(MV_PAR02 := DataValida(MV_PAR01), .T.)",  "",    ".T.", 60,  .T.})
    aAdd(aPergs, {1, "Vencimento será",              dVenReal,  "",     ".T.",                                      "",    ".F.", 60,  .T.})
    
    //Se a pergunta foi confirmada
    If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bOK*/, /*aButtons*/, /*lCentered*/, /*nPosX*/, /*nPosY*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        //MV_PAR01 -> contém a data de vencimento
        //MV_PAR02 -> contém a data de vencimento real
    EndIf
Return

4. “Gatilhar” uma informação de um parâmetro através de dados de uma tabela

Agora se você precisa preencher o parâmetro de forma mais elaborada, na validação do parâmetro de origem, acione uma User Function para preenchimento.

Digitando o produto e preenchendo a descrição

Static Function fExemplo4()
    Local aPergs   := {}
    Local cProduto := Space(TamSX3('B1_COD')[01])
    Local cDescri  := ""
    
    //Adiciona os parâmetros
    aAdd(aPergs, {1, "Código do Produto",      cProduto,  "",             "u_zVldSB1()", "SB1", ".T.", 70,   .T.})
    aAdd(aPergs, {1, "Descrição do Produto",   cDescri,   "",             ".T.",         "",    ".F.", 110,  .F.})
    
    //Se a pergunta foi confirmada
    If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bOK*/, /*aButtons*/, /*lCentered*/, /*nPosX*/, /*nPosY*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.)
        //MV_PAR01 -> contém código do produto
        //MV_PAR02 -> contém a descrição do produto
    EndIf
Return

/*/{Protheus.doc} User Function zVldSB1
Função para validar produto digitado
@type Function
@author Atilio
@since 10/06/2021
/*/

User Function zVldSB1()
    Local aArea := GetArea()
    Local lRet := .T.

    DbSelectArea('SB1')
    SB1->(DbSetOrder(1)) // Filial + Código

    //Se conseguir posicionar no produto, atualiza outros parâmetros
    If SB1->(DbSeek(FWxFilial('SB1') + MV_PAR01))
        MV_PAR02 := SB1->B1_DESC
    Else
        lRet := .F.
        MsgStop("Produto não encontrado!", "Atenção")
    EndIf

    RestArea(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