Função que altera conteúdo de perguntas (MV_PAR) em AdvPL

Função que altera conteúdo de perguntas (MV_PAR) em AdvPL

Olá pessoal…

Hoje vou mostrar uma função criada em AdvPL para alterar o conteúdo dos parâmetros antes de mostrar a tela de Pergunte.

AdvPL
AdvPL

Imagine que você criou um relatório de pedido de venda, chamado no Ações Relacionadas do Pedido, e na tela de Pergunte, tem um parâmetro Pedido De e outro Pedido Até, mas o usuário quer que a pergunta já venha preenchida, como fazer então para resolver?

A princípio é só alterar o X1_CNT01 da pergunta, porém se o usuário estiver utilizando o Profile, ficará ou na SXK ou no próprio Profile, pensando nisso, criei uma rotina que ao chamar, você passa o conteúdo do parâmetro antes da pergunta, funcionaria dessa forma:

//...
u_zAtuPerg("SUAPERG", "MV_PAR01", "000001") //Pedido De
u_zAtuPerg("SUAPERG", "MV_PAR02", "000001") //Pedido Até

//...

Dessa forma ao chamar o Pergunte, os parâmetros já vem com o conteúdo padrão estabelecido.

Abaixo o código fonte desenvolvido.

//Bibiliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zAtuPerg
Função que atualiza o conteúdo de uma pergunta no X1_CNT01 / SXK / Profile
@author Atilio
@since 06/10/2016
@version 1.0
@type function
	@param cPergAux, characters, Código do grupo de Pergunta
	@param cParAux, characters, Código do parâmetro
	@param xConteud, variavel, Conteúdo do parâmetro
	@example u_zAtuPerg("LIBAT2", "MV_PAR01", "000001")
/*/

User Function zAtuPerg(cPergAux, cParAux, xConteud)
	Local aArea      := GetArea()
	Local nPosCont   := 8
	Local nPosPar    := 14
	Local nLinEncont := 0
	Local aPergAux   := {}
	Default xConteud := ''
	
	//Se não tiver pergunta, ou não tiver ordem
	If Empty(cPergAux) .Or. Empty(cParAux)
		Return
	EndIf
	
	//Chama a pergunta em memória
	Pergunte(cPergAux, .F., /*cTitle*/, /*lOnlyView*/, /*oDlg*/, /*lUseProf*/, @aPergAux)
	
	//Procura a posição do MV_PAR
	nLinEncont := aScan(aPergAux, {|x| Upper(Alltrim(x[nPosPar])) == Upper(cParAux) })
	
	//Se encontrou o parâmetro
	If nLinEncont > 0
		//Caracter
		If ValType(xConteud) == 'C'
			&(cParAux+" := '"+xConteud+"'")
		
		//Data
		ElseIf ValType(xConteud) == 'D'
			&(cParAux+" := sToD('"+dToS(xConteud)+")'")
			
		//Numérico ou Lógico
		ElseIf ValType(xConteud) == 'N' .Or. ValType(xConteud) == 'L'
			&(cParAux+" := "+cValToChar(xConteud)+"")
		
		EndIf
		
		//Chama a rotina para salvar os parâmetros
		__SaveParam(cPergAux, aPergAux)
	EndIf
	
	RestArea(aArea)
Return

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

4 comentários em “Função que altera conteúdo de perguntas (MV_PAR) em AdvPL

    1. Cara… sou eu novamente…

      Me permita apenas fazer uma correção em sua função zAtuPerg:

      Onde está:
      ElseIf ValType(xConteud) == ‘D’
      &(cParAux+” := sToD(“+dToS(xConteud)+”)”)

      Necessita de uma “aspas” na conversão da função dToS() da seguinte forma:

      ElseIf ValType(xConteud) == ‘D’
      &(cParAux+” := sToD( ‘ “+dToS(xConteud)+” ‘ )”)

      Obs.Claro que sem estes espaços adicionais que coloquei apenas para destacar a correção.

      Valeu amigo!!

Deixe uma resposta

%d blogueiros gostam disto: