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.
Olá boa tarde tudo bem eu preciso fazer algo parecido na tabela SC7 , porém estou com dúvida
//Pegando os modelos de dados
oModelPad := FWModelActive()
oModelGrid := oModelPad:GetModel(‘DA1DETAIL’)
cCodTab := oModelPad:GetValue(“DA0MASTER”, “DA0_CODTAB”)
para alterar DA0MASTER , por exemplos seria SC7MASTER , “C7_PRODUTO” ?
poderia me ajudar ?
Bom dia Leonardo, tudo joia?
Esses dias perguntaram algo parecido no nosso grupo do WhatsApp ( https://terminaldeinformacao.com/grupo-no-whatsapp/ ), e o que acontece é que a tela de Pedido de Compras, a MATA120 / MATA121, é que ela não esta em MVC. Segue trecho da resposta que demos no grupo:
[…]
Você tem que fazer da forma antiga, fazendo um For percorrendo a variável aCols da memória.
Ai para pegar as colunas, você pode usar a GDFieldPos para pegar a posição dela. Por exemplo:
nPosProd := GDFieldPos(“C7_PRODUTO”)
For nLinha := 1 To Len(aCols)
Alert(“produto ” + aCols[nLinha][nPosProd])
Next
Abaixo alguns links de apoio sobre o assunto:
O que é aHeader e aCols – https://terminaldeinformacao.com/2021/09/29/afinal-o-que-e-aheader-e-acols/
Preencher aCols de uma tela padrão – https://terminaldeinformacao.com/2023/03/20/preencher-o-acols-de-uma-tela-padrao-ti-responde-048/
Exemplo de funções de apoio (como a citada GDFieldPos): https://terminaldeinformacao.com/2024/02/28/usando-as-gddeleted-gdfieldget-gdfieldpos-gdfieldput-e-getdrefresh-maratona-advpl-e-tl-262/
[…]
Um grande abraço.