Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renanbg

[Resolvido] Pesquisa SQL com 2 campos

Recommended Posts

Boa tarde

 

tenho o codigo abaixo que faz uma busca pelo campo Cedente

 

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM tbcedentes WHERE Cedente LIKE ' + #39 + Edit1.Text + '%' + #39);
Query1.SQL.Add('Order by Cedente');
Query1.Open;

Então basta eu digitar parte do nome do cedente que ele me traz o resultado em um dbgrid

 

quero melhorar esse codigo colocando tbm uma opção para buscar pelo codigo do cedente. Então assim eu posso escolher entre 2 formas de pesquisa na busca

 

Ja tentei de tudo e n tive sucesso, alguem pode me dar uma mãozinha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Renanbg,

 

Para pesquisar por campos diferentes, você tem duas opções: usar AND ou OR. No seu caso, pelo que eu entendi, você precisaria usar o OR.

 

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM tbcedentes WHERE (Cedente LIKE ' + #39 + Edit1.Text + '%' + #39 + ') OR (CODIGO = ' + Edit2.text + ')');
Query1.SQL.Add('Order by Cedente');
Query1.Open;

Assim, você traria todos os registros com o nome informado no edit1 OU com o código informado no edit2.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa..obrigado por me ajudar

 

eu faço a pesquisa no mesmo edit, então ficaria assim:

 

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM tbcedentes WHERE (Cedente LIKE ' + #39 + Edit1.Text + '%' + #39 + ') OR (CODIGO = ' + Edit1.text + ')');
Query1.SQL.Add('Order by Cedente');
Query1.Open;

Se faço a pesquisa por codigo da certo, porém se faço por cedente da um erro

 

invalid field name

sabe o q pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, acho que tem um erro na sua lógica ai Renan. Porque está filtrando o cedente e o código usando o mesmo Edit ao mesmo tempo? Isso não vai dar certo mesmo...

 

Supondo que a estrutura da sua tabela seja algo assim:

 

Tabela XXXX

Codigo Inteiro

Cedente String

Outros campos...

 

Quando você passa o código 1234 no Edit pra sua select, o que acontece é o seguinte: na execução da consulta, a operação LIKE procura no banco qualquer Cedente que tenha em alguma parte do campo Cedente na tabela o valor 1234 OU o Código = 1234. Porque não dá erro? Simples... o código 1234 é convertido para string no like e passado como integer na comparação com o código e a query funcionará corretamente (apesar do erro da lógica que vi aqui na sua consulta).

 

Agora... se você passar um nome de cedente como José, vai dar erro na SQL porque quando o TQuery mandar pro banco a comparação Codigo = José, o banco vai interpretar o José como se fosse um campo de uma tabela a ser usada na comparação, dai o problema de "invalid field name" . Mesmo que o José fosse enviado entre aspas, se seu campo código for um inteiro vai dar pau, porque Integer <> String.

 

Se a estrutura da sua tabela for como a que eu citei acima, com o código sendo um campo inteiro e cedente uma string, você só pode usar no filtro um dos dois a cada execução da query, a menos que use edits separados para informar os dois valores, que deverão obrigatoriamente ter algum valor preenchido para a SQL funcionar do modo que você monta ela para passar a Query.

 

Qualquer coisa explica melhor ai como está estruturada a lógica da sua consulta que te ajudo a fazer ela funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é

 

tem um sistema de uma empresa daqui que usa o mesmo edit para fazer 3 tipos de busca

 

Codigo - Inteiro

Codigo de barras - inteiro

Descrição - String

 

O sistema é em VB

 

Pensei que desse pra fazer. Colocar 2 edits n me ajuda..então manterei apenas a busca por cedente

 

obrigado pelas dicas

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente o seguimte :

usar um combobox com as duas opções : Codigo , Cedente e um Edit (Edit1) na frente deste combo para a digitação do Valor e um botão para a busca,

 

ai faça o seguinte:

 

No click do botão faça:

 

Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add('SELECT * FROM tbcedentes');

Query1.SQL.Add('WHERE');

if Combobox1.ItemIndex = 0 then // Se for pelo código

(CODIGO = ' + Edit1.text + ');

else if Combobox.itemindex = 1 // se for pelo Cedente

(Cedente LIKE ' + #39 + Edit1.Text + '%' + #39 + ') ;

Query1.SQL.Add('Order by Cedente');

Query1.Open;

 

USando este if ira te retornar o que for pedido e coloque o resultado onde quiser, em um grid pro exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desse jeito dá, mas quero fazer tudo no mesmo edit sem ter q selecionar combo ou radiobutton

 

até agora cheguei nesse codigo

 

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM tbcedentes WHERE Cedente LIKE ' + #39 + Edit1.Text + '%' + #39);
Query1.SQL.Add('OR codigoCedente = ' + Edit1.Text);
Query1.SQL.Add('Order by Cedente');
Query1.Open;

se pesquiso por codigo da certo mas se digito parte do nome do cedente dao erro abaixo

 

Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renan, você pelo jeito não leu o que eu falei a respeito da sua consulta antes... é IMPOSSÍVEL pesquisar num campo inteiro (como código) uma STRING. Irá dar erro mesmo!!!

 

A questão de usar um mesmo edit para pesquisar por campos diferentes é viável se você fizer um tratamento como o sugerido pelo ByOracle, onde usando um componente auxiliar você controla a forma como a query será montada, filtrando a query por um campo por vez.

 

Já expliquei aqui como é o uso do like e porque ao pesquisar por código não dá erro na sua query. Por favor, leia com atenção o meu post anterior.

 

A questão é: se você vai filtrar por um código (que geralmente é um campo INTEGER, salvo raras excessões), pra que vai usar o like??

 

Se você tiver uma tabela com essa estrutura:

 

CODIGO - Cedente

1 - Fulano

2 - Ciclano 1

 

Usando o select passando pro like seu código 1 ou 2 vai funcionar porque você tem um OR na SQL que, traduzindo, diz pro BD o seguinte:

Selecione todos os registros da tabela onde Cedente contenha 1 OU código seja igual a 1. OK, funciona e trás o primeiro e o segundo registro da tabela exemplo porque na coluna cedente existe um campo que tem o valor 1 (do código) no campo.

 

Agora.... como você quer igualar um campo inteiro com uma string? Vai dar erro direto.

 

E, supondo que seu campo código seja do tipo string, você teria que por na sql o valor passado pelo edit entre aspas, como no caso do cedente.

 

De boa meu amigo, você tá dando murro em ponta de faca a toa... não vai funcionar as coisas do jeito que quer fazer. Repensa ai a sua lógica porque tá errada.

 

==============================

 

OBS: Moderação, desculpe se de alguma forma estou infringindo as regras do fórum neste post. Sintam-se livres para editar o mesmo.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Td bem, entendo sua lógica...só estava pedindo se havia como fazer pq no sistema que temos aqui na empresa em uma mesmo edit a gente faz tres tipos de pesquisa como eu descrevi num dos posts acima...

 

por isso eu to com essa pulga atras da orelha, entendeu?

 

como pode esse sistema em você fazer essas tres pesquisas no mesmo edit?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renan, pense um pouco... se ele não faz nenhum controle visualmente para saber por qual campo você quer pesquisar, é porque internamente ele controla o tipo de informação (se é integer, string) que o edit vai enviar e assim monta a sql dinamicamente antes de executar. Um meio simples de descobrir o tipo de dado que está sendo enviado (se é string ou integer) é tentar converter o valor do edit antes de o jogar para a sql num integer, dentro de um try except... o que você não pode é engessar seu sistema em uma query só de consulta porque não vai funcionar pesquisar em inteiros strings... uma forma simples de você fazer sua pesquisa é essa abaixo:

 

var codigo : Integer;
	  sSQL   : String;

try
	 codigo := StrToInt(Edit1.text);
	 sSQL   := 'SELECT * FROM tbcdentes WHERE codigoCedente = ' + IntToStr(codigo) + ' OR CodigodeBarras = ' + IntToStr(codigo);
except
	 sSQL   := 'SELECT * FROM tbcedentes WHERE Cedente LIKE ' + #39 + Edit1.Text + '%' + #39;
end;
sSQL := sSQL + ' Order by Cedente';
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(sSQL);
Query1.Open;

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum...agora sim acendeu uma luz aqui na cabeça

 

Na segunda vou ver isso com mais calma e volto aqui para dizer o que eu consegui fazer

 

obrigado pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.