Pegar valor do Descriptions das Tabelas

Delphi

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.
Adilson Rumao

Adilson Rumao

Curtidas 0

Respostas

America Informatica

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.
 
GOSTEI 0
Leonardo Xavier

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

Adilson Rumao

15/12/2010

Não sei se seria só isso, mas fiz assim:  
procedure TfrmTeste.Button1Click(Sender: TObject);
var
aLista: WideString;
begin
  aLista:= sdsClientes.SortFieldNames;
  ShowMessage(aLista);
end;
  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.  
GOSTEI 0
Adilson Rumao

Adilson Rumao

15/12/2010

Olá galera, alguém para dar uma luz?
GOSTEI 0
Adilson Rumao

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

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:
[Error] Unit1.pas(54): Undeclared identifier: 'SortFieldNames'
GOSTEI 0
Adilson Rumao

Adilson Rumao

15/12/2010

Olá Paulo, acredito que a mensagem que você me  mandou está com erro.
GOSTEI 0
Deivison Melo

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

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

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.


GOSTEI 0
Rafael Mattos

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

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
Emerson Nascimento

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.

GOSTEI 0
Adilson Rumao

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.

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

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.

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

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[].

GOSTEI 0
Adilson Rumao

Adilson Rumao

15/12/2010

Mano não to entendendo este negócio..kkk
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

Adilson Rumao

15/12/2010

No final também tentei assim:

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

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;

GOSTEI 0
POSTAR