Quebrar endereço e número de uma string em AdvPL ou TLPP | Ti Responde 0251

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação