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.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

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.

8 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!!

  1. Olá, boa tarde!

    Dan_Atilio, será que você consegue me ajudar?
    Estou tentando utilizar tua função mas é apresentado o erro “variable does not exist CACESSO on VERSENHA(MSLIB.PRW)”. Tem ideia do que pode ser?

    1. Boa noite Fátima, tudo bem?
      Você está executando no programa inicial, ou em menu do Protheus?
      Tente executar pelo menu do Protheus, seja pelo Fórmulas ou adicionando como opção de menu. É que provavelmente ao executar via programa inicial ou via debug, você teria que adaptar a rotina com RPCSetEnv.
      Qualquer dúvida, fico à disposição.

Deixe uma resposta

%d blogueiros gostam disto: