ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Tem como criar um função para separar endereço?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Mar 12, 2010 2:04 pm    Assunto: Tem como criar um função para separar endereço? Responder com Citação

Pessoal, estou precisando saber se tem como criar uma função para separar endereço

O endereço se encontra numa string, e pode estar assim


rua tal 500

rua tal, 500

rua tal tal 500

Ou seja com virgula, sem virgula, etc..

O mais proximo que eu consegui chegar foi assim
Código:
function SeparaEndereco(const S: String; SubStr: String; Parte: Byte): String;
var
  i: Byte;
  j: Word;
  Aux: String;
begin
  Result := '';
  Aux := S;
  for i := 1 to Parte-1 do
    begin
      j := Pos(SubStr,Aux);
      Aux := Copy(Aux,j+1,Length(Aux)-j);
    end;
  j := Pos(SubStr,Aux);
  if J > 0 then
    Result := Trim(Copy(Aux,1,J-1))
  else
    Result := Trim(Aux);
end;


Usando assim
Código:
CriaTag('xLgr',SeparaEndereco(esqueletoNF.fieldbyname('endereco').asstring,',',1)); // pegando a primeira posição antes da virgula
                      //ID E07 CAMPO nro
                     // _numero_endereco := SoNumero(SeparaEndereco(esqueletoNF.fieldbyname('endereco').asstring,' ',1));
                      CriaTag('nro',SeparaEndereco(esqueletoNF.fieldbyname('endereco').asstring,',',2));


Mais funciona apenas se estiver separado por virgula.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Sex Mar 12, 2010 3:11 pm    Assunto: Responder com Citação

mas e se....

(sempre tem um "se")

como o texto nao é padronizado, vai ficar dificil mesmo separar. veja mais exemplos:

RUA TAL 52
RUA TAL, 52
RUA TAL N. 52
RUA TAL Nº 52
RUA TAL, N. 52
RUA TAL, Nº 52

RUA TAL 52 APTO 12
....

imagina qtas possibilidades?

se nenhum endereco tiver algo apos o numero, ja fica mais facil (no caso dos 6 primeiros exemplos acima).

basta vc percorrer o texto de tras pra frente, q qdo achar alguma coisa q nao e numero, vc para de percorrer e joga esse valor no campo determinado. mas somente nos 6 primeiros (mesmo q nao tenha espaco)
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Mar 12, 2010 3:47 pm    Assunto: Responder com Citação

joemil escreveu:
mas e se....

(sempre tem um "se")

como o texto nao é padronizado, vai ficar dificil mesmo separar. veja mais exemplos:

RUA TAL 52
RUA TAL, 52
RUA TAL N. 52
RUA TAL Nº 52
RUA TAL, N. 52
RUA TAL, Nº 52

RUA TAL 52 APTO 12
....

imagina qtas possibilidades?

se nenhum endereco tiver algo apos o numero, ja fica mais facil (no caso dos 6 primeiros exemplos acima).

basta vc percorrer o texto de tras pra frente, q qdo achar alguma coisa q nao e numero, vc para de percorrer e joga esse valor no campo determinado. mas somente nos 6 primeiros (mesmo q nao tenha espaco)
Já imaginei sim, por isso não consegui achar se existe uma logica pra esta função amigo.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Sex Mar 12, 2010 4:48 pm    Assunto: Responder com Citação

procura primeiro caracter não numerico do ultimo para o primeiro.

achou?

dele pra frente, exceto ele, é o numero, o resto é o endereço.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Sex Mar 12, 2010 6:45 pm    Assunto: Responder com Citação

Adriano por padrão os números ficam por último ou não tem como saber?

Teste estes dois codigos abaixo e verifique se resolve:

Código:
1)
var
   endereco, numero : string;
   i : integer;
begin
   endereco := Edit1.Text;
   for i := Length(endereco) downto 0 do
     if (endereco[i] in ['0'..'9']) then
       numero := endereco[i] + numero;
   ShowMessage(numero);
end;


2)
var
   endereco, numero : string;
   encontrou : boolean;
   i : integer;
begin
   endereco := Edit1.Text;
   encontrou := true;
   i := Length(endereco);
   while (i >= 0) and encontrou do
    begin
       if (endereco[i] in ['0'..'9']) then
         numero := endereco[i] + numero
       else
         encontrou := false;
       dec(i)
    end;
   ShowMessage(numero);
end;


A diferença é que a primeira percorre toda a string e a segunda percorre enquanto se encontra caracter numerico.
_________________
Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Mar 12, 2010 6:59 pm    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
procura primeiro caracter não numerico do ultimo para o primeiro.

achou?

dele pra frente, exceto ele, é o numero, o resto é o endereço.
Pensei nisso, mais tem um problema, existe também o complemento que vem depois do numero.

rua tal 5000 bloco 5 cj 12

o pior que assim fica dificil
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Mar 12, 2010 7:01 pm    Assunto: Responder com Citação

pestana escreveu:
Adriano por padrão os números ficam por último ou não tem como saber?

Teste estes dois codigos abaixo e verifique se resolve:

Código:
1)
var
   endereco, numero : string;
   i : integer;
begin
   endereco := Edit1.Text;
   for i := Length(endereco) downto 0 do
     if (endereco[i] in ['0'..'9']) then
       numero := endereco[i] + numero;
   ShowMessage(numero);
end;


2)
var
   endereco, numero : string;
   encontrou : boolean;
   i : integer;
begin
   endereco := Edit1.Text;
   encontrou := true;
   i := Length(endereco);
   while (i >= 0) and encontrou do
    begin
       if (endereco[i] in ['0'..'9']) then
         numero := endereco[i] + numero
       else
         encontrou := false;
       dec(i)
    end;
   ShowMessage(numero);
end;


A diferença é que a primeira percorre toda a string e a segunda percorre enquanto se encontra caracter numerico.
Olá Pestana, eu não fiz os testes, volto a postar pra ver se vai funcionar, mais creio que como disse antes:
Citação:
Pensei nisso, mais tem um problema, existe também o complemento que vem depois do numero.

rua tal 5000 bloco 5 cj 12

o pior que assim fica dificil

Não sei se vai dar certo amigo
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcellomm
Colaborador
Colaborador


Registrado: Segunda-Feira, 7 de Novembro de 2005
Mensagens: 1045

MensagemEnviada: Seg Mar 15, 2010 6:34 pm    Assunto: Responder com Citação

Se existe a possibilidade de saber qual(is) o(s) formato(s) que mais ocorre(m), aplique a função para esse(s) formatos. Deixando os de menor ocorrencia para serem feitos na unha. É claro, se não chegarem aos milhares ou dezenas de centenas...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Mar 15, 2010 6:57 pm    Assunto: Responder com Citação

Ainda estou estudando uma forma mais agradável para construir esta função, caso eu tenha coragem de fazer Very Happy

Obrigado pessoal.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Mar 17, 2010 8:43 am    Assunto: Responder com Citação

Eu até fiz cfe o Pestana disse, mais ainda não esta de acordo com que eu preciso

Código:
function SeparaEndereco(const S: String; SubStr: String; Parte: Byte): String;
var
  i: Byte;
  j: Word;
  Aux: String;
begin
  Result := '';
  Aux := S;
  for i := 1 to Parte-1 do
    begin
      j := Pos(SubStr,Aux);
      Aux := Copy(Aux,j+1,Length(Aux)-j);
    end;
  j := Pos(SubStr,Aux);
  if J > 0 then
    Result := Trim(Copy(Aux,1,J-1))
  else
    Result := Trim(Aux);
end;

Código:

function _Numeros_Endereco(_endereco: string): string;
var
   _ender, _num : string;
   _int : integer;
begin
   _endereco  := SeparaEndereco(_endereco,',',2); // Separa o endereço depois da virgula
   _ender     := _endereco; //variavel recebe o valor do parametro
   for _int := Length(_ender) downto 0 do // Le de traz pra fente a string
     if (_ender[_int] in ['0'..'9']) then // somente numeros
       _num := _ender[_int] + _num;
   Result := _num;
end;

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB