Ir para conteúdo

POWERED BY:

Arquivado

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

Ademir Dalalibera

[Resolvido] Filtrar tabela access

Recommended Posts

Pessoal preciso de uma ajuda.

 

Estou fazendo um programa onde vai ter um combobox para selecionar o relatório.

 

Assim neste combobox carrego uma tabela de dados.

 

O que eu preciso é que os dados não se repitam dentro do combobox.

 

Por exemplo :

 

Clientes

 

Na tabela tem :

 

Registro 1 - Cliente A

 

Registro 2 - Cliente B

 

Registro 3 - Cliente A

 

Registro 4 - Cliente A

 

etc...

 

 

Queria que no combobox ficasse apenas :

 

Cliente A

Cliente B

 

Não se repetisse o cliente A tres vezes.

 

 

Valeu pela ajuda prestada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode criar uma rotina para fazer isso, como a abaixo:

 

function CarregaCombo(sSQL : String; qrySelecao : TQuery) : TStringList;
begin
  Result := TStringList.Create;
  qrySelecao.Clear;
  qrySelecao.Sql.ADD(sSQL);
  qrySelecao.Open;
  qrySelecao.First;
  while not qrySelecao.Eof do 
  begin
	  Result.Add(qrySelecao.Fields[0].AsString);
	  qrySelecao.Next;
  end;
end;

Ai, para chamar em seu código, basta fazer o seguinte:

 

combobox1.Items.Assign(CarregaCombo('SELECT DISTINCT NOME FROM SUA_TABELA ORDER BY NOME ASC', Query1));

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chrnos, estou com um problema no código.

 

Ele funciona bem quando é pra um combo, mas quando tento fazer pra mais de um ele dá um erro dizendo que o campo da tabela não existe.

 

Tentei fazer o seguinte :

 

Criei um Adoquery novo, e não adicionei nenhum campo da tabela nele.

 

Ai em tempo de execução faço o seguinte :

 

adoquery1.FieldByName('data');  

combobox1.items.Assign(carregacombo('select distinct data from posvendas order by data ASC', AdoQuery1));

 

Funciona sem problema, só que quando tento fazer o mesmo pro segundo combo no mesmo form :

 

adoquery1.FieldByName('cliente');  

combobox2.items.Assign(carregacombo('select distinct cliente from posvendas order by cliente ASC', AdoQuery1));

 

Ele dá um erro dizendo que o campo Cliente não existe.

 

Note que eu não consigo colocar todos os campos no adoquery1 antes de rodar o programa, por que dá o mesmo erro, quando rodo a rotina carrega combo.

 

Eu precisava descobrir como faz, para em tempo de execução, zerar os campos que ficam dentro do adoquery, ai funcionaria sem problema.

 

Uma outra solução que eu encontrei seria colocar mais de 1 adoquery (um para cada combo) em cada form, só não sei se isso não deixaria o programa muito lento.

 

Se puder me ajudar agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta o código completo de como está fazendo a carga dos combos e o tipo de combo que está usando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

 

Eu uso esses combos para selecionar os dados a serem impressos.

 

Então tenho 6 combos no formulário.

 

Neste form eu tenho 3 opções de relatório por Numero da Pesquisa, por Data e por Cliente (como é inicial e final, são 6 combos).

 

Eu coloquei no form 3 ADOQUERY e no evento : onenter de cada um o código abaixo

 

procedure TFormRelServicosEntregaTecnica.ComboBox1Enter(Sender: TObject);
begin
	combobox1.items.Assign(carregacombo('select distinct data from posvendas order by data ASC', AdoQuery2));
end;
procedure TFormRelServicosEntregaTecnica.ComboBox2Enter(Sender: TObject);
begin
	combobox2.items.Assign(carregacombo('select distinct data from posvendas order by data ASC', AdoQuery2));
end;
procedure TFormRelServicosEntregaTecnica.ComboBox3Enter(Sender: TObject);
begin
	combobox3.items.Assign(carregacombo('select distinct cliente from posvendas order by cliente ASC', AdoQuery3));
end;
procedure TFormRelServicosEntregaTecnica.ComboBox4Change(Sender: TObject);
begin
	combobox4.items.Assign(carregacombo('select distinct cliente from posvendas order by cliente ASC', AdoQuery3));
end;

 

Todos eles chamam a função que voce me passou :

 

function CarregaCombo(sSQL : String; qrySelecao : TAdoQuery) : TStringList;
begin
  Result := TStringList.Create;
  qryselecao.Sql.Clear;
  qrySelecao.Sql.ADD(sSQL);
  qrySelecao.Open;
  qrySelecao.First;
  while not qrySelecao.Eof do
	 begin
	   Result.Add(qrySelecao.Fields[0].AsString);
	   qrySelecao.Next;
	 end;
end;

Eu tentei usar só um Adoquery, só que com a função eu não posso ter mais de um campo dentro do Adoquery, se tiver ele retorna um erro.

Foi ai que eu tentei colocar os campos em tempo de execução, pra um até funciona, so que quando tenta o segundo ele dá o mesmo erro que se colocar direto no projeto.

Desta forma que eu fiz esta funcionando, só queria ver se tem como deixar só um adoquery no form. Reutilizar o mesmo para todos os combos.

 

E outra coisa não querendo ser chato, mas como faz para liberar um adoquery, por exemplo, quando eu carrego o combo ele tipo filtra a tabela, como eu faço pra tabela voltar ao normal.

 

Valeu por qualquer ajuda Chrnos, desculpe tomar teu tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o tipo do combo que está usando? DBCombobox ou Combobox normal? Isto influência em como irá trabalhar a rotina.

 

Outra coisa: o select distinct não altera em nada a sua tabela no banco... só filtra os dados retornados naquela consulta para trazer apenas o que você quer... fisicamente a sua tabela permanece inalterada no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver Chrnos.

 

Na parte que eu carregava o campo no Adoquery (não sei como chama aquela telinha que aparece quando voce dá dois cliques no componente, onde pode incluir os campos), eu não coloquei nada, deixei em branco, assim, pela própria chamada da função ele carrega o campo, e libera em seguida, ai não dá erro.

 

Assim consigo usar só um adoquery para os 6 combos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza, eu tinha esquecido de postar isso... outra coisa que pode fazer é antes de chamar a rotina incluir esta linha:

 

combobox.items.clear;

Isso limpa os items já carregados no combo em runtime.

 

[]'s

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.