Dúvida com seleção SQL

05/01/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.


Dhiogosilva

Respostas

05/01/2006

Techsoft

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.


Responder Citar

05/01/2006

Dhiogosilva

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


Responder Citar

06/01/2006

Dhiogosilva

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!!!


Responder Citar

06/01/2006

Techsoft

Vou verificar aqui e te dou um retorno disso.


Responder Citar

06/01/2006

Techsoft

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

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!


Responder Citar

06/01/2006

Dhiogosilva

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


Responder Citar

06/01/2006

Techsoft

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.


Responder Citar

06/01/2006

Dhiogosilva

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


Responder Citar

07/01/2006

Dhiogosilva

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

    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?!


Responder Citar

07/01/2006

Dhiogosilva

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

    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


Responder Citar

07/01/2006

Techsoft

Dhiogo,

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

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!


Responder Citar

07/01/2006

Techsoft

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.


Responder Citar

09/01/2006

Dhiogosilva

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.


Responder Citar

09/01/2006

Techsoft

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

Abraço!


Responder Citar

12/02/2006

Dpinho

Estou utlizando esta pesquisa abaixo:
[color=red:6b6bf89a25] 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;[/color:6b6bf89a25]

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


Responder Citar