Como criar um ClientDataset em tempo de execução ?

Delphi

03/04/2008

Olá!
Caros amigos!
Estou precisando criar um ClientDataset em tempo de execução.
Estou montando uma rotina em POO e preciso montar esta tabela.

Minha tabela tem os seguinte campos:
Cds_Dados:
Codigo Integer
Nome VarChar(50)
Data TdateTime
Valor Currency
etc....

Preciso fazer isto em tempo de execucao e ao final destrui-la.

A quem responder, desde já meus agradecimentos.

ANT.CARLOS/SP


Ant.carlos/sp

Ant.carlos/sp

Curtidas 3

Melhor post

Joaoshi

Joaoshi

03/04/2008

Colega, se entendi direito:

var cdsTemp : TClientDataSet;

begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;

Espero ter ajudado.


GOSTEI 4

Mais Respostas

Ant.carlos/sp

Ant.carlos/sp

03/04/2008

Olá!
Caro amigo, obrigado pela atenção.

Beleza, me ajudou muito, mas preciso tbém:
1-Criar um DataSourse e ligar ao CDS.
2-Ao final destruir estes dois componentes.

100+

ANT.CARLOS/SP


GOSTEI 1
Delphi32

Delphi32

03/04/2008

Basta você adicionar uma variável do tipo TDataSource, criar e ligar a propriedade, exatamente como você faria se usasse os componentes em um form. Abaixo aproveitei o código do joaoshi.

var cdsTemp : TClientDataSet; 
      dsTemp: TDataSource;
begin 
  cdsTemp := TClientDataSet.Create(nil);
  cdsTemp.Close; 
  cdsTemp.FieldDefs.Clear; 
  cdsTemp.FieldDefs.add(´CODIGO´,ftInteger); 
  cdsTemp.FieldDefs.add(´NOME´,ftString,50); 
  cdsTemp.CreateDataSet;
  dsTemp := TDataSource.Create(nil);
  dsTemp.DataSet := cdsTemp;
end;


Obs.: mudei o ´Create(Self)´ para ´Create(nil)´. Dessa forma você fica responsável pela liberar o componente da memória. Para fazer isso você usaria:

  cdsTemp.Close;
  FreeAndNil(cdsTemp);
  FreeAndNil(dsTemp);


t+!


GOSTEI 2
Wadojr

Wadojr

03/04/2008

No meu caso tenho um clientdatase que não é dinamico porém os fields deste client, são criados dinamicamente ex:

[color=green:64a71871aa] cds_qtd_oper.FieldDefs.Add(´Total_Oper´,ftInteger);
cds_qtd_oper.FieldDefs.Add(´Total_Qtd´,ftFloat);
cds_qtd_oper.FieldDefs.Add(´Rest_Oper´,ftInteger);[/color:64a71871aa]

em algum momento preciso destruir todos os fields que foram criados neste client, para criar outros diferentes. Como faço para destruir todos os fields?

desde já agradeço moçada, abraços!!!


GOSTEI 1
Fabiano Góes

Fabiano Góes

03/04/2008

No meu caso tenho um clientdatase que não é dinamico porém os fields deste client, são criados dinamicamente ex: [color=green:1ffcf7349f] cds_qtd_oper.FieldDefs.Add(´Total_Oper´,ftInteger); cds_qtd_oper.FieldDefs.Add(´Total_Qtd´,ftFloat); cds_qtd_oper.FieldDefs.Add(´Rest_Oper´,ftInteger);[/color:1ffcf7349f] em algum momento preciso destruir todos os fields que foram criados neste client, para criar outros diferentes. Como faço para destruir todos os fields? desde já agradeço moçada, abraços!!!


para destruir todos o TFields
var i: integer;
begin
   ClientDataSet1.Close;

   for i := 0 to ClientDataSet1.FieldDefs.Count - 1 do
      if i > 0 then
         ClientDataSet1.FieldDefs.Delete(i-1)
      else
         ClientDataSet1.FieldDefs.Delete(i);

   // criar novamente os TFields

end;



GOSTEI 1
Joaoshi

Joaoshi

03/04/2008

Ou simplesmente [b:e7a41c2efe]ClientDataSet1.FieldDefs.Clear[/b:e7a41c2efe];


GOSTEI 1
Fabiano Góes

Fabiano Góes

03/04/2008

Ou simplesmente [b:bef783efeb]ClientDataSet1.FieldDefs.Clear[/b:bef783efeb];


muito bem lembrado joaoshi.

alterando meu código:
begin
   ClientDataSet1.Close;
   ClientDataSet1.FieldDefs.Clear;

   // criar novamente os TFields

end;



GOSTEI 1
Ant.carlos/sp

Ant.carlos/sp

03/04/2008

Olá!

Tenha um outro problema:

Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...

Desde já meus agradecimentos.

ANT.CARLOS / SP


GOSTEI 1
Dmalta

Dmalta

03/04/2008

[b:3c5773bc54][i:3c5773bc54]Dica geral para criar componentes em tempo de execução por código.[/i:3c5773bc54][/b:3c5773bc54]

Começe colocando o componente em design-time no form ou data module. Configure todas as [b:3c5773bc54]propriedades[/b:3c5773bc54] e implemente todos os [b:3c5773bc54]eventos[/b:3c5773bc54] necessários. Esse componente servirá apenas como protótipo e você logo poderá excluí-lo.

Utilize um desses métodos para gerar o código:

1) Visualize o form como texto (´View as Text´ no menu popup), localize o objeto (Ctrl+F para ´Find´), copie a sua definição (Ctrl+C), vá para o editor de código, cole a definição anterior (Ctrl+V) e faça as alterações necessárias para adaptar o texto à sintaxe Delphi. Por exemplo, é necessário trocar ´=´ por ´:=´ e acrescentar ´;´ no fim das linhas.

2) Usando [url=http://gexperts.org/]GExperts[/url] é mais fácil. Apenas selecione o componente e depois clique na opção ´Component to Code´ no menu popup (right-click). Vá para o editor de código e cole (Ctrl+V) o código que o GExpert gerou automaticamente e copiou para a área de transferência.

Por fim, delete o componente protótipo que tinha criado.


GOSTEI 1
Wadojr

Wadojr

03/04/2008

è isso ae moçada, deu certinho, como sempre,

Valew demaaais, abraços!!


GOSTEI 1
Wadojr

Wadojr

03/04/2008

[b:b1fc4aecd9]ANT.CARLOS/SP escreveu:[/b:b1fc4aecd9]
[color=green:b1fc4aecd9]Olá!

Tenha um outro problema:

Preciso agora ativar os eventos desta tabela:
AfterInsert, AfterPost, ...

Desde já meus agradecimentos.

ANT.CARLOS / SP[/color:b1fc4aecd9]

Amigo para inserir eventos no seu ClientDataSet Dinamico basta vc criar uma Procedure que contenha o código que vc precisa e referencia-la.

Ex:[color=green:b1fc4aecd9] procedure AfterPost_Dinamic(DataSet: TDataSet);

procedure TfrmOrcamento.AfterPost_Dinamic(DataSet: TDataSet);
begin
*seu código
end;[/color:b1fc4aecd9]

Quando criar o ClientDataSet referencie sua procedure..

Ex:

[color=green:b1fc4aecd9]//criando o client dinamicamente
cds_qtd_oper := TClientDataSet.Create(nil);
cds_qtd_oper.Close;
// inserindo os eventos necessarios
cds_qtd_oper.AfterOpen := AfterPost_Dinamic;[/color:b1fc4aecd9]


GOSTEI 2
Ant.carlos/sp

Ant.carlos/sp

03/04/2008

Olá!
Boa tarde!

TEnho novo problema: DBGrid X CDS

Fiz tudo conforme os amigos passaram e funcionou.

Mas, Este CDS está ligado à um DBGRID.

Quando informo os dados no teclado, tudo funiona normalmente.

Quando faço faço uma pesquisa, seleciono o registro, gravo na tabela,
o DBGrid não exibe os dados, embora os mesmos estejam gravados, mas somente nas colunas que gravei, pois nas coluna q digito os dados permanecem.

O problema acontece qdo informo a tabela CDS criada em tempo de execucao.

No meu form, tenho um Cds Protótipo o qual uso pra config. o DBGrid, depois
o subistu-o pelo que eu crie, quando faço isso o DBGrid perde algumas configuraçoes, como por exemplo Campos CheckBox, passam a apresentar o a string
´T´/ou ´F´.

A quem responder, desde já meus agradecimentos.

ANT.CARLOS/SP


GOSTEI 0
Ant.carlos/sp

Ant.carlos/sp

03/04/2008

Olá!
Bom Resolvi o problema.

Como uso um no meu Form Cds para configurar meu Grid, eu esta usando localmente: Cds_dados.Append,Post.

Mas, para acessar o arquivo q deseja usar, inserido no
Ds_DataSourse := Informe_Nome_Tabela(), deveria usar p/ referir-me a tabela estrangeira, Ds_Datasouse.Dataset.Insert, Post,....

O segredo é usar: Ds_Datasouse.Dataset

Obrigado pessoal


GOSTEI 0
Gladstone Matos

Gladstone Matos

03/04/2008

Colega, se entendi direito:

var cdsTemp : TClientDataSet;

begin
-- cdsTemp := TClientDataSet.Create(Self);
-- cdsTemp.Close;
-- cdsTemp.FieldDefs.Clear;
-- cdsTemp.FieldDefs.add(´CODIGO´,ftInteger);
-- cdsTemp.FieldDefs.add(´NOME´,ftString,50);
-- cdsTemp.CreateDataSet;
end;

Espero ter ajudado.





excelente, obrigado! :D
GOSTEI 0
POSTAR