Array
(
)

Dúvida com seleção SQL

Dhiogosilva
   - 05 jan 2006

galera... trabalho com desenvolvimento de Sistemas para Internet, e uso MUITO strings SQL para acesso ao BD...

notei no sistema que estou ´brincando´ em Delphi, que na Seleção SQL que fiz, ela acabou se tornando ´case sensitive´, ou seja, se eu colocar um ´C´ (maiúsculo) no ´LIKE´, ele SÓ vai procurar por ´C´ (Maiúsculo), deixando os ´c´ (Minúsculos) de lado...

há alguma coisa que eu poderia fazer pra corrigir esse problema?!

vlw pela força.

[]s.


Techsoft
   - 05 jan 2006

Dhiogo,

Não sei qual banco vc está usando, mas eu jah tive estes problemas com um sistema que usava interbase, talvez possa ser um pouco diferente mas no final das contas funciona em todos acredito.

Eu utilizava o comando UPPER dentro do SQL para não passar por este problema...

por exemplo:

SELECT CLIENTE, ENDERECO FROM CLIENTE
WHERE UPPER(CLIENTE) LIKE UPPER(:consulta)


isso faz com que não tenha diferença.. pois independente de como estiver no banco ou como o usuário digitar para pesquisar... vai converter para maiúscula e resolver o problema.

Espero ter ajudado.


Dhiogosilva
   - 05 jan 2006

num havia pensado nisso...
eh exatamente o Interbase que estou usando...

vou testar hj a noite, em casa, amanhã te retorno falando o que aconteceu...

MUITO OBRIGADO!!!!!!

[]s


Dhiogosilva
   - 06 jan 2006

kra... testei, mas num está dando certo...

deu um erro ´Type Mismatch...´ pode ser que o SQL num reconheça o ´Upper´?! tem outro comando que posso testar?!

vlw pela força!!!


Techsoft
   - 06 jan 2006

Vou verificar aqui e te dou um retorno disso.


Techsoft
   - 06 jan 2006

Dhiogo, fiz um teste aqui que deu certo. segue o trecho do código que usei para fazer isso...


Citação:

with ibquery1 do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT CLI_CODIGO, CLI_NOME FROM CLI_CLIENTE´);
SQL.Add(´WHERE upper(CLI_NOME) like :CLIENTE´);
ParamByName(´CLIENTE´).AsString := upperCase(edit1.Text);
Open;
ShowMessage(´Clientes = ´+inttostr(RecordCount));
end;


Neste caso usei o upper no SQL apenas para o campo e não o valor da consulta... o valor precisei passar já em maiúsculo... ai usei antes de enviar o valor para a consulta usando o uppercase do delphi..

Funcionou beleza isso aqui.

Espero ter resolvido o problema, qualquer coisa prende o grito flw!


Dhiogosilva
   - 06 jan 2006

ta... eh que não estou com o sistema aqui pra testar, e tb num tenho Delphi aqui...
mas vou testar a noite... soh mais uma duvida...
pra que serve o ´:CLIENTE´?!

deixa eu ver se entendi... em vez de colocar tudo numa linha soh, o :CLIENTE serve como se fosse um ´apontador´ de variável...

é isso?!

desculpa ser chato desse jeito... mas eu não perguntar, ninguém vai perguntar por mim...

vlw novamente...

[]s


Techsoft
   - 06 jan 2006

eh isso mesmo, serve como um parâmetro do SQL... sempre q tiver :ALGUMA_COISA esse alguma coisa pode ser enviado para dentro do SQL através do ParamByNAme()

Por Exemplo:

select * from cliente
where data_cadastro = :data

quando for executar antes do open vai ter
ParamByName(´data´).AsDateTime := date;
Open;

O SQL vai trazer somente os registros que estiverem nesta data... eh bem simples d eusar e muuito util... prefiro usar assim do q colocar no SQL direto.... não preciso me preocupar com formatos de data e nem em colocar as aspas necessárias em caso de string ou algo assim.... ele mesmo coloca... basta informar o tipo de dado que está mandando.


Dhiogosilva
   - 06 jan 2006

Poxa... vlw Fernando...

bacana ver que existem pessoas dispostas a ajudar mesmo!!!

valeu pela explicação... MUITO útil!!!!

[]s, e te retorno o que aconteceu!!! :-D


Dhiogosilva
   - 07 jan 2006

kra... esse eh meu código... num ta dando certo ainda...
dá o tal do ´type mismatch...´

#Código


QryMusica.Active := false;
QryMusica.SQL.Clear;
QryMusica.SQL.Add(´SELECT * FROM musicas WHERE upper(CONTEUDO) LIKE :CONT OR upper(NOME) LIKE :CONT´);
QryMusica.ParamByName(´CONT´).AsString :=´¬´+edit1.text+´¬´;
QryMusica.Active := true;


tem algo errado?!


Dhiogosilva
   - 07 jan 2006

kra... esse eh meu código... num ta dando certo ainda...
dá o tal do ´type mismatch...´

#Código


QryMusica.Active := false;
QryMusica.SQL.Clear;
QryMusica.SQL.Add(´SELECT * FROM musicas WHERE upper(CONTEUDO) LIKE :CONT OR upper(NOME) LIKE :CONT´);
QryMusica.ParamByName(´CONT´).AsString :=´¬´+edit1.text+´¬´;
QryMusica.Active := true;


tem algo errado?!

tou usando Delphi 7.0, com um arquivo .DB

vlw... []s


Techsoft
   - 07 jan 2006

Dhiogo,

Criei aki uma tabela musicas do tipo paradox 7 tentando criar algo próximo da tua situação, aqui funcionou da seguinte forma:


Citação:

with QryMusica do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT * FROM MUSICAS WHERE UPPER(CONTEUDO) LIKE :CONT´);
SQL.Add(´OR UPPER(NOME) LIKE :CONT´);
ParamByName(´CONT´).AsString := ´¬´+UpperCase(edit1.Text)+´¬´;
Open;
end;


Tenta substituir aquele teu código por isso e veja se vai funcionar, aqui ficou OK.

Qualquer coisa manda a tabela para o meu e-mail techsoft@terra.com.br que eu dou uma olhada e faço um teste com ela... a princípio aqui funcionou d boa!


Techsoft
   - 07 jan 2006

Mais uma coisa, se esta teu QryMusicas tiver algum comando SQL dentro dele que traga alguns campos e estes estejam no FieldEditors e ai após tu fazer este SQL ele traz campos diferentes (a mais ou a menos) pode ser um motivo para o erro. dá uma olhadinha nisso também.


Dhiogosilva
   - 09 jan 2006

Vlw Fernando... deu tudo certin aqui...

creio q o problema estava no banco...

mas deixa eu explicar o pq... :-D

como havia iniciado o sistema com um .DBF, achei que seria melhor terminar por ele tb... aí, peguei as informações da um banco .MDB, e simplesmente exportei com o Access... como esperado o banco veio cheio de problemas, mas mesmo assim coloquei ele pra rodar... mas aí começaram a surgir problemas...

entaum pra corrigir esses problemas (além do problema da seleção..) procurei um software pra fazer a conversao...

e após usá-lo TUDO voltou ao normal...

portanto galera... TOMEM CUIDADO com o Banco de Dados... não criem simplesmente... analisem... e não façam de qq jeito... pois eh NELE que estarão as informações de seu sistema...

blz...

vlw mais uma vez Fernando...

[]s.


Techsoft
   - 09 jan 2006

Blza cara, q bom q funcionou, se precisar eh soh postar ai.

Abraço!


Dpinho
   - 12 fev 2006

Estou utlizando esta pesquisa abaixo:
DM.Qconsuclie.Close;
DM.Qconsuclie.SQL.Clear;
DM.Qconsuclie.SQL.Text := ´Select * From CLIENTES´;
DM.Qconsuclie.SQL.Add( ´Where upper(ANIVER) like :vNome´);
DM.Qconsuclie.ParamByName(´vNome´).AsString := upperCase(edit1.Text);
DM.Qconsuclie.Open;
ShowMessage(´Cliente ´+DM.Qconsuclie.FieldByName(´Nome´).AsString);
Form_relaniver:= TForm_relaniver.Create(Self);
Form_relaniver.QuickRep1.Preview;

Porem não retornar nada do banco, e tenho um registro com o campo preenchido assim 03/09, no edit passo 09. e quando mando imprimir dar um erro DBExpress Operação não suportada. tenho urgencia em resolver isto, prciso fazer um relatorio de aniversariasnte e no cadastro coloco os dandos tipo 03/09 como data de aniversario.
alguem me ajude por favor