Carregar campos de uma tabela em um combocox

Delphi

11/07/2014

Boa tarde, galera precisava saber como faço para carregar um combobox todos os campo (DisplayName) de uma ClienteDataSet, para com isso servir de parametro de pesquisa em um Locate,

Exemplo
Na minha tabela tem os campos assim
Exemplo:
Tabela de Clientes
Campos
CIDCliente
CFantasia
CRazaoSocial
......

Os Display name destes campo seria o renomeado por mim dentro do delphi.
Exemplo
CIDCliente = Código
CFantasia = Fantasia
CRazaoSocial = Razão Social

Ai eu tenho uma que carregar o Combo com todos os DisplayNames pois é fácil o cliente reconhecer o que é.
Só que na hora de pesquisar seja passado internamente o nome do campo original e assim seja efetuada a pesquisa.


Alguém ai pode me ajudar?
Jeová Santos

Jeová Santos

Curtidas 0

Melhor post

Thiago Irrazabal

Thiago Irrazabal

11/07/2014

Boa tarde, se te entendi seria algo como isso:

no OnShow do Formulário vamos popular o ComboBox com os campos do ClientDataSet.
var
  I: Integer;
begin
  cdsDados.CreateDataSet;

  for I := 0 to cdsDados.Fields.Count - 1 do
    cbbCampos.Items.Add(cdsDados.Fields[I].DisplayName);
end;

Onde cdsDados seria o teu ClientDataSet, o cbbCampos é o ComboBox que eu coloquei no formulário.

Depois no OnChange do teu ComboBox coloca isso:
var
  I: Integer;
begin
  for I := 0 to cdsDados.Fields.Count - 1 do
    if cdsDados.Fields[I].DisplayName = cbbCampos.Text then
      lblFieldName.Caption := cdsDados.Fields[I].FieldName;
end;

Onde lblFieldName é um Label que eu coloquei pra ele te mostrar o nome "Interno" do campo, agora só adaptar ao teu código, abraço.



Att,
Thiago Irrazabal de Oliveira.
GOSTEI 1

Mais Respostas

Jeová Santos

Jeová Santos

11/07/2014

Cara você fez exatamente o que eu queria e adaptei ao meu código e funcionou perfeitamente.
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

11/07/2014

Beleza, que bom que funcionou... qualquer dúvida só postar que sempre tem alguém disposto a ajudar, abraço.


Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Jeová Santos

Jeová Santos

11/07/2014

olha carregou e tal, veja meu código

unit ufrmPrincipal;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.FMTBcd, Data.DBXFirebird, Data.DB,
Data.SqlExpr, Datasnap.DBClient, Datasnap.Provider, Vcl.Grids, Vcl.DBGrids,
Vcl.StdCtrls, Vcl.Buttons;

type
TfrmClientes = class(TForm)
GroupBox1: TGroupBox;
cbxCampoFiltro: TComboBox;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
Clientes: TSQLConnection;
edPesquisa: TEdit;
btnPesquisa: TBitBtn;
ClientDataSet1CIDCliente: TIntegerField;
ClientDataSet1CFantasia: TIntegerField;
ClientDataSet1CRazao: TIntegerField;
ClientDataSet1CEndereco: TIntegerField;
ClientDataSet1CBairro: TIntegerField;
ClientDataSet1CCidade: TIntegerField;
ClientDataSet1CAtivo: TIntegerField;
procedure btnPesquisaClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure cbxCampoFiltroChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmClientes: TfrmClientes;
vCampo:string;

implementation

{$R *.dfm}

procedure TfrmClientes.btnPesquisaClick(Sender: TObject);
begin
ClientDataSet1.Locate(vCampo,edPesquisa.Text,[loCaseInsensitive,loPartialKey]);
end;

procedure TfrmClientes.cbxCampoFiltroChange(Sender: TObject);
var
I: Integer;
begin
for I := 0 to ClientDataSet1.Fields.Count - 1 do
if ClientDataSet1.Fields[I].DisplayName = cbxCampoFiltro.Text then
vCampo := ClientDataSet1.Fields[I].FieldName;

end;

procedure TfrmClientes.FormShow(Sender: TObject);
var
I: Integer;
begin
ClientDataSet1.Open;

for I := 0 to ClientDataSet1.Fields.Count - 1 do
cbxCampoFiltro.Items.Add(ClientDataSet1.Fields[I].DisplayName);
end;

end.

Qaundo digito dentro do meu edPesquisa e peço pra localizar ele diz que :

First chance exception at $7514812F. Exception class EDatabaseError with message 'ClientDataSet1: Field 'terra' not found'. Process Cliente.exe (8876)

O que fazer?
GOSTEI 0
Jeová Santos

Jeová Santos

11/07/2014

Se quiser me adicionar no skype é alegriaemteradeusnafamilia@msn.com
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

11/07/2014

Troca essa parte do teu código:

procedure TfrmClientes.btnPesquisaClick(Sender: TObject);
begin
ClientDataSet1.Locate(vCampo,edPesquisa.Text,[loCaseInsensitive,loPartialKey]);
end;


Troca por isso:
procedure TfrmClientes.btnPesquisaClick(Sender: TObject);
begin
  if (vCampo <> '') and (edPesquisa.Text <> '') then
    ClientDataSet1.Locate(vCampo, VarArrayOf([edPesquisa.Text]), []);
end;



Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Jeová Santos

Jeová Santos

11/07/2014

Amigo Tiago, o erro é o mesmo veja na imagem abaixo.
[img:descricao=Erro de busca locate.]http://arquivo.devmedia.com.br/forum/imagem/192675-20140714-095921.png[/img]
GOSTEI 0
Thiago Irrazabal

Thiago Irrazabal

11/07/2014

Esse campo, "ANASTASIA" existe no teu clientdataset ?


Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
Jeová Santos

Jeová Santos

11/07/2014

Thiago, esse ANASTASIA é uma pesquisa ou seja um texto que coloquei dentro do edpesquisa.text e ele interpreta tudo dentro dele como campo do dataset, isso é que é estranho.
GOSTEI 0
POSTAR