Newsgroup: it.comp.lang.delphi
Titolo: Copiare un Field da un dataset a un altro

Dovrei copiare tutti i fields (definiti a design-time) di un dataset in 
un altro... il mio problema sono i sottotipi di campi... se faccio:
   for i := 0 to cdsData.Fields.Count - 1 do
   begin
     with TField.Create(Self) do
     begin
       Name := 'cdsDataEdit' + cdsData.Fields[i].FieldName;
       FieldKind := fkData;
       FieldName := cdsData.Fields[i].FieldName;
       Size := cdsData.Fields[i].Size;
       DisplayLabel := cdsData.Fields[i].DisplayLabel;
       DisplayWidth := cdsData.Fields[i].DisplayWidth;
       DataSet := cdsDataEdit;
     end;
   end;
va bene finché non incontro un campo di tipo TIntegerField, perché la 
proprietà Size non è definita (per esempio).
L'ideale sarebbe poter copiare il campo, compreso il tipo, magari con 
una bella Assign, ma sono un po' in difficoltà :(
-- 
Jax

 un altro... il mio problema sono i sottotipi di campi... 
Posso chiederti per quale motivo?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

prova:
if  Assigned(cdsData.Fields[i].Size) then
begin
  .....
  .....
end
-- 
______________________
Gaetano - cdm_roccotanica 

 Posso chiederti per quale motivo?
Per quale motivo è un problema o per quale motivo devo copiare dei campi?
Nel primo caso, perché sono ignorante!
Nel secondo caso, ho un clientdataset che uso come tabella virtuale (e 
visualizzo in una dbgrid), e volevo dare all'utente un'interfaccia 
veloce per modificare in massa i dati delle varie colonne, ma 
utilizzando le restrizioni dei campi originali; quindi ho pensato di 
creare un clientdataset gemello che, al cambiare di un campo, vada a 
riportare questo cambiamento sul cds originale.
Tu dirai, giustamente, e perché cazz non fai un copia/incolla del cds 
originale direttamente a design time? Un po' per sfizio, un po' perché 
crearlo a runtime mi risparmierebbe tempo qualora la struttura del cds 
originale dovesse cambiare.
-- 
Jax

 veloce per modificare in massa i dati delle varie colonne, 
..e qui mi sono gią perso: che intendi per "modificare in massa"? Spiega
un po' che tipo di applicazione stai cercando di realizzare.
La cosa mi stranisce in questo modo perché il CDS mappa un modello ed č
strano che tu voglia cambiare questo modello a run-time.


 riportare questo cambiamento sul cds originale.
Se assegni le proprietą *Data/Delta* dei componenti CDS, rendi identica 
la situazione dei due componenti per tutto il recordset.
Ma forse non č ciņ che intendevi tu... :-|
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)


Infatti il problema e' che devi creare oggetti di tipo diverso: invece
di TField devi creare TFloatField, TStringField, eccetera.
Io per "clonare" un clientdataset userei la proprieta FieldDefs:
// NON TESTATO
var
   I: Integer;
begin
   CDS.Close;  // non puoi modificare la struttura di un cds aperto
   CDS.FieldDefs.Clear;
   for i := 0 to SourceCDS.FieldDefs.Count - 1 do
     CDS.FieldDefs.Add( SourceCDS.FieldDefs[i].Name,
       SourceCDS.FieldDefs[i].DataType, SourceCDS.FieldDefs[i].Size,
       False );
   CDS.CreateDataSet;  // crea Fields dei tipi giusti dai fielddefs
end;
Importante: il CDS destinazione che stai creando NON deve avere dei
field creati a design time, altrimenti non usa i fielddefs per creare
i fields ma fa il contrario (usai i fields sistenti per distruggerti
i fielddefs clonati dal cds originario :)
ciao
Giacomo

 strano che tu voglia cambiare questo modello a run-time.
So che non sto usando i CDS per lo scopo per cui sono stati pensati 
(soprattutto per la modifica di massa), ma sono così comodi... se non 
riuscirò a creare i campi a runtime, comunque, li creerò a design-time, 
almeno avrò risolto il problema.
-- 
Jax

 Io per "clonare" un clientdataset userei la proprieta FieldDefs:
Mitico! Funziona benissimo...
Ma perché non ho pensato subito ai FieldDefs, imbecille!
Grazie ancora.
-- 
Jax



non ho provato ma,
un ciclo sui fields del cds 
sorgente e assegnazione al
destinatario tipo
  for i := 0 to ClientDataSet1.Fields.Count - 1 do
  begin
    ClientDataSet2.Fields.Add(ClientDataSet1.Fields[i]);
  end;
non funziona?
Ciao Antò.