Problemas com Like no Interbase

Firebird

29/11/2007

Eu tive um problema ao usar campos do tipo Time, tive que fazer umas mudançar no Dialect, eu tinha algumas funçoes no programa que usava Like, depois de eu ter feito essa alteração do dialect o like não funciona mais, pode ter alguma coisa com o dialect? Mudei para Dialect 3

BD: Interbase


Luiz_aquino

Luiz_aquino

Curtidas 0

Respostas

Pestana_

Pestana_

29/11/2007

na verdade eu não tenho conhecimento que isso pode afetar o Like, mas sei que quando você muda de Dialect do 1 para o 3 (no Firebird) voce precisa recriar o banco e mudar o tipo do campo para TimeStamp, acredito que o Interbase seja igual, você precisava estar verificando isso. O tipo de dado TimeStamp tem a função de manter a compatibilidade com o Dialeto 1.

se voce não alterou o tipo de dados experimente incluir registros em sua tabela e verifique se ocorre erros.


flw.


GOSTEI 0
Luiz_aquino

Luiz_aquino

29/11/2007

na verdade eu não tenho conhecimento que isso pode afetar o Like, mas sei que quando você muda de Dialect do 1 para o 3 (no Firebird) voce precisa recriar o banco e mudar o tipo do campo para TimeStamp, acredito que o Interbase seja igual, você precisava estar verificando isso. O tipo de dado TimeStamp tem a função de manter a compatibilidade com o Dialeto 1. se voce não alterou o tipo de dados experimente incluir registros em sua tabela e verifique se ocorre erros. flw.


Mas o TimeStamp ele recebe data e hora, eu gostaria somente da hora. se mudo no registro do win SQLDialect = 3 o Date e o Time funcionam mas quando uso o like dentro do Delphi, ou seja com ¬ ele da erro.
Pelo q entendi ele não aceita o ¬, se eu fazer uma consulta no iterbase roda beleza o like, mas em código no delphi q eu usaria um ¬ pq eu pegaria os dados de um edit, ele da erro.


GOSTEI 0
Joaoshi

Joaoshi

29/11/2007

Colega, tente assim:

SELECT CAST(SeuCampoTimeStamp AS TIME) FROM SUA TABELA
WHERE CAST(SeuCampoTimeStamp AS TIME) LIKE ´10¬´;

Espero ter ajudado.


GOSTEI 0
Brasidata

Brasidata

29/11/2007

A dica pode não ser muito valiosa, mas se vc está usando instruções SQL dinâmicas no seu aplicativo, preste atenção se ao montar as pesquisas você lembrou que ao mudar o dialeto (além das alterações dos tipos Date, Time e TimeStamp) há uma diferença no uso de ´ ou ´ (aspas duplas onde eram aspas simples e vice-versa).


GOSTEI 0
Luiz_aquino

Luiz_aquino

29/11/2007

A dica pode não ser muito valiosa, mas se vc está usando instruções SQL dinâmicas no seu aplicativo, preste atenção se ao montar as pesquisas você lembrou que ao mudar o dialeto (além das alterações dos tipos Date, Time e TimeStamp) há uma diferença no uso de ´ ou ´ (aspas duplas onde eram aspas simples e vice-versa).


SELECT CAST(SeuCampoTimeStamp AS TIME) FROM SUA TABELA
WHERE CAST(SeuCampoTimeStamp AS TIME) LIKE ´10¬´;

esse código não me ajudaria!

como faço uma consulta com like mas usando parametro?

select * from cliente
where nome_clie like ´T¬´

no lugar do T eu gostaria de usar um paramentro tipo :pnome_clie que receberia o valor de um edit, lembrando que estou com problema com ´´+Edit+´¬´ ele da erro com ¬, acredito q com o parametro funciona, tentei tbm trocar as ´ por ´ vice e versa e não funciona, o delphi não aceita


GOSTEI 0
Brasidata

Brasidata

29/11/2007

Vou considerar que você está usando SQL dinamicamente no Delphi, enviando uma string pro seu componente via código. Portanto, tenta assim (A quantide exata de ´ é relevante para dar certo):


´ select * from cliente where nome_clie like [color=red:847b63cdc2] ´´´ [/color:847b63cdc2]+ Edit1.Text + ´¬[color=red:847b63cdc2]´´´[/color:847b63cdc2];

Observe bem que, em vermelho, estou usando TRES aspas simples para que o Delphi interprete como uma única aspas na hora de passar a string para o seu componente Query.
Uso assim em MUITOS aplicativos meus e não tenho erros com o ¬.

Bom trabalho


GOSTEI 0
Brasidata

Brasidata

29/11/2007

Mas se você preferir deixar a SQL fixa na sua query e usar parâmetros, aí vai o ´PLANO B´ que acabei de testar aqui sem problema algum:
(Nesse exemplo estou usando os componentes DBX, mas vc pode adaptar para qquer outro)

Primeiro:
Na propriedade CommandText do meu SqlDataSet1 escrevi:
select * from CLIENTES where nome_clie like :pnome_clie 


Depois implementei o OnClick de botão assim:

  if Trim(Edit1.Text) = ´´ then Exit;
  ClientDataSet1.Close;
  SQLDataSet1.ParamByName(´:pnome_clie´).AsString := Edit1.Text + ´¬´;
  ClientDataSet1.Open;


Então foi só ver o resultado num DBGrid.
Tudo funcionando perfeitamente.

Espero que uma dessas duas opções (ou as duas) possa te ajudar...


GOSTEI 0
Brasidata

Brasidata

29/11/2007

OPS... ERRATA

Tem dois pontos sobrando no ParamByName.
O correto é:

  if Trim(Edit1.Text) = ´´ then Exit; 
  ClientDataSet1.Close; 
  SQLDataSet1.ParamByName(´pnome_clie´).AsString := Edit1.Text + ´¬´; 
  ClientDataSet1.Open;



GOSTEI 0
Luiz_aquino

Luiz_aquino

29/11/2007

Vlw, as duas formas ajudaram!!!


GOSTEI 0
POSTAR