Ir para conteúdo

POWERED BY:

Arquivado

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

marcos moreno

SQL em delphi

Recommended Posts

Ola a todos

Tenho um programa em delphi com banco de dados em Mysql conectado ao componente zeos

Preciso entao da seguinte ajuda para uma busca que nao estou conseguido realizar

Tenho uma tabela de unidades de medidas que tem o seguintes campo:

codigo descricao simbolo e situacao

 

num form tenho um edit, um combobox e um dbgrid tudo ja ta funcionando corretamente

o edit vai ser feita um Select Where para localizar nos campos (codigo, descricao e simbolo)

isso eu ja consegui mas nao estou conseguido que o combo box filtre pela situacao

ex: Ativo, Inativo

entao quando eu selcionar no combobox o item ativo o edit voltar somente os campos que

ativos e que estao no edit

 

Select * from unidades_despesa

where situacao = " + cbSituacao.text + "

isso faz com que venha somente o que esta no combobox

 

agora como eu faco isso pra vir tambem o do edit mas somente o q esta com o resultado do combobox

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou montar seu where conforme os campos preenchidos e utilizar o AND????

 

Select * from tabela
where campoA = 'X'
and campoB = 'Y'

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chrnos obrigado pela resposta

Mas o problema esta sendo na lógica tenho que acionar o Where com todos os campo exceto o situação porque quando eu selecionar o campo situação com ativo tem que vir todos os dados ativo da tabela e isso ta vindo mas quando eu escrevo algo no edit os tem que filtrar dos campos codigo descricao e símbolo mas tem q ser tudo junto por exemplo:

 

DM.ZQUnidade.SQL.Add('SELECT * FROM UNIDADE_FORNECIMENTO');

DM.ZQUnidade.SQL.Add('WHERE SITUACAO = "' + cbSituacao.Text + '"');

DM.ZQUnidade.SQL.Add('AND CODIGO = "' + edLocalizar.Text + '"');

DM.ZQUnidade.SQL.Add('AND DESCRICAO = "' + edLocalizar.Text + '"');

DM.ZQUnidade.SQL.Add('AND SIMBOLO = "' + edLocalizar.Text + '"');

 

Ou se eu usar o OR também não funciona o problema ta sendo em deixar visível somente os itens que estão ta coluna situação (ativo ou inativo) e fazer a busca pelos outros campos.

Eu precisava d um comando do tipo NULL ou NOT NULL

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está o código desta sua pesquisa? Você controla como qual é o campo a ser usado de filtro de pesquisa? No exemplo que postou acima, como você sabe se o dado informado no edLocalizar é para ser usado como filtro de pesquisa no campo codigo ou no campo descrição ou no campo símbolo? Poste o código completo do seu botão de pesquisa ok?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chrnos obrigado pela resposta

Aki vai o codigo mas nao mudo quase nada

 

edLocalizar é um Edit onde eu vou digira o que vai ser procurado na tabela mais tem q ser procurado conforme o que estiver dentro do edLituacao (ComboBox) que pode ser ATIVO ou INATIVO

 

DM.ZQUnidade.Active := false;

DM.ZQUnidade.SQL.Clear;

DM.ZQUnidade.SQL.Add('SELECT * FROM UNIDADE_FORNECIMENTO');

DM.ZQUnidade.SQL.Add('WHERE SITUACAO LIKE "' + edSituacao.Text + '%"');

DM.ZQUnidade.SQL.Add('AND CODIGO LIKE "%' + edLocalizar.Text + '%"');

DM.ZQUnidade.SQL.Add('AND DESCRICAO LIKE "%' + edLocalizar.Text + '%"');

DM.ZQUnidade.SQL.Add('AND SIMBOLO LIKE "%' + edLocalizar.Text + '%"');

 

DM.ZQUnidade.Active := true;

 

ex:

 

CODIGO DESCRICAO SIMBOLO SITUACAO

1 kilo kl ativo

2 litro lt inativo

3 frasco fr ativo

4 pacote pct inativo

5 fardo frd ativo

6 garrafa gf ativo

7 metro mt ativo

8 centimetro cm ativo

 

esta é um exemploa da tabela preciso separa por situacao, ai quando eu digitar alguma coisa (ex: like "%a%") vai aparecer todos os campos inativos e ativos mas nao é para aparecer como faco isso

 

grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcos seria interessante você tratar essa condição antes de executar a query, + ou - assim:

 

if cbSituacao.Text = 'Ativo' then

begin

Busca todos os ativos

end

 

E do mesmo modo com o 'inativo'.

 

è uma idéia, Valeu !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos por partes... primeiro, está um pouco estranho o modo como você hoje faz sua pesquisa, independente de estar passando o valor do combo situação.... Digo isto porque sua pesquisa usa um like em campos que, no modelo que postou aqui, são numéricos (codigo) e obriga que a expressão de busca informada no edLocalizar.Text exista ao mesmo tempo nos campos CODIGO, DESCRICAO e SIMBOLO, o que convenhamos não é uma idéia muito boa... afinal, se eu escrever como expressão de busca a palavra garrafa e ativo, da forma atual que sua query está sendo montada, eu não vou conseguir retornar nenhum registro do BD (considerando o modelo de dados que postou aqui).

 

Uma coisa que eu costumo fazer neste tipo de situação é montar uma query dinâmica, filtrando a busca por algum campo pré-definido que o próprio usuário escolhe. Digamos que para isso eu tenha em um combobox as escolhas do campo utilizado como filtro de pesquisa (onde apareceria as opções CODIGO, DESCRIÇÃO e SÍMBOLO) e o combo de situação, que poderiam ou não ser preenchidos. A rotina, neste caso, poderia ser montada +/- desta forma.

 

var sSQL ,
	sParametro : String;
begin
 //Inicializa as variáveis
	sSQL := EmptyStr;
	sParametro := EmptyStr;
 
	sSQL := 'SELECT * FROM UNIDADE FORNECIMENTO ';
 
 //Montagem do filtro
 Case cbFiltros.ItemIndex of
  0: begin
   sParametro  := 'Codigo';
   sSQL  := sSQL + 'Where CODIGO LIKE "%:Codigo%" ';
 	end;
  1: begin
   sParametro := 'Descricao';
   sSQL  := sSQL + 'Where DESCRICAO LIKE "%:Descricao%" ';
 	end;
  2: begin
   sParametro := 'Simbolo';
   sSQL  := sSQL + 'Where SIMBOLO LIKE "%:Simbolo%" ';
 	end;
 end;
 
 if edSituacao.ItemIndex > -1 then //Combobox teve um valor selecionado
 begin
  if edSituacao.ItemIndex = 0 then
  begin
   if sParametro <> EmptyStr then
    sSQL  := sSQL + 'and SITUACAO = "ATIVO" '
   else
    sSQL  := sSQL + 'Where SITUACAO = "ATIVO" '   
  end
  else
  begin
   if sParametro <> EmptyStr then
    sSQL  := sSQL + 'and SITUACAO = "INATIVO" '
   else
    sSQL  := sSQL + 'Where SITUACAO = "INATIVO" '   
  end;
 end;
   
 //Finalizando a busca
 DM.ZQUnidade.Close;
 DM.ZQUnidade.SQL.Clear;
 DM.ZQUnidade.SQL.Add(sSQL);
   
 if sParametro <> EmptyStr then
  DM.ZQUnidade.ParamByName(sParametro).AsString := QuotedStr(edLocalizar.Text);
 
 DM.ZQUnidade.Open;
end;

Obs.: Não testei este código aqui, pois onde trabalho atualmente não utilizamos o delphi.

Pode ser necessário ajustes no código em alguns pontos, pois parti da premissa que todos os campos da sua tabela são strings para montar este exemplo.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola de novo chrnos e muito obrigado pela ajuda mas eu fucei e aki e consegui mas valeu pela ajuda

 

aki vai o fonte fico meio loko mas funciono, pensei q iria ficar meio lento com muitos dados por causa do loop mas nao fico nao fiz um teste com mais de 10000 campos e foi rapidim

 

var

contsql : TStrings;

rcod : Integer;

sSQL, sParametro : String;

begin

DataSource.DataSet := nil;

DM.ZQUnidade.Active := false;

DM.ZQUnidade.SQL.Clear;

DM.ZQUnidade.SQL.Add('SELECT * FROM UNIDADE_FORNECIMENTO');

DM.ZQUnidade.SQL.Add('WHERE CODIGO LIKE "%' + edLocalizar.Text + '%"');

DM.ZQUnidade.SQL.Add('OR SIMBOLO LIKE "%' + edLocalizar.Text + '%"');

DM.ZQUnidade.SQL.Add('OR DESCRICAO LIKE "%' + edLocalizar.Text + '%"');

DM.ZQUnidade.Active := true;

 

if edSituacao.Text = '' then

begin

DataSource.DataSet := DM.ZQUnidade;

Exit;

end;

contsql := TStringList.Create;

DM.ZQUnidade.First;

while not DM.ZQUnidade.Eof do

begin

if DM.ZQUnidade.FieldByName('situacao').Text = edSituacao.Text then

begin

contsql.Add(DM.ZQUnidade.FieldByName('codigo').Text);

end;

DM.ZQUnidade.Next;

end;

if contsql.Text = '' then

begin

DM.ZQUnidade.EmptyDataSet;

DataSource.DataSet := DM.ZQUnidade;

Exit;

end;

 

DM.ZQUnidade.Active := false;

DM.ZQUnidade.SQL.Clear;

DM.ZQUnidade.SQL.Add('SELECT * FROM UNIDADE_FORNECIMENTO');

DM.ZQUnidade.SQL.Add('WHERE CODIGO IN (' + contsql.CommaText + ')');

DM.ZQUnidade.Active := true;

DataSource.DataSet := DM.ZQUnidade;

contsql.Free;

 

c tiver algo pra melhorar, agradeco, gostaria q fosse em sql pq acho mais rapido do que criar loops

 

grato a todos

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.