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

03/04/2008

336

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


Responder

Post mais votado

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.


Responder

Mais Posts

04/04/2008

Ant.carlos/sp

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


Responder

04/04/2008

Delphi32

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+!


Responder

23/04/2008

Wadojr

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!!!


Responder

23/04/2008

Fabiano Góes

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;



Responder

23/04/2008

Joaoshi

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


Responder

23/04/2008

Fabiano Góes

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;



Responder

23/04/2008

Ant.carlos/sp

Olá!

Tenha um outro problema:

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

Desde já meus agradecimentos.

ANT.CARLOS / SP


Responder

24/04/2008

Dmalta

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


Responder

24/04/2008

Wadojr

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

Valew demaaais, abraços!!


Responder

24/04/2008

Wadojr

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


Responder

27/04/2008

Ant.carlos/sp

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


Responder

28/04/2008

Ant.carlos/sp

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


Responder
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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar