No vídeo de hoje, vamos demonstrar em como replicar informações em várias linhas de uma tela que utiliza aCols.
A dúvida de hoje foi do grande Gilberto, onde ele perguntou como poderia fazer um recurso onde replicasse uma informação em todas as linhas de uma tela que usa aCols.
Pensando nisso montamos um exemplo onde ao clicar em Outras Ações, existe uma opção para replicar a informação em todas as linhas (foi usado como exemplo a tela de Documento de Entrada – MATA103).
E abaixo o código fonte desenvolvido para exemplificar:
//Bibliotecas #Include "TOTVS.ch" /*/{Protheus.doc} User Function MA103BUT Ponto de Entrada para adicionar uma opção dentro do outras ações do Documento de Entrada @type Function @author Atilio @since 26/07/2021 @see https://tdn.totvs.com/pages/releaseview.action?pageId=102269141 /*/ User Function MA103BUT() Local aArea := FWGetArea() Local aAreaF1 := SF1->(FWGetArea()) Local aAreaD1 := SD1->(FWGetArea()) Local aBotao := {} aAdd( aBotao, { "BUDGETY" , { || u_zVid0048() } , "* Alt. Alíquota IPI" } ) FWRestArea(aAreaD1) FWRestArea(aAreaF1) FWRestArea(aArea) Return aBotao /*/{Protheus.doc} User Function zVid0048 Função que altera a alíquota do IPI de todas as linhas, conforme digitado numa tela de parâmetro @type Function @author Atilio @since 26/07/2021 @version version /*/ User Function zVid0048() Local aArea := GetArea() Local nBkp := n Local cCampo := "D1_IPI" Local nPosAliq := GDFieldPos(cCampo) Local nAliqNov := 0 Local cVldSis := GetSX3Cache(cCampo, "X3_VALID") Local cVldUsr := GetSX3Cache(cCampo, "X3_VLDUSER") Local aPergs := {} Local nAtual := 0 Local lValidou := .T. //Adiciona os parâmetros que serão exibidos aAdd(aPergs, {1, "Aliq. ICMS", nAliqNov, PesqPict("SD1", cCampo), "Positivo()", "", ".T.", 80, .T.}) //Se a pergunta for confirmada If ParamBox(aPergs, "Informe os parâmetros", , , , , , , , , .F., .F.) nAliqNov := MV_PAR01 //Percorre todas as linhas da grid For nAtual := 1 To Len(aCols) lValidou := .T. //Altera a linha posicionada na memória n := nAtual //Altera o ReadVar da Memória __ReadVar := "M->" + cCampo M->D1_IPI := nAliqNov //Chama a validação do sistema If ! Empty(cVldSis) lValidou := &(cVldSis) EndIf //Chama a validação de usuário If ! Empty(cVldUsr) .And. lValidou lValidou := &(cVldUsr) EndIf //Se deu certo as validações If lValidou //Altera a informação de alíquota direto no aCols aCols[n][nPosAliq] := nAliqNov //Chama gatilho caso exista If ExistTrigger(cCampo) RunTrigger( ; 2,; //nTipo (1=Enchoice; 2=GetDados; 3=F3) n,; //Linha atual da Grid quando for tipo 2 Nil,; //Não utilizado ,; //Objeto quando for tipo 1 cCampo; //Campo que dispara o gatilho ) EndIf EndIf Next EndIf n := nBkp GetDRefresh() RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Muito bom o artigo, parabéns! Seria legal fazer um sobre simular manter o aCols preenchido em rotinas em MVC. Existem muitos lugares que tem dificuldade em atualizar suas rotinas pq boa parte do dicionário e rotinas auxiliares estão usando aHeader e aCols e não atualizam para MVC, pois teriam que atualizar o dicionário e todas essas rotinas de uma vez só para dar certo.
Bom dia José, tudo bem?
Primeiramente obrigado pelo comentário e feedback, é muita generosidade sua.
Nesse artigo nós demonstramos em como percorrer uma grid em MVC – https://terminaldeinformacao.com/2022/08/15/como-percorrer-uma-grid-em-mvc-ti-responde-017/
Ai para alterar um valor é só usar o método SetValue ao invés do GetValue.
Se você quiser também, damos uma aprofundada sobre nas aulas 31, 35, 38 e 43 no nosso curso de MVC – https://terminaldeinformacao.com/2022/04/22/curso-mvc-em-advpl/
Grande abraço.
Uma dica, como não muda o campo dentro do laço pode checar se tem gatilho apenas uma vez fora do laço e gravar numa variável lógica, então caso seja True é só executar o o gatilho sem precisar toda vez verificar no dicionário se tem o gatilho.
Fala Alexandre, boa tarde, tudo joia?
Opa, ótima dica.
Obrigado pela contribuição jovem.
Grande abraço.