Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [mybase] FieldDef.Add zur Laufzeit, ohne "Datenverlust" (https://www.delphipraxis.net/50981-%5Bmybase%5D-fielddef-add-zur-laufzeit-ohne-datenverlust.html)

GimbaR 3. Aug 2005 19:36

Datenbank: MyBase • Zugriff über: kA (ClientDataSet?)

[mybase] FieldDef.Add zur Laufzeit, ohne "Datenverlust&
 
Guten Abend,

ich weiß nicht, ob sich jeder direkt was unter dem Titel vorstellen kann (mir schien es aber als der aussagekräftigste Titel.....), deswegen erläutere ich mein Problem mal genauer:
In meinem Programm benötige ich eine einfache Tabelle, in der ich Zeilen, wie Spalten dynamisch hinzufügen/entfernen/bearbeiten kann, außerdem war es für mich wichtig, dass ich diese Tabelle speichern und laden kann. Ein Freund (hier im Forum auch bekannt als maddin4u :hi: ) riet mir dazu MyBase zu verwenden. Also hab ich mich mal im netzt nen bissl schlau gemacht und einige Tutorials gelesen (). Soweit ist auch alles klar, das Erstellen und Arbeiten mit einenm ClientDataSet, nur leider bekomme ich es nicht gebacken eine Spalte (FieldDef) zur Laufzeit hinzuzufügen, ohne das die Daten in den Zellen verloren gehen :(

In einem kleinen Test-programm, erstelle ich drei Spalten und vervollständige dies mit CreateDataSet:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientDataSet1.FieldDefs.Add('test1', ftString, 20);
  ClientDataSet1.FieldDefs.Add('test2', ftString, 20);
  ClientDataSet1.FieldDefs.Add('test3', ftString, 20);
  ClientDataSet1.CreateDataSet;
end;
Dann versuche ich durch folgende Prozedur eine Spalte (FieldDef) zur Laufzeit hinzufügen.
Delphi-Quellcode:
rocedure TForm1.Button2Click(Sender: TObject);
begin
  ClientDataSet1.Insert;
  ClientDataSet1.FieldByName('test2').Value:= 'teststring';
  ClientDataSet1.Post;
  ClientDataSet1.MergeChangeLog;
  //ClientDataSet1.Close; //hab ich auch mal ausprobiert, es ist der gleiche Effekt wie mit Active:= false;
  ClientDataSet1.Active:= false;
  ClientDataSet1.FieldDefs.Add('test4', ftString, 20);
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.SaveToFile('C:\test2.xml', dfXML);
end;
Wenn ich mir dann die xml-datei anschaue, she ich zwar, dass die Spalte (FieldDef) "test4" vorhanden ist, jedoch is keine Spur von dem Eintrag "teststring" in der Spalte(FieldDef) "test2".

Meine Frage lautet nun: ist das Hinzufügen von FieldDefs überhaupt zur Laufzeit möglich, was hab ich falsch gemacht/was muss ich ändern?
Hab mich auch schon nach vernünftigen Alternativen umgeschaut, aber keine wirklich gute gefunden :(
PS: Die FieldDefs können nicht statisch vergeben werden.
PS2: Habe bisher keine, bzw sehr wenig Erfahrungen mit Datebanken...

so far, in hope you can help me :mrgreen:

GimbaR

GimbaR 4. Aug 2005 10:24

Re: [mybase] FieldDef.Add zur Laufzeit, ohne "Datenverl
 
*push*

hmm, es gibt doch bestimmt mehrere in diesem forum, die mit maybase gearbeitet haben, oder :gruebel:
hat denn wirklich keiner eine lösung, oder kennt jemand nicht eine alternative

mfg GimbaR

Light 15. Feb 2006 11:14

Re: [mybase] FieldDef.Add zur Laufzeit, ohne "Datenverl
 
Hi GimbaR,

Ich hab neulich auch mal mit MyBase angefangen.
Also ne alternative kenn ich überhaupt nicht!

So hab grad ma mein Demoprog rausgesucht und ein bissel rum probiert!
Und bin zu dem Entschluss gekommen:
- Das geht nicht so einfach!

Begründung:
- Man muss die DatenMenge schließen -
wenn man dann unter dem Gleichen Dateinamen ein Neues DataSet Speichert Überschreibt man das alte mit Sicherheit!
-Logischerweiße auch den Inhalt!
und du solltest mal ausprobieren ob dein "ClientDataSet1.FieldByName('test2').Value:= 'teststring';"
überhaupt abgespeichert wird! ohne das du die Datei Expliziet speicherst!
weil
Zitat:

ClientDataSet1.MergeChangeLog;
//ClientDataSet1.Close; //hab ich auch mal ausprobiert, es ist der gleiche Effekt wie mit Active:= false;
ClientDataSet1.Active:= false;
führt ja dazu das durch Active := false; wirklich geschlossen wird!
und bei mir hat MergeChangeLog nicht ausgereicht um es wirklich zu speichern!

also müsstets du mindestens bevor du da irgendwas einfügst
Delphi-Quellcode:
ClientDataSet1.SaveToFile('C:\test2.xml', dfXML);
aufrufen!

Ich hoffe ich konnte dir wenigstens ein bisschen weiterhelfen!
Es kann gut sein das es doch eine Möglichkeit gibt! :coder2:
Ich hab mich auch noch nicht so lange damit auseindander gesetzt!

MFG
Stefan

PS: Mit with do sparst du dir arbeit!
Delphi-Quellcode:
with ClientDataSet1 do
  Begin
    Insert;
    FieldByName('test2').Value:= 'teststring';
    Post;
    SaveToFile('C:\test2.xml', dfXML);
  End;
:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz