No vídeo de hoje, vamos demonstrar em como quebrar um endereço via AdvPL, separando o número.
A dúvida de hoje, nos perguntaram, em campos do Protheus, onde o endereço serve tanto para informar a rua como o número, como poderíamos separar isso em duas strings.
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como encontrar e separar a informação do número.
Segue abaixo o vídeo exemplificando:
Abaixo os códigos fontes desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} zVid0251
Função para demonstrar a quebra do endereço
@type user function
@author Atilio
@since 22/03/2026
/*/
User Function zVid0251()
Local aArea := FWGetArea()
Local cMensagem := ""
Local cEndereco := ""
Local aEndereco := {}
//Primeiro exemplo, separando com vírgula
cEndereco := "Avenida de Teste, 1-57"
aEndereco := u_zSeparEnd(cEndereco)
cMensagem := cEndereco + CRLF + aEndereco[1] + CRLF + aEndereco[2]
ShowLog(cMensagem)
//Segundo exemplo, separando com o último espaço
cEndereco := "Rua Esburacada 5:34"
aEndereco := u_zSeparEnd(cEndereco)
cMensagem := cEndereco + CRLF + aEndereco[1] + CRLF + aEndereco[2]
ShowLog(cMensagem)
//Terceiro exemplo, quando não tem número
cEndereco := "Rodovia Algum Nome Importante KM 100 Sem Numero"
aEndereco := u_zSeparEnd(cEndereco)
cMensagem := cEndereco + CRLF + aEndereco[1] + CRLF + aEndereco[2]
ShowLog(cMensagem)
FWRestArea(aArea)
Return
zSeparEnd:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} zSeparEnd
Recebe o endereço como string e retorna um array com as posições
@type user function
@author Atilio
@since 19/03/2026
@param cEndereco, Caractere, Endereço a ser tratado
@return aEndereco, Array, Duas posições sendo [1] Endereço e [2] Número
@example
aEndereco := u_zSeparEnd("Rua Teste, 123") // [1] : "Rua Teste", [2] : "123"
/*/
User Function zSeparEnd(cEndereco)
Local aArea := FWGetArea()
Local aEndereco := {"", ""}
Local cRua := ""
Local cNumero := ""
Default cEndereco := ""
//Retira espaços vazio das extremidades
cEndereco := Alltrim(cEndereco)
//Se tiver vírgula
If "," $ cEndereco
cRua := Left(cEndereco, RAt(",", cEndereco) - 1)
cNumero := SubStr(cEndereco, RAt(",", cEndereco) + 1)
//Senão, pega do último espaço vazio
Else
cRua := Left(cEndereco, RAt(" ", cEndereco) - 1)
cNumero := SubStr(cEndereco, RAt(" ", cEndereco))
EndIf
//Se não for numérico a separação do numero, é SN
If ! IsNumeric(StrTran(StrTran(cNumero, "-", ""), ":", ""))
cRua := cEndereco
cNumero := "S/N"
EndIf
//Atualiza o retorno
aEndereco[1] := Alltrim(cRua)
aEndereco[2] := Alltrim(cNumero)
FWRestArea(aArea)
Return aEndereco
Bom pessoal, por hoje é só.
Abraços e até a próxima.