Função para editar um parâmetro com quebras / separação (; / , .) em AdvPL

Olá pessoal…

Por acaso, você já precisou editar um parâmetro com separação, como com barras ( / ) ou ponto e vírgula ( ; )? Veja essa função que facilita a edição de parâmetros com quebra em AdvPL (como o MV_ALIQICM).

Algumas das vezes precisamos editar algum parâmetro, ou até mesmo, ceder para algum usuário editar, agora imagine um parâmetro com várias separações, como é o caso do MV_ALIQICM, em que você tem várias alíquotas e você precisa de vez em quando adicionar uma nova.

Pensando nisso, foi criado uma rotina, em que você passa qual é o parâmetro e qual é o caracter de separação, e através disso, é montado uma tela para manutenção dos dados, conforme print abaixo.

Função para edição do parâmetro

Abaixo o fonte completo:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zParComma
Função para edição de um parâmetro (SX6) que tenha separadores como ponto e vírgula
@author Atilio
@since 25/05/2018
@version 1.0
@param cParametro, characters, Nome do Parâmetro
@param cSeparador, characters, Qual separador é utilizado
@type function
@example
	u_zParComma("MV_ALIQICM", "/")
/*/

User Function zParComma(cParametro, cSeparador)
	Local aArea        := GetArea()
	Local aDados       := ""
	Local nAtual       := 0
	Local nTamBtn      := 40
	Local oSayCont
	Local oGrpDados
	Local oGrpAcoes
	Local oBtnConf
	Local oBtnCanc
	Private lOk        := .F.
	Private cContNov   := ""
	Private oDlgPvt
	Private oGetCont
	Private cGetCont := ""
	Private oMsGetPar
	Private aHeadPar := {}
	Private aColsPar := {}
	Private nJanLarg := 0500
	Private nJanAltu := 0400
	//Parâmetros que vem pela função
	Default cParametro := ""
	Default cSeparador := ""
	
	//Se tiver parametro e separador
	If ! Empty(cParametro) .And. ! Empty(cSeparador)
		
		//Pega o conteúdo do parâmetro
		cGetCont := GetMV(cParametro)
		
		//Busca todos os dados quebrando pelo separador
		aDados := StrTokArr(cGetCont, cSeparador)
		
		//Monta o aHeader
		//Cabeçalho ...  Titulo       Campo          Mask    Tamanho   Dec   Valid  Usado  Tip  F3  CBOX
		aAdd(aHeadPar, { "Conteúdo",  "XX_CONTEUD",  "",     10,       0,    ".T.", ".T.", "C", "", ""})
		
		//Percorre as linhas, e adiciona no aCols
		For nAtual := 1 To Len(aDados)
			aAdd(aColsPar, {;
				aDados[nAtual],;
				.F.;
			})
		Next
		
		//Monta a tela
		DEFINE MSDIALOG oDlgPvt TITLE "Alteração do Parâmetro " + cParametro FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
			@ 008, 003 SAY   oSayCont PROMPT "Origem:" SIZE 030, 007 OF oDlgPvt PIXEL
			@ 005, 038 MSGET oGetCont  VAR cGetCont SIZE 160, 010 OF oDlgPvt PIXEL
			oGetCont:lReadOnly := .T.
			
			//Dados
			@ 020, 003 GROUP oGrpDados TO (nJanAltu/2)-28, (nJanLarg/2)-3 PROMPT "Dados: "	OF oDlgPvt COLOR 0, 16777215 PIXEL
				oMsGetPar := MsNewGetDados():New(;
					026,;                                        //nTop
					006,;                                        //nLeft
					(nJanAltu/2) - 31,;                          //nBottom
					(nJanLarg/2) - 6,;                           //nRight
					GD_INSERT + GD_DELETE + GD_UPDATE,;          //nStyle
					"AllwaysTrue()",;                            //cLinhaOk
					,;                                           //cTudoOk
					"",;                                         //cIniCpos
					{"XX_CONTEUD"},;                             //aAlter
					,;                                           //nFreeze
					999,;                                        //nMax
					,;                                           //cFieldOK
					,;                                           //cSuperDel
					,;                                           //cDelOk
					oDlgPvt,;                                    //oWnd
					aHeadPar,;                                   //aHeader
					aColsPar)                                    //aCols                                    
			
			//Ações
			@ (nJanAltu/2)-25, 003 GROUP oGrpAcoes TO (nJanAltu/2)-3, (nJanLarg/2)-3 PROMPT "Ações: "	OF oDlgPvt COLOR 0, 16777215 PIXEL
				@ (nJanAltu/2)-19, (nJanLarg/2)-((nTamBtn*1)+06) BUTTON oBtnConf PROMPT "Confirmar" SIZE nTamBtn, 013 OF oDlgPvt ACTION(fValidConf(cSeparador))     PIXEL
				@ (nJanAltu/2)-19, (nJanLarg/2)-((nTamBtn*2)+09) BUTTON oBtnCanc PROMPT "Cancelar"  SIZE nTamBtn, 013 OF oDlgPvt ACTION(oDlgPvt:End())    PIXEL
			
			oMsGetPar:oBrowse:SetFocus()
			
		//Ativando a janela
		ACTIVATE MSDIALOG oDlgPvt CENTERED
		
		//Se a rotina foi confirmada, atualiza o parâmetro
		If lOk
			PutMV(cParametro, cContNov)
		EndIf
	EndIf
	
	RestArea(aArea)
Return

/*---------------------------------------------------------*
 | Função: fValidConf                                      |
 | Descr.: Função que valida os conteúdos digitados        |
 *---------------------------------------------------------*/

Static Function fValidConf(cSeparador)
	Local lRet     := .T.
	Local nPosCont := 1
	Local nPosDel  := 2
	Local aDadAux  := oMsGetPar:aCols
	Local nAtual   := 0
	Local cMsg     := ""
	
	//Percorrendo todos os dados, e preenchendo o conteúdo novo
	cContNov := ""
	For nAtual := 1 To Len(aDadAux)
		
		//Se não estiver deletada a linha
		If ! aDadAux[nAtual][nPosDel]
			cContNov += Alltrim(aDadAux[nAtual][nPosCont]) + cSeparador
		EndIf
	Next
	
	//Se o conteúdo passar de 250 caracteres, mostra aviso ao usuário
	If Len(cContNov) > 250
		cMsg := "Conteúdo do parâmetro <b>excedeu 250</b> caracteres!<br><br>"
		cMsg += "<b>Conteúdo Novo:</b> '" + cContNov + "' <br><br>"
		cMsg += "<b>Conteúdo Máximo:</b> '" + SubStr(cContNov, 1, 250) + "'"
		
		MsgStop(cMsg, "Atenção")
		lRet := .F.
	EndIf
	
	//Se o retorno estiver ok, finaliza a rotina
	If lRet
		lOk := .T.
		oDlgPvt:End()
	EndIf
	
Return lRet

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.

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.

Deixe uma resposta