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.



