Fórum Código SQL #226300
15/04/2004
0
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
Curtir tópico
+ 0Posts
15/04/2004
Aroldo Zanela
Você pode utilizar uma construção de SQL dinâmica com operador IN.
Gostei + 0
15/04/2004
Rmarcelop
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
15/04/2004
Biriga
...
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
15/04/2004
Aroldo Zanela
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
15/04/2004
Rmarcelop
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
15/04/2004
Aroldo Zanela
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
15/04/2004
Rmarcelop
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
15/04/2004
Rmarcelop
Verifiquei aqui e realmente você está certo.
Obrigado pela a sua ajuda e obrigado a todos que me ajudaram também.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)