Código SQL
Tenho uma DBGrid na qual aparence o campo ´Nome´ de minha tabela.
Selecionando o registro, envio para um ListBox.
Como eu posso criar um código SQL para me mostrar somente os nomes que estão no ListBox?
Selecionando o registro, envio para um ListBox.
Como eu posso criar um código SQL para me mostrar somente os nomes que estão no ListBox?
Rmarcelop
Curtidas 0
Respostas
Aroldo Zanela
15/04/2004
Colega,
Você pode utilizar uma construção de SQL dinâmica com operador IN.
Você pode utilizar uma construção de SQL dinâmica com operador IN.
GOSTEI 0
Rmarcelop
15/04/2004
Aqui vai o código que eu uso:
EmpresasNomes := ´´; for i := 0 to (FormEtiquetasEmpresas.ListBox1.Items.Count - 1) do begin FormEtiquetasEmpresas.ListBox1.ItemIndex := i; DmSGIMO.TbEmpresas.Locate(´Nome´, FormEtiquetasEmpresas.ListBox1.ItemIndex, []); EmpresasNomes := EmpresasNomes + ´´´+ListBox1.Items[i]+´´´; if i < (FormEtiquetasEmpresas.ListBox1.Items.Count - 1) then EmpresasNomes := EmpresasNomes + ´,´; end; with DmSGIMO.QryEtiquetasEmpresas do begin Close; SQL.Clear; SQL.Add(´SELECT Empresas.Nome, Empresas.Endereco, Empresas.Bairro, Empresas.Cep´); SQL.Add(´FROM Empresas´); SQL.Add(´WHERE Empresas.Nome = :NomeEmpresa´); SQL.Add(´ORDER BY Empresas.Nome´); ParamByName(´NomeEmpresa´).AsString := EmpresasNomes; Prepare; Open; end;
GOSTEI 0
Biriga
15/04/2004
caro colega, sugiro que vc faca como citado acima utlize o operador in
...
Sugiro tb que ao invés de trabalhar com nome trabalhe com o codigo
Veja esse codig acho que pode te ajudar
for i := 0 .....
CheckListBox1.AddItem(tabelaNOME.asstring,TObject (tabelaCODIGO.AsInteger));
end for
DEPOIS
Para vc recuperar o codgio utilize
strCODIGO := String (CheckListBox1.Items.Objects[i])
for i := 1 to CheckListBox1.Items.Count - 1 do begin
strCODIGO := strCODIGO + ´,´+String (CheckListBox1.Items.Objects[i])
end;
MONTA COMANDO SQL
SELECT * FROM TABELA WHERE CODIGO IN (strCODIGO)
...
Sugiro tb que ao invés de trabalhar com nome trabalhe com o codigo
Veja esse codig acho que pode te ajudar
for i := 0 .....
CheckListBox1.AddItem(tabelaNOME.asstring,TObject (tabelaCODIGO.AsInteger));
end for
DEPOIS
Para vc recuperar o codgio utilize
strCODIGO := String (CheckListBox1.Items.Objects[i])
for i := 1 to CheckListBox1.Items.Count - 1 do begin
strCODIGO := strCODIGO + ´,´+String (CheckListBox1.Items.Objects[i])
end;
MONTA COMANDO SQL
SELECT * FROM TABELA WHERE CODIGO IN (strCODIGO)
GOSTEI 0
Aroldo Zanela
15/04/2004
Colega,
Pode ser necessário fazer alguns acertos de nomes:
Pode ser necessário fazer alguns acertos de nomes:
function ConcatenarEmpresas: String; var nI, nX: Integer; begin Result := ´(´; nX := Form1.ListBox1.Items.Count-1; For nI := 0 to nX do begin Result := Result + QuotedStr(Form1.ListBox1.Items[nI]); if nI<nX then Result := Result + ´,´; end; Result := Result + ´)´; end; procedure TForm1.Button1Click(Sender: TObject); begin with DmSGIMO.QryEtiquetasEmpresas do begin Close; SQL.Clear; SQL.Add(´SELECT Empresas.Nome, Empresas.Endereco, Empresas.Bairro, Empresas.Cep´); SQL.Add(´FROM Empresas´); SQL.Add(´WHERE Empresas.Nome IN ´ + ConcatenarEmpresas); SQL.Add(´ORDER BY Empresas.Nome´); Prepare; Open; end; end;
GOSTEI 0
Rmarcelop
15/04/2004
function ConcatenarEmpresas: String;
var nI, nX: Integer;
begin
Result := ´(´;
nX := Form1.ListBox1.Items.Count-1;
For nI := 0 to nX do
begin
Result := Result + QuotedStr(Form1.ListBox1.Items[nI]);
if nI<nX then Result := Result + ´,´;
end;
Result := Result + ´)´;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with DmSGIMO.QryEtiquetasEmpresas do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT Empresas.Nome, Empresas.Endereco, Empresas.Bairro, Empresas.Cep´);
SQL.Add(´FROM Empresas´);
SQL.Add(´WHERE Empresas.Nome IN ´ + ConcatenarEmpresas);
SQL.Add(´ORDER BY Empresas.Nome´);
Prepare;
Open;
end;
end;
Desse jeito, se eu seleciono 3 registros e mando para o ListBox, o SELECT me retorna 3 registros também, porém 3 registros iguais ao último item do ListBox.
O que pode estar dando errado?
Desde jpa agradeço as dicas postadas para mim.
var nI, nX: Integer;
begin
Result := ´(´;
nX := Form1.ListBox1.Items.Count-1;
For nI := 0 to nX do
begin
Result := Result + QuotedStr(Form1.ListBox1.Items[nI]);
if nI<nX then Result := Result + ´,´;
end;
Result := Result + ´)´;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with DmSGIMO.QryEtiquetasEmpresas do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT Empresas.Nome, Empresas.Endereco, Empresas.Bairro, Empresas.Cep´);
SQL.Add(´FROM Empresas´);
SQL.Add(´WHERE Empresas.Nome IN ´ + ConcatenarEmpresas);
SQL.Add(´ORDER BY Empresas.Nome´);
Prepare;
Open;
end;
end;
Desse jeito, se eu seleciono 3 registros e mando para o ListBox, o SELECT me retorna 3 registros também, porém 3 registros iguais ao último item do ListBox.
O que pode estar dando errado?
Desde jpa agradeço as dicas postadas para mim.
GOSTEI 0
Aroldo Zanela
15/04/2004
Colega,
Fiz uma simulação aqui e a instrução SQL retornada é:
Ou seja, todos os registros das empresas UM, DOIS e TRES serão recuperados.
Fiz uma simulação aqui e a instrução SQL retornada é:
SELECT Empresas.Nome, Empresas.Endereco, Empresas.Bairro, Empresas.Cep FROM Empresas WHERE Empresas.Nome IN (´UM´,´DOIS´,´TRES´) ORDER BY Empresas.Nome
Ou seja, todos os registros das empresas UM, DOIS e TRES serão recuperados.
GOSTEI 0
Rmarcelop
15/04/2004
Caro colega Aroldo Zanela,
estou testando o seu SELECT no SQL Builder do Delphi 5 e realmente só me retorna o valor do último item (na sua simulação o ´TRES´).
Não sei o que pode estar acontecendo, até porque já olhei a function que você me passou e não verifiquei discordancia nenhuma.
Mais uma vez agradeço a atenção.
estou testando o seu SELECT no SQL Builder do Delphi 5 e realmente só me retorna o valor do último item (na sua simulação o ´TRES´).
Não sei o que pode estar acontecendo, até porque já olhei a function que você me passou e não verifiquei discordancia nenhuma.
Mais uma vez agradeço a atenção.
GOSTEI 0
Rmarcelop
15/04/2004
Caro amigo Aroldo Zanela,
Verifiquei aqui e realmente você está certo.
Obrigado pela a sua ajuda e obrigado a todos que me ajudaram também.
Verifiquei aqui e realmente você está certo.
Obrigado pela a sua ajuda e obrigado a todos que me ajudaram também.
GOSTEI 0