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.
Boa tarde. Essa validação é no botão de confirmar, ID modelpos…teria como fazer isso na própria linha da tabela de preço, ao digitar o código do produto por exemplo, para não deixar incluir o mesmo produto duas vezes na tabela. Hoje no padrão ele olha o produto+vigencia para validar.
Obrigado
Bom dia Mauricio, tudo joia?
Sim, você pode usar o trecho FORMLINEPOS para fazer a validação da linha (igual o LinOk).
Uma outra forma também, é fazer direto na validação do campo, ou adicionando uma função customizada (que retorne .T. ou .F.). Ou tentando usar a ExistChav apontando para as informações da grid.
Tenha uma ótima e abençoada quarta feira.
Um forte abraço.