Função que tira caracteres especiais dos Campos no Protheus

Olá pessoal…

Hoje vou mostrar uma rotina que foi desenvolvida, que ao informar algum conteúdo especial em algum campo, esse conteúdo é retirado (como acentos e outros caracteres).


Primeiramente, quero agradecer ao meu amigo Rafael Achôa, que me ajudou no desenvolvimento da rotina.

AdvPL

AdvPL

Foram desenvolvidas 2 rotinas, a primeira que substitui realmente os caracteres, a u_zLimpaEsp(), que pode ser colocada na validação de usuário de qualquer campo.

A segunda rotina, é uma rotina de atualização de campos, a u_zCarEspec(), que ao mesmo tempo, desabilita o parâmetro MV_ACENTO, e em seguida atualiza vários campos para não aceitar os caracteres especiais (adicionando o u_zLimpaEsp). Essa rotina pode ser executada no Fórmulas.

Abaixo o código fonte desenvolvido.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zLimpaEsp
Função que limpa os caracteres especiais dentro de um campo
@type function
@author Atilio / Achoa
@since 25/04/2016
@version 1.0
@param lEndereco, Lógico, Define se o campo é endereço (caso sim, o traço e vírgula serão ignorados)
	@example
	u_zLimpaEsp()
/*/

User Function zLimpaEsp(lEndereco)
	Local aArea       := GetArea()
	Local cCampo      := ReadVar()
	Local cConteudo   := &(cCampo)
	Local nTamOrig    := Len(cConteudo)
	Default lEndereco := .F.
	
	//Retirando caracteres
	cConteudo := StrTran(cConteudo, "'", "")
	cConteudo := StrTran(cConteudo, "#", "")
	cConteudo := StrTran(cConteudo, "%", "")
	cConteudo := StrTran(cConteudo, "*", "")
	cConteudo := StrTran(cConteudo, "&", "E")
	cConteudo := StrTran(cConteudo, ">", "")
	cConteudo := StrTran(cConteudo, "<", "")
	cConteudo := StrTran(cConteudo, "!", "")
	cConteudo := StrTran(cConteudo, "@", "")
	cConteudo := StrTran(cConteudo, "$", "")
	cConteudo := StrTran(cConteudo, "(", "")
	cConteudo := StrTran(cConteudo, ")", "")
	cConteudo := StrTran(cConteudo, "_", "")
	cConteudo := StrTran(cConteudo, "=", "")
	cConteudo := StrTran(cConteudo, "+", "")
	cConteudo := StrTran(cConteudo, "{", "")
	cConteudo := StrTran(cConteudo, "}", "")
	cConteudo := StrTran(cConteudo, "[", "")
	cConteudo := StrTran(cConteudo, "]", "")
	cConteudo := StrTran(cConteudo, "/", "")
	cConteudo := StrTran(cConteudo, "?", "")
	cConteudo := StrTran(cConteudo, ".", "")
	cConteudo := StrTran(cConteudo, "\", "")
	cConteudo := StrTran(cConteudo, "|", "")
	cConteudo := StrTran(cConteudo, ":", "")
	cConteudo := StrTran(cConteudo, ";", "")
	cConteudo := StrTran(cConteudo, '"', '')
	cConteudo := StrTran(cConteudo, '°', '')
	cConteudo := StrTran(cConteudo, 'ª', '')
	
	//Se não for endereço, retira também o - e a ,
	If !lEndereco
		cConteudo := StrTran(cConteudo, ",", "")
		cConteudo := StrTran(cConteudo, "-", "")
	EndIf
	
	//Adicionando os espaços a direita
	cConteudo := Alltrim(cConteudo)
	cConteudo += Space(nTamOrig - Len(cConteudo))
	
	//Definindo o conteúdo do campo
	&(cCampo+" := '"+cConteudo+"' ")
	
	RestArea(aArea)
Return .T.

/*/{Protheus.doc} zCarEspec
Script para atualização de campos que terão sua validação de usuário alterada
@type function
@author Atilio
@since 25/04/2016
@version 1.0
/*/

User Function zCarEspec()
	Local aArea     := GetArea()
	Local aTexto    := {}
	Local aBotoes   := {}
	Local lContinua := .F.
	
	//Adicionando textos da rotina
	aAdd(aTexto, 'Esta rotina tem por objetivo atualizar campos para ')
	aAdd(aTexto, 'não aceitar caracteres especiais em cadastros.')
	aAdd(aTexto, '')
	aAdd(aTexto, 'Será atualizado:')
	aAdd(aTexto, 'Parâmetro MV_ACENTO')
	aAdd(aTexto, 'Tabelas SA1, SA2, SA4 e SB1')

	//Adicionando os botões da rotina
	aAdd(aBotoes, {1, .T., {|| lContinua := .T., FechaBatch()}})
	aAdd(aBotoes, {2, .T., {|| lContinua := .F., FechaBatch()}})

	//Mostra o batch esperando interação do usuário
	FormBatch("Atualização de campos", aTexto, aBotoes) 
		
	//Se for para continuar o processamento
	If lContinua
		Processa({|| fAtualiza()}, "Processando...")
	EndIf
	
	RestArea(aArea)
Return

/*---------------------------------------------------------------------*
 | Func:  fAtualiza                                                    |
 | Autor: Daniel Atilio                                                |
 | Data:  25/04/2016                                                   |
 | Desc:  Função que atualiza os dados                                 |
 *---------------------------------------------------------------------*/

Static Function fAtualiza()
	Local aAreaX3    := SX3->(GetArea())
	Local aCampos    := {}
	Local aCamposEnd := {}
	Local cValidUsr  := ""
	Local nAtual     := 0
	
	DbSelectArea('SX3')
	SX3->(dbSetOrder(2)) // X3_CAMPO
	ProcRegua(3)
	
	//Campos normais
	aAdd(aCampos, 'A1_NOME')
	aAdd(aCampos, 'A1_NREDUZ')
	aAdd(aCampos, 'A1_BAIRRO')
	aAdd(aCampos, 'A1_MUN')
	aAdd(aCampos, 'A2_NOME')
	aAdd(aCampos, 'A2_NREDUZ')
	aAdd(aCampos, 'A2_BAIRRO')
	aAdd(aCampos, 'A2_MUN')
	aAdd(aCampos, 'A4_NOME')
	aAdd(aCampos, 'A4_NREDUZ')
	aAdd(aCampos, 'A4_BAIRRO')
	aAdd(aCampos, 'B1_DESC')
	
	//Campos de endereço
	aAdd(aCamposEnd, 'A1_END')
	aAdd(aCamposEnd, 'A2_END')
	aAdd(aCamposEnd, 'A4_END')
	
	//Atualiza o MV_ACENTO para não aceitar acentuação no sistema
	IncProc("Atualizando parâmetro...")
	PutMV('MV_ACENTO', 'N')
	
	//Percorrendo os campos normais
	IncProc("Atualizando campos normais...")
	SX3->(DbGoTop())
	For nAtual := 1 To Len(aCampos)
		//Se conseguir posicionar
		If SX3->(DbSeek(aCampos[nAtual]))
			cValidUsr := Alltrim(SX3->X3_VLDUSER)
			
			//Se já tiver, pula o campo
			If "U_ZLIMPAESP" $ Upper(cValidUsr)
				nAtual++
				Loop
			EndIf
			
			//Se tiver conteúdo, adiciona .And. no valid
			If !Empty(cValidUsr)
				cValidUsr += ".And."
			Endif
			
			//Definindo a expressão
			cValidUsr += "u_zLimpaEsp()"
			
			//Atualiza no banco
			RecLock('SX3', .F.)
				X3_VLDUSER := cValidUsr
			SX3->(MsUnlock())
		EndIf
	Next
	
	//Percorrendo os campos de endereço
	IncProc("Atualizando campos de endereço...")
	SX3->(DbGoTop())
	For nAtual := 1 To Len(aCamposEnd)
		//Se conseguir posicionar
		If SX3->(DbSeek(aCamposEnd[nAtual]))
			cValidUsr := Alltrim(SX3->X3_VLDUSER)
			
			//Se já tiver, pula o campo
			If "U_ZLIMPAESP" $ Upper(cValidUsr)
				nAtual++
				Loop
			EndIf
			
			//Se tiver conteúdo, adiciona .And. no valid
			If !Empty(cValidUsr)
				cValidUsr += ".And."
			Endif
			
			//Definindo a expressão
			cValidUsr += "u_zLimpaEsp(.T.)"
			
			//Atualiza no banco
			RecLock('SX3', .F.)
				X3_VLDUSER := cValidUsr
			SX3->(MsUnlock())
		EndIf
	Next
	
	RestArea(aAreaX3)
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 na TOTVS Oeste Paulista Bauru. 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 respostas em “Função que tira caracteres especiais dos Campos no Protheus

Deixe uma resposta