Fórum Código SQL #226300

15/04/2004

0

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?


Rmarcelop

Rmarcelop

Responder

Posts

15/04/2004

Aroldo Zanela

Colega,

Você pode utilizar uma construção de SQL dinâmica com operador IN.


Responder

Gostei + 0

15/04/2004

Rmarcelop

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;



Responder

Gostei + 0

15/04/2004

Biriga

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)


Responder

Gostei + 0

15/04/2004

Aroldo Zanela

Colega,

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;



Responder

Gostei + 0

15/04/2004

Rmarcelop

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.


Responder

Gostei + 0

15/04/2004

Aroldo Zanela

Colega,

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.


Responder

Gostei + 0

15/04/2004

Rmarcelop

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.


Responder

Gostei + 0

15/04/2004

Rmarcelop

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar