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).
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.
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.
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.
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.