Autor Téma: Přidání sloupce do TClientDataSet  (Přečteno 392 krát)

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Přidání sloupce do TClientDataSet
« kdy: 10-08-2024, 16:34:54 »
Ahoj,
mám tabulku v TClientDataSet a potřebuji tuto tabulku naklonovat tak, že do ní přidám sloupec.
Dělám to následovně:
Kód: Delphi [Vybrat]
  1. Procedure VStructureCallBack(VCDS : TClientDataSet);
  2. Const
  3.      cPole = 'test';
  4. Var
  5.    F : TField;
  6.   Begin
  7.      VCDS.FieldDefs.Add(cPole, ftInteger, 0, False);
  8.      F := TIntegerField.Create(VCDS);
  9.      F.FieldName := cPole;
  10.      F.DataSet := VCDS;
  11.      F.FieldKind := fkCalculated;
  12.  
  13.     // VCDS.OnCalcFields := CDSCalcFields;
  14.   End;
  15.  
  16. //VCo obsahuje data a strukturu zdrojové tabulky
  17. procedure CloneTable(VCo : OleVariant;VKam : TClientDataSet);
  18. Vare
  19.        CDS : TClientDataSet;
  20.  Begin
  21.   CDS:=TClientDataSet.Create(Nil);
  22.   Try
  23.    CDS.Data:=VCo;
  24.    CDS.SaveToFile('Pred.xml',dfXMLUTF8); //Obsah vstupní tabulky
  25.    VKam.FieldDefs.Assign(CDS.FieldDefs); //VKam.Fields.Count=0
  26.    VSTructureCallBack(VKam); //VKam.Fields.Count=1
  27.    VKam.CreateDataSet;
  28.    VKam.SaveToFile('Mezi.xml',dfXMLUTF8); //Vstupní tabulka rozšířená o jeden sloupec, bez dat
  29.    CDS.First;
  30.    While Not CDS.EOF Do
  31.     Begin
  32.      VKam.Append;
  33.      VKam.CopyFields(CDS);
  34.      VKam.Post;
  35.      CDS.Next;
  36.     End;
  37.   VKam.SaveToFile('Po.xml',dfXMLUTF8); //Vstupní tabulka rozšířená o jeden sloupec, počet řádků dat odpovídá vstupu, ale řádky jsou prázdné
  38.   Finally
  39.    CDS.Free;
  40.   End;
  41.  End;
  42.  

Problém je ten, že sloupec skutečně přidám, ale nejsem schopný pracovat s těmi základními a ani nakopírovat jejich data.
Metoda VKam.FieldDefs.Assign(CDS.FieldDefs) mi sloupce přidá, ale jsou nedostupné. FieldsCount mi vrací nulu, ovšem výpis do souboru tyto sloupce uvádí.
Co dělám špatně? Nechybí mi tam ještě něco? Zkouším na různá místa přidat VKam.FieldDefs.Update, ale to nemá žádný význam.
Ve výstupech se mi vrací:
Pred.xml - ZákladníSloupec1,ZákladníSloupec2,ZákladníSloupec3 a komplet data (5 řádků)
Mezi.xml - ZákladníSloupec1,ZákladníSloupec2,ZákladníSloupec3,NovýSloupec a žádná data
Po.xml - ZákladníSloupec1,ZákladníSloupec2,ZákladníSloupec3 a 5 prázdných datových řádků

Díky
Pb

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Přidání sloupce do TClientDataSet
« Odpověď #1 kdy: 10-08-2024, 16:55:22 »
Pokud to ještě trochu proházím
Kód: Delphi [Vybrat]
  1. VKam.FieldDefs.Assign(CDS.FieldDefs); //VKam.Fields.Count=0
  2. VKam.CreateDataSet; //VKam.Fields.Count=3  O.K.
  3. VKam.Close;
  4.    VSTructureCallBack(VKam); //VKam.Fields.Count=1
  5. VKam.Open;
  6.  
Tak potom ve výpisu na závěr nemám ani data, ani přidávaný sloupec.

Offline PetrB0

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo, Delphi 10.41
Re:Přidání sloupce do TClientDataSet
« Odpověď #2 kdy: 10-08-2024, 17:12:26 »
Excellent
Rated 1 time
Tak už jsem to asi odhalil. Bylo to tím matláním FieldDefs.Add a TIntegerField.Create.
Nechal jsem jenom VCDS.FIeldDefs.Add(cPole,ftInteger,0,False) a už to běhá.
Zjevně to řešení čekalo, až sem napíšu.