Como percorrer uma grid em MVC | Ti Responde 017

Hoje iremos responder a dúvida de como fazer um laço de repetição, percorrendo os dados de uma grid MVC em AdvPL.

Hoje, a dúvida foi feita pelo grande Flávio, onde ele perguntou como poderia percorrer uma grid em MVC.

Pois antigamente era só fazer um for no aCols da Grid. Agora, o procedimento é parecido, onde interceptamos a Grid, buscamos o tamanho e percorremos linha a linha dos dados inseridos.

E abaixo o código fonte desenvolvido para exemplificar:

//Bibliotecas
#Include "Totvs.ch"
 
/*/{Protheus.doc} User Function OMSA010
P.E. Tabela de Preço de Produtos
@author Atilio
@since 08/02/2022
@version 1.0
@type function
@obs Por se tratar de um p.e. em MVC, salve o nome do 
     arquivo diferente, por exemplo, OMSA010_pe.prw 
     *-----------------------------------------------*
     A documentacao de como fazer o p.e. esta disponivel em https://tdn.totvs.com/pages/releaseview.action?pageId=208345968 
/*/
 
User Function OMSA010()
    Local aArea := GetArea()
    Local aParam := PARAMIXB 
    Local xRet := .T.
    Local oObj := Nil
    Local cIdPonto := ""
    Local cIdModel := ""
    //Variáveis usadas na tratativa de percorrer a grid
    Local nLinha     := 0
    Local aAreaDA1   := {}
    Local aSaveLines := {}
    Local nAlterados := 0
    Local oModelPad  := Nil
    Local oModelGrid := Nil
    Local cCodTab    := ""
    Local cMensagem  := ""
     
    //Se tiver parametros
    If aParam != Nil
         
        //Pega informacoes dos parametros
        oObj := aParam[1]
        cIdPonto := aParam[2]
        cIdModel := aParam[3]
         
        //Validação ao clicar no Botão Confirmar
        If cIdPonto == "MODELPOS"
            xRet := .T.
 
            //Define as variáveis que serão usadas
            aAreaDA1   := DA1->(FWGetArea())
            aSaveLines := FWSaveRows()
            nAlterados := 0
 
            //Pegando os modelos de dados
            oModelPad  := FWModelActive()
            oModelGrid := oModelPad:GetModel('DA1DETAIL')
            cCodTab    := oModelPad:GetValue("DA0MASTER", "DA0_CODTAB")
 
            DbSelectArea("DA1")
            DA1->(DbSetOrder(3)) //DA1_FILIAL + DA1_CODTAB + DA1_ITEM
             
            //Percorrendo a grid com os itens
            For nLinha := 1 To oModelGrid:Length()
 
                //Posicionando na linha atual
                oModelGrid:GoLine(nLinha)
                 
                //Se a linha tiver deletada, irá armazenar a data e o usuário de alteração
                If oModelGRID:IsDeleted()
                    /* ... */
 
                //Senão, se não for inserção
                ElseIf ! oModelGRID:IsInserted()
                     
                    //Posiciona na tabela DA1
                    DA1->(DbSeek(FWxFilial('DA1') + cCodTab + oModelGrid:GetValue("DA1_ITEM") ))
 
                    //Se o campo de preço estiver diferente
                    If DA1->DA1_PRCVEN != oModelGrid:GetValue("DA1_PRCVEN")
                        nAlterados++
                    EndIf
                EndIf
            Next
 
            //Se houve alteração de linhas
            If nAlterados != 0
                cMensagem := "Das [" + cValToChar(oModelGrid:Length()) + "] linhas, foram alterados [" + cValToChar(nAlterados) + "] registros!"
                FWAlertInfo(cMensagem, "Atenção")
            EndIf
 
            FWRestRows(aSaveLines)
            FWRestArea(aAreaDA1)
        EndIf
         
    EndIf
     
    RestArea(aArea)
Return xRet

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta