No artigo de hoje, vamos demonstrar como em um ponto de entrada em MVC, percorrer os dados de uma grid e validar dois campos distintos.
Se você precisar percorrer uma grid num p.e. MVC e validar dois campos diferentes linha a linha, montamos esse exemplo que pode ajudar no seu cenário.
Nele vamos usar a rotina MATA061, do cadastro de Produtos x Fornecedor (tabela SA5). E como vai ser a lógica:
- No ponto de entrada, vamos usar o trecho FORMPOS (o famoso TudoOk da rotina, ao clicar no botão confirmar, fazer as validações)
- Vamos capturar o modelo ativo em memória com FWModelActive
- Depois vamos capturar o modelo da grid, com nome MdGridSA5
- Nisso será feito um laço de repetição com a quantidade de linhas (método Length)
- A cada linha vai ser posicionada (método GoLine)
- Se o campo A5_LOTEMIN estiver preenchido, o campo A5_UNID também tem que estar
- Caso um campo esteja preenchido e o outro vazio, vai ser marcado o retorno como .F., e exibido uma mensagem de falha e encerrado o laço
Abaixo o código fonte conforme a lógica descrita acima:
//Bibliotecas
#Include "Totvs.ch"
/*/{Protheus.doc} User Function MATA061
Produtos x Fornecedores
@author Atilio
@since 23/10/2024
@version 1.0
@type function
@obs Codigo gerado automaticamente pelo Autumn Code Maker
*-------------------------------------------------*
Por se tratar de um p.e. em MVC, salve o nome do
arquivo diferente, por exemplo, MATA061_pe.prw
*-----------------------------------------------*
A documentacao de como fazer o p.e. esta disponivel em https://tdn.totvs.com/pages/releaseview.action?pageId=208345968
@see http://autumncodemaker.com
/*/
User Function MATA061()
Local aArea := FWGetArea()
Local aParam := PARAMIXB
Local xRet := .T.
Local oObj := Nil
Local cIdPonto := ""
Local cIdModel := ""
Local nLinha := 0
Local oModelPad
Local oModelGrid
//Se tiver parametros
If aParam != Nil
//Pega informacoes dos parametros
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
//Na validacao total do formulario
If cIdPonto == "FORMPOS"
oModelPad := FWModelActive()
oModelGrid := oModelPad:GetModel("MdGridSA5")
For nLinha := 1 To oModelGrid:Length()
oModelGrid:GoLine(nLinha)
//Se o campo A estiver preenchido, mas o campo B estiver vazio
If ! Empty(oModelGrid:GetValue("A5_LOTEMIN")) .And. Empty(oModelGrid:GetValue("A5_UNID"))
xRet := .F.
ExibeHelp("HELP_MATA061", "Falha na linha " + cValToChar(nLinha), "Quando for informado o Lote Minimo, informe também a Unidade!")
Exit
EndIf
Next
EndIf
EndIf
FWRestArea(aArea)
Return xRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.