GARANTIR DESCONTO

Fórum Ajuda para manipular string #349749

27/11/2007

0

Pessoal...

Eu tenho um campo ENDERECO aonde eu preciso ´quebrar´ esse endereço em número e complemento.
Acontece que não estou conseguindo.
Por exemplo:

Endereço: Rua Euclides de Castro 141 sala 01

O que tenho que pegar é colocar nas variáveis somente os valores do número e do complemento.

vlNumero: 141
vlComplemento: sala 01

Alguém pode me ajudar?
É urgente....


Marcos.gandin

Marcos.gandin

Responder

Posts

27/11/2007

Daykas

Amigo!
No seu caso, você tem tamanhos variados para cada endereço. Isto dificulta porque precisaria ter posições fixas para poder atribuir os valores do número e do complemento para as variáveis.
Sem chance!


Responder

Gostei + 0

27/11/2007

Marcos.gandin

Acontece que eu tenho duas bases de dados, sendo uma nossa e uma dos Correios.
Na nossa base de dados tem o campo Endereco com o endereço completo (Rua Euclides de Castro 141 sala 01) e na base dos correios tem o campo Nome com o nome da rua (Euclides Castro).

O que me foi sugerido é pegar o ultimo nome (Castro) da base dos correios e comparar com a nossa. Quando achar a string (Castro), deve-se descartar tudo o quer tiver à esquerda (Euclides Castro) e gravar num campo que foi criado na base o valor no numero (141) e o complemento (sala 01).

Pegar o ultimo nome eu já consegui...o que eu não to conseguindo é descartar a parte à esquerda e quebrar o restante da string em 2 campos.

Será que consegui explicar ?


Responder

Gostei + 0

27/11/2007

Ferreia2

Uma sugestão seria você dar um Loop na String e verificar caracter por caracter se ele é diferente de Letra, se for vc quebra a string, porem existe dois Furos ai que é quando no endereço existir numeros e no Numeral começar com letras.


Responder

Gostei + 0

27/11/2007

Comodelphi

O que me foi sugerido é pegar o ultimo nome (Castro) da base dos correios e comparar com a nossa. Quando achar a string (Castro), deve-se descartar tudo o quer tiver à esquerda (Euclides Castro) e gravar num campo que foi criado na base o valor no numero (141) e o complemento (sala 01).


Imagine se existir rua: Fulano Castro, Beltrano Castro, Ze Castro. Será que essa solução da certo?

Qual o banco você usa?


Responder

Gostei + 0

27/11/2007

Marcos.gandin

Estou utilizando PostgreSQL.

Mas será que não existe nenhuma solução pra esse caso? :(


Responder

Gostei + 0

27/11/2007

Comodelphi

O Postgres é Show. É possível estabelecer um padrão com [i:245818b407]Expressões Regulares[/i:245818b407] e assim separar os campos desta forma. Vou tentar modificar uma função que já tenho para postar aqui. Se vc quiser ir dando uma pesquisada, procura no help do PG por [b:245818b407]Pattern Matching[/b:245818b407].

abcs.


Responder

Gostei + 0

27/11/2007

Marcos.gandin

Poxa...

Te agradeço muito se puderes me ajudar.
É que estou entrando agora numa empresa e eles me pediram pra fazer essa verificação na base pois temos que atualizar nosso banco e estou ´penando´ justamente nessa parte.

Mais uma vez obrigado.
Abraço...


Responder

Gostei + 0

28/11/2007

Marcos.gandin

Continuo no aguardo da sua função.

Abraços....


Responder

Gostei + 0

28/11/2007

Comodelphi

Como talvez a funão completa demore um pouco para sair, eu to um pouco sem e vc tb. Então essa query acho que pode adiantar o seu lado:

select regexp_replace(´Rua Euclides de Castro 141 sala 01´, ´(?:[A-Z,a-z]{1,})([ , ]{1,})([A-Z,a-z]{1,})´, ´´, ´g´);


resultado esperado: substituir a parte inicio da string até que seja encontrado um número, preservando a string a partir desse ponto:

´ 141 sala 01´



Responder

Gostei + 0

28/11/2007

Marcos.gandin

Certo...pra uma string colocada direto na query funcionou perfeito, mas como eu faço isso com um Select num campo de uma tabela?

Outra coisa...e se a rua for no seguinte formato:

Rua 7 de Setembro 93 E

Coloquei na query e ela me retornou: [b:7ce347e71b]Rua 7 93 E[/b:7ce347e71b]

Teríamos um problema aí... :(


Responder

Gostei + 0

28/11/2007

Comodelphi

teste essa função:

CREATE OR REPLACE FUNCTION fn_evalexprendereco(aexpr character varying)
  RETURNS character varying AS
$BODY$
declare
  expr1 varchar(255);
begin
  expr1 := ´´;
  if upper(aexpr) ~ ´((RUA|AVENIDA|AV|AV.)(([0-9]{1,})|([ , ]{1,}[0-9]{1,}))([ , ]{1,})([A-Z,a-z]{1,}))´
  then
    expr1 := regexp_replace(aexpr, ´((RUA|AVENIDA|AV|AV.)(([0-9]{1,})|([ , ]{1,}[0-9]{1,}))([ , ]{1,})([A-Z,a-z]{1,}))´, ´´, ´i´);
    expr1 := regexp_replace(trim(both ´ ´ from expr1), ´^([A-Z,a-z]){1,}´, ´´, ´g´);
  else
    expr1 := regexp_replace(aexpr, ´(?:[A-Z,a-z]{1,})([ , ]{1,})([A-Z,a-z]{1,})´, ´´, ´g´);
  end if;
  expr1 := trim(both ´ ´ from expr1);
  return expr1;
end;
$BODY$
  LANGUAGE ´plpgsql´ VOLATILE;


ex.: como usar.

select fn_evalexprendereco(´Rua 7 de Setembro 93 E ´);
select fn_evalexprendereco(´Rua Euclides de Castro 141 sala 01´);

select fn_evalexprendereco(cpo_endreco)
from cadcli;


Responder

Gostei + 0

28/11/2007

Marcos.gandin

Legal a sua função, mas eu gostaria (e pensava) que fosse uma função pra ser utilizada no Delphi e não que fosse pro BD.
É que aí eu iria passar uma string pra função e ela me retornaria o resultado.
Mas valeu mesmo assim.

Flw


Responder

Gostei + 0

28/11/2007

Comodelphi

Pelo Delphi tem como usar Expressões Regulares mas sinceramente não sei como, a documentação do Delphi 2007 é uma droga. Quanto a função vc tem a possibilidade de trazer o resultado do banco tratado e terminar o trabalho no delphi, e vc pode encapsular a chamada a função pelo Delphi. Cria uma function que interage com função no banco e function retorna o valor.


Responder

Gostei + 0

28/11/2007

Comodelphi

Qual componente de acesso vc usa?


Responder

Gostei + 0

28/11/2007

Comodelphi

bom, vai um exemplo usando Zeos:

function evalexprendereco(aexpr: string): string;
begin
  with TZReadOnlyQuery.Create(nil) do
  begin
    Connection := dbConnection;
    SQL.Text := ´select fn_evalexprendereco(:aexpr) as aexpr´;
    Open;
    Result := FieldByName(´aexpr´).AsString;
    Free;
  end;
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar