Pegar valor do Descriptions das Tabelas
Oi, boa tarde alguém conhece alguma maneira de pegar as informações que coloco em cada Description de uma tabela e colocar no título da coluna de um Dbgrid e também povoar um combobox?
Vi isso em um sistema onde trabalho e gostei da maneira como foi feita, mas não consegui obter informações de como se fazer isso. Tentei fazer aqui, mas só consegui pegar as infomações do Display Label do ClientDataSet.
Se alguém puder me ajudar agredeço.
Adilson Rumao
Curtidas 0
Respostas
America Informatica
15/12/2010
Oi, boa tarde alguém conhece alguma maneira de pegar as informações que coloco em cada Description de uma tabela e colocar no título da coluna de um Dbgrid e também povoar um combobox?
Vi isso em um sistema onde trabalho e gostei da maneira como foi feita, mas não consegui obter informações de como se fazer isso. Tentei fazer aqui, mas só consegui pegar as infomações do Display Label do ClientDataSet.
Se alguém puder me ajudar agredeço.
Vi isso em um sistema onde trabalho e gostei da maneira como foi feita, mas não consegui obter informações de como se fazer isso. Tentei fazer aqui, mas só consegui pegar as infomações do Display Label do ClientDataSet.
Se alguém puder me ajudar agredeço.
GOSTEI 0
Leonardo Xavier
15/12/2010
achei alguma coisa mas nao testei.Testa ai e posta aqui. Abraços
var a:WideString; begin a:=dados.ADODataSet1.Sort; showmessage(a);
GOSTEI 0
Adilson Rumao
15/12/2010
Não sei se seria só isso, mas fiz assim:
Eu uso assim:
SqlDataSet - DataSetProvider - ClientDataSet
Neste caso em específico não achei do jeito que você me passou ent~eo estou testando no SqlDataSet mesmo.
Mesmo assim apesar de não reportar erro, não mostra nada.
procedure TfrmTeste.Button1Click(Sender: TObject); var aLista: WideString; begin aLista:= sdsClientes.SortFieldNames; ShowMessage(aLista); end;
GOSTEI 0
Adilson Rumao
15/12/2010
Olá galera, alguém para dar uma luz?
GOSTEI 0
Adilson Rumao
15/12/2010
Olá galera, alguém para dar uma luz?
Ae galera, um bom Natal atrasado a todos.
Alguém para dar uma dica?
GOSTEI 0
Paulo Andrade
15/12/2010
Olá galera, alguém para dar uma luz?
Ae galera, um bom Natal atrasado a todos.
Alguém para dar uma dica?
tha dando esse erro:GOSTEI 0
Adilson Rumao
15/12/2010
Olá Paulo, acredito que a mensagem que você me mandou está com erro.
GOSTEI 0
Deivison Melo
15/12/2010
Já experimentou utilizar o banco de dados para buscar essas informações? ou sua aplicação é multi-banco? coisa que você queria amarrar as informações via telas (sistema) sem amarrar ao banco (usando funções do próprio banco para buscar tais informações, variando de banco para banco).
GOSTEI 0
Adilson Rumao
15/12/2010
Então eu uso o Firebird e não vou trabalhar múlti-banco.
Estou querendo fazer como na imagem a baixo. O que tem no descriptiom de cada tabela povoar no combobox.
Queria fazer assim, prq aí já finha tudo no mesmo padrão. Vi isso em um sistema e gostei por isso estou tentando fazer igual.
Valewu pelas dicas.
GOSTEI 0
Adilson Rumao
15/12/2010
E aí galera blz? Voltei para tentar resolver esta questão.
Então no meu banco de dados sempre coloco os Descritions. Como abaixo.
Gostaria de aproveitar estas informações em um Combobox: Para ficar assim:
O Combobox que uso hoje funciona normalmente, mas pegos as informações do DisplayLabel, mas tenho que ficar alterando todos eles no CDS de cada tabela.
Como já faço isso ao criar as tabelas queria reaproveitar estas informações, mas não estou conseguindo.
Tentei fazer algum usando: RDB$DESCRIPTION mas, não estou conseguinfo filtrar as informações.
Se alguém pider ajudar, agradeço.
Então no meu banco de dados sempre coloco os Descritions. Como abaixo.
Gostaria de aproveitar estas informações em um Combobox: Para ficar assim:
O Combobox que uso hoje funciona normalmente, mas pegos as informações do DisplayLabel, mas tenho que ficar alterando todos eles no CDS de cada tabela.
Como já faço isso ao criar as tabelas queria reaproveitar estas informações, mas não estou conseguindo.
Tentei fazer algum usando: RDB$DESCRIPTION mas, não estou conseguinfo filtrar as informações.
Se alguém pider ajudar, agradeço.
GOSTEI 0
Rafael Mattos
15/12/2010
Select R.Rdb$Field_Name,
R.Rdb$DESCRIPTION
from rdb$Relation_Fields R, RDB$FIELDS F
where R.Rdb$Relation_Name = :NAME and F.rdb$field_name=R.Rdb$field_source
order by R.rdb$field_position, R.rdb$field_name
http://mundodoprogramador.wordpress.com/2011/05/16/sqls-interessantes-que-voce-pode-precisar-um-dia-firebird/
--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
GOSTEI 0
Rafael Mattos
15/12/2010
Select R.Rdb$Field_Name,
R.Rdb$DESCRIPTION
from rdb$Relation_Fields R, RDB$FIELDS F
where R.Rdb$Relation_Name = :NAME and F.rdb$field_name=R.Rdb$field_source
order by R.rdb$field_position, R.rdb$field_name
http://mundodoprogramador.wordpress.com/2011/05/16/sqls-interessantes-que-voce-pode-precisar-um-dia-firebird/
--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
R.Rdb$DESCRIPTION
from rdb$Relation_Fields R, RDB$FIELDS F
where R.Rdb$Relation_Name = :NAME and F.rdb$field_name=R.Rdb$field_source
order by R.rdb$field_position, R.rdb$field_name
http://mundodoprogramador.wordpress.com/2011/05/16/sqls-interessantes-que-voce-pode-precisar-um-dia-firebird/
--------------------------------------------------------------------------------
Blog: http://mundodoprogramador.wordpress.com/
MSN: rafmattos@hotmail.com
Twitter: _rafmattos
GOSTEI 0
Emerson Nascimento
15/12/2010
a instrução deve ser como esta abaixo:
select rf.rdb$field_name nome, rf.rdb$field_id id, rf.rdb$field_position posicao, rf.rdb$description descricao from rdb$relations r
inner join rdb$relation_fields rf on rf.rdb$relation_name = r.rdb$relation_name
where r.rdb$relation_name = 'NOME_DA_SUA_TABELA'
ocorre que o campo description é um memo, então você precisa fazer o tratamento necessário para obter o valor dele.
select rf.rdb$field_name nome, rf.rdb$field_id id, rf.rdb$field_position posicao, rf.rdb$description descricao from rdb$relations r
inner join rdb$relation_fields rf on rf.rdb$relation_name = r.rdb$relation_name
where r.rdb$relation_name = 'NOME_DA_SUA_TABELA'
ocorre que o campo description é um memo, então você precisa fazer o tratamento necessário para obter o valor dele.
GOSTEI 0
Adilson Rumao
15/12/2010
Olá galera estive queimando a cachola aqui, mas ainda não consegui fazer funcionar.
A instrução que me passaram, roda de boa no IBExpert.
Estou tentando povoar o Combobox, mas ainda nada. Alguém pode dar uma olhada na minha Unit de teste?
Fiz a instrução abaixo, mas não estou entendendo como jogar ela para peencher ele.
A instrução que me passaram, roda de boa no IBExpert.
Estou tentando povoar o Combobox, mas ainda nada. Alguém pode dar uma olhada na minha Unit de teste?
Fiz a instrução abaixo, mas não estou entendendo como jogar ela para peencher ele.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WideStrings, DBXFirebird, FMTBcd, DB, SqlExpr, Provider,
DBClient;
type
TForm2 = class(TForm)
cbxField: TComboBox;
Conn: TSQLConnection;
sdsEstados: TSQLDataSet;
dspEstados: TDataSetProvider;
cdsEstados: TClientDataSet;
cdsEstadosCODIGO: TIntegerField;
cdsEstadosMARCA: TStringField;
cdsEstadosATIVO: TStringField;
cdsEstadosNOME: TStringField;
cdsEstadosSIGLA: TStringField;
cdsEstadosICMS: TIntegerField;
cdsEstadosIBGE: TIntegerField;
cdsEstadosDATAINC: TSQLTimeStampField;
cdsEstadosDATAALT: TSQLTimeStampField;
cdsEstadosRESPONSAVEL: TIntegerField;
DS: TDataSource;
private
function GetCampos(tablename: string): integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
function TForm2.GetCampos(tablename: string): integer;
var
Qry : TSQLQuery;
begin
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := Conn;
Qry.SQL.Add('select rf.rdb$description descricao from rdb$relations r inner join rdb$relation_fields rf on rf.rdb$relation_name = r.rdb$relation_name where r.rdb$relation_name = '+tablename+'');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
end;
end.
GOSTEI 0
Adilson Rumao
15/12/2010
Olá galera estive queimando a cachola aqui, mas ainda não consegui fazer funcionar.
A instrução que me passaram, roda de boa no IBExpert.
Estou tentando povoar o Combobox, mas ainda nada. Alguém pode dar uma olhada na minha Unit de teste?
Fiz a instrução abaixo, mas não estou entendendo como jogar ela para peencher ele.
A instrução que me passaram, roda de boa no IBExpert.
Estou tentando povoar o Combobox, mas ainda nada. Alguém pode dar uma olhada na minha Unit de teste?
Fiz a instrução abaixo, mas não estou entendendo como jogar ela para peencher ele.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WideStrings, DBXFirebird, FMTBcd, DB, SqlExpr, Provider,
DBClient;
type
TForm2 = class(TForm)
cbxField: TComboBox;
Conn: TSQLConnection;
sdsEstados: TSQLDataSet;
dspEstados: TDataSetProvider;
cdsEstados: TClientDataSet;
cdsEstadosCODIGO: TIntegerField;
cdsEstadosMARCA: TStringField;
cdsEstadosATIVO: TStringField;
cdsEstadosNOME: TStringField;
cdsEstadosSIGLA: TStringField;
cdsEstadosICMS: TIntegerField;
cdsEstadosIBGE: TIntegerField;
cdsEstadosDATAINC: TSQLTimeStampField;
cdsEstadosDATAALT: TSQLTimeStampField;
cdsEstadosRESPONSAVEL: TIntegerField;
DS: TDataSource;
private
function GetCampos(tablename: string): integer;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
function TForm2.GetCampos(tablename: string): integer;
var
Qry : TSQLQuery;
begin
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := Conn;
Qry.SQL.Add('select rf.rdb$description descricao from rdb$relations r inner join rdb$relation_fields rf on rf.rdb$relation_name = r.rdb$relation_name where r.rdb$relation_name = '+tablename+'');
Qry.Open;
Result := Qry.Fields[0].AsInteger;
end;
end.
GOSTEI 0
Emerson Nascimento
15/12/2010
para não ter problema quanto ao envolvimento da string entre as aspas, use QuotedStr().
outra coisa: porque você está retornando um inteiro? você não quer uma string com a descrição? não entendi essa parte....
de qualquer forma vai aí a minha sugestão:
// procedimento para extrair a descrição de todos os campos da tabela.
// o retorno será uma StringList no formato CAMPO=DESCRICAO.
// se a descricao estiver vazia, será considerado o próprio nome do campo.
// a descrição pode ter mais de uma linha. se quiser retornar todas as linhas basta
// desconsiderar o uso da função Linha1(), que pode ser observada na linha
// Descricao := Trim(Linha1(Qry.FieldByName('descricao').AsString));
procedure TForm1.GetCampos(tablename: string; var Listagem: TStringList);
var
Qry : TSQLQuery;
Campo, Descricao: string;
function Linha1(Texto: string): string;
var
i: integer;
begin
Result := '';
if Length(Texto)>0 then
for i := 1 to Length(Texto) do
begin
if Texto[i] in [#13, #10] then break;
Result := Result + Texto[i];
end;
end;
begin
Listagem.Clear;
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := SQLConnection1;
Qry.SQL.Add('select rdb$field_name campo, rdb$description descricao');
Qry.SQL.Add('from rdb$relation_fields where rdb$relation_name = '+QuotedStr(tablename));
Qry.Open;
while not Qry.Eof do
begin
Campo := Trim(Qry.FieldByName('campo').AsString);
if Trim(Qry.FieldByName('descricao').AsString)='' then
Descricao := Campo
else
Descricao := Trim(Linha1(Qry.FieldByName('descricao').AsString));
Listagem.Add(Campo+'='+Descricao);
Qry.Next;
end;
end;
// para usar a rotina acima será necessário declarar uma variável de tipo TStringList
// e depois usar seu conteúdo como desejar:
procedure TForm1.Button1Click(Sender: TObject);
var
Lista: TStringList;
begin
Lista := TStringList.Create;
GetCampos('ICMS', Lista);
Memo1.Lines.Assign(Lista);
end;
//pode também ser ausada assim:
procedure TForm1.Button2Click(Sender: TObject);
var
Lista: TStringList;
begin
Lista := TStringList.Create;
GetCampos('ICMS', Lista);
ShowMessage('Conteúdo do campo '+EditNomeCampo.Text+#13+Lista.Values[EditNomeCampo.Text]);
end;
note que está sendo usado o recurso da própria StringList para obter a descricao do campo. No caso, Values[].
outra coisa: porque você está retornando um inteiro? você não quer uma string com a descrição? não entendi essa parte....
de qualquer forma vai aí a minha sugestão:
// procedimento para extrair a descrição de todos os campos da tabela.
// o retorno será uma StringList no formato CAMPO=DESCRICAO.
// se a descricao estiver vazia, será considerado o próprio nome do campo.
// a descrição pode ter mais de uma linha. se quiser retornar todas as linhas basta
// desconsiderar o uso da função Linha1(), que pode ser observada na linha
// Descricao := Trim(Linha1(Qry.FieldByName('descricao').AsString));
procedure TForm1.GetCampos(tablename: string; var Listagem: TStringList);
var
Qry : TSQLQuery;
Campo, Descricao: string;
function Linha1(Texto: string): string;
var
i: integer;
begin
Result := '';
if Length(Texto)>0 then
for i := 1 to Length(Texto) do
begin
if Texto[i] in [#13, #10] then break;
Result := Result + Texto[i];
end;
end;
begin
Listagem.Clear;
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := SQLConnection1;
Qry.SQL.Add('select rdb$field_name campo, rdb$description descricao');
Qry.SQL.Add('from rdb$relation_fields where rdb$relation_name = '+QuotedStr(tablename));
Qry.Open;
while not Qry.Eof do
begin
Campo := Trim(Qry.FieldByName('campo').AsString);
if Trim(Qry.FieldByName('descricao').AsString)='' then
Descricao := Campo
else
Descricao := Trim(Linha1(Qry.FieldByName('descricao').AsString));
Listagem.Add(Campo+'='+Descricao);
Qry.Next;
end;
end;
// para usar a rotina acima será necessário declarar uma variável de tipo TStringList
// e depois usar seu conteúdo como desejar:
procedure TForm1.Button1Click(Sender: TObject);
var
Lista: TStringList;
begin
Lista := TStringList.Create;
GetCampos('ICMS', Lista);
Memo1.Lines.Assign(Lista);
end;
//pode também ser ausada assim:
procedure TForm1.Button2Click(Sender: TObject);
var
Lista: TStringList;
begin
Lista := TStringList.Create;
GetCampos('ICMS', Lista);
ShowMessage('Conteúdo do campo '+EditNomeCampo.Text+#13+Lista.Values[EditNomeCampo.Text]);
end;
note que está sendo usado o recurso da própria StringList para obter a descricao do campo. No caso, Values[].
GOSTEI 0
Adilson Rumao
15/12/2010
Mano não to entendendo este negócio..kkk
Não está listando nada no Combobox.
Não está listando nada no Combobox.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WideStrings, DBXFirebird, FMTBcd, StdCtrls, DB, DBClient, Provider,
SqlExpr;
type
TForm4 = class(TForm)
Conn: TSQLConnection;
sdsEstados: TSQLDataSet;
dspEstados: TDataSetProvider;
cdsEstados: TClientDataSet;
cdsEstadosCODIGO: TIntegerField;
cdsEstadosMARCA: TStringField;
cdsEstadosATIVO: TStringField;
cdsEstadosNOME: TStringField;
cdsEstadosSIGLA: TStringField;
cdsEstadosICMS: TIntegerField;
cdsEstadosIBGE: TIntegerField;
cdsEstadosDATAINC: TSQLTimeStampField;
cdsEstadosDATAALT: TSQLTimeStampField;
cdsEstadosRESPONSAVEL: TIntegerField;
DS: TDataSource;
cbxCampo: TComboBox;
procedure FormCreate(Sender: TObject);
private
procedure GetCampos(tablename: string; var Listagem: TStringList);
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
{ TForm4 }
procedure TForm4.GetCampos(tablename: string; var Listagem: TStringList);
var
Qry : TSQLQuery;
Campo, Descricao: string;
function Linha1(Texto: string): string;
var
i: integer;
begin
Result := '';
if Length(Texto)>0 then
for i := 1 to Length(Texto) do
begin
if Texto[i] in [#13, #10] then break;
Result := Result + Texto[i];
end;
end;
begin
Listagem.Clear;
Qry := TSQLQuery.Create(self);
Qry.SQLConnection := Conn;
Qry.SQL.Add('select rdb$field_name campo, rdb$description descricao');
Qry.SQL.Add('from rdb$relation_fields where rdb$relation_name = '+QuotedStr(tablename));
Qry.Open;
while not Qry.Eof do
begin
Campo := Trim(Qry.FieldByName('campo').AsString);
if Trim(Qry.FieldByName('descricao').AsString)='' then
Descricao := Campo
else
Descricao := Trim(Linha1(Qry.FieldByName('descricao').AsString));
Listagem.Add(Campo+'='+Descricao);
Qry.Next;
end;
end;
procedure TForm4.FormCreate(Sender: TObject);
var
Lista: TStringList;
begin
Lista.Create;
GetCampos('Descricao', Lista);
//cbxCampo.Items.Add(Qry.FieldByName('description').AsString);
cbxCampo.Items.Add(Lista.ToString);
end;
end.
GOSTEI 0
Adilson Rumao
15/12/2010
No final também tentei assim:
Mas dá Access violation
procedure TForm4.FormCreate(Sender: TObject);
var
Lista: TStringList;
begin
Lista.Create;
//cbxCampo.Items.Add(Qry.FieldByName('description').AsString);
GetCampos('Descricao', Lista);
cbxCampo.Items.Add(Lista.Values['Descricao']);
end;
Mas dá Access violation
GOSTEI 0
Emerson Nascimento
15/12/2010
o nome da sua tabela é Descricao ?
procedure TForm4.FormCreate(Sender: TObject);
var
Lista: TStringList;
begin
Lista.Create;
GetCampos('Descricao', Lista);
//cbxCampo.Items.Add(Qry.FieldByName('description').AsString);
cbxCampo.Items.Add(Lista.ToString);
end;
o correto seria:
procedure TForm4.FormCreate(Sender: TObject);
var
i: integer;
begin
Lista := TStringList.Create; // Lista está declarada na cláusula private do form
GetCampos('TABELA', Lista);
// preenche o combo com as descrições encontradas
cbxCampo.Clear;
for i := 0 to Lista.Count - 1 do
cbxCampo.Items.Add(Lista.Values[Lista.Names[i]]);
// posiciona o combo no primeiro item
try
cbxCampo.ItemIndex := 0;
except
end;
end;
// procedimento para mostrar como obter o nome real do campo a partir do item selecionado no combo.
procedure TForm15.cbxCampoClick(Sender: TObject);
begin
ShowMessage('Nome do campo no banco: '+Lista.Names[cbxCampo.ItemIndex]);
end;
procedure TForm4.FormCreate(Sender: TObject);
var
Lista: TStringList;
begin
Lista.Create;
GetCampos('Descricao', Lista);
//cbxCampo.Items.Add(Qry.FieldByName('description').AsString);
cbxCampo.Items.Add(Lista.ToString);
end;
o correto seria:
procedure TForm4.FormCreate(Sender: TObject);
var
i: integer;
begin
Lista := TStringList.Create; // Lista está declarada na cláusula private do form
GetCampos('TABELA', Lista);
// preenche o combo com as descrições encontradas
cbxCampo.Clear;
for i := 0 to Lista.Count - 1 do
cbxCampo.Items.Add(Lista.Values[Lista.Names[i]]);
// posiciona o combo no primeiro item
try
cbxCampo.ItemIndex := 0;
except
end;
end;
// procedimento para mostrar como obter o nome real do campo a partir do item selecionado no combo.
procedure TForm15.cbxCampoClick(Sender: TObject);
begin
ShowMessage('Nome do campo no banco: '+Lista.Names[cbxCampo.ItemIndex]);
end;
GOSTEI 0