Carregar campos de uma tabela em um combocox
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?
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
Curtidas 0
Melhor post
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.
Onde cdsDados seria o teu ClientDataSet, o cbbCampos é o ComboBox que eu coloquei no formulário.
Depois no OnChange do teu ComboBox coloca isso:
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.
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
11/07/2014
Cara você fez exatamente o que eu queria e adaptei ao meu código e funcionou perfeitamente.
GOSTEI 0
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.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
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?
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
11/07/2014
Se quiser me adicionar no skype é alegriaemteradeusnafamilia@msn.com
GOSTEI 0
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:
Att,
Thiago Irrazabal de Oliveira.
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
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]
[img:descricao=Erro de busca locate.]http://arquivo.devmedia.com.br/forum/imagem/192675-20140714-095921.png[/img]
GOSTEI 0
Thiago Irrazabal
11/07/2014
Esse campo, "ANASTASIA" existe no teu clientdataset ?
Att,
Thiago Irrazabal de Oliveira.
Att,
Thiago Irrazabal de Oliveira.
GOSTEI 0
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