Preencher o aCols de uma tela padrão | Ti Responde 048

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. JOSE EULALIO SOARES DOS SANTOS disse:

    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.

  2. Alexandre Behling disse:

    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.

Deixe uma resposta