Hallo alle zusammen,
ich arbeite gerade an einem Programm um einfache ("treiberlose") Datenbankdateien zu erstellen und zu bearbeiten. Dfür verwende ich ein DBGrid, eine DataSource und eine ClientDataSet als Komponenten.
Auch ist mir bekannt wie ich zur Laufzeit neue "Felder" bzw. "Spalten" im Grid erzeugen und sie als "Datenbank"-Datei abspeichern kann.
Nun habe ich aber bereits eine *.db-Datei, welche ich bereits in das Programm laden kann.
Die DB bzw. das Grid hat folgende Spalten: 'ID' mit Integern als AutoInc
'NAME' mit Strings
Jetzt möchte ich "diesem Grid" eine weitere Spalte 'TEST' hinzufügen. Dies geschieht auch ohne weiteres mit
Delphi-Quelltext
1:
| clientdataset1.FieldDefs.Add ('TEST', ftString, 10); |
Dabei entsteht aber das erste Problem, dass ich zwar jetzt alle drei "Spalten" habe, allerdings sämtliche Datensätze weg sind.
Daher habe ich verschiedenen Foren recherschiert und bin dadurch auf folgenden Quellcode gestossen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| var y,i : integer; begin ClientDataSet2.Data := ClientDataSet1.Data; ClientDataSet1.Close; ClientDataSet1.FieldDefs.Add('TEST',ftString,20); ClientDataSet1.CreateDataSet; ClientDataSet1.Open;
ClientDataSet1.Edit; for y:=0 to ClientDataSet2.RecordCount-1 do begin for i:=0 to ClientDataSet2.FieldCount-1 do begin; ClientDataSet1.Fields.Fields[i]:=ClientDataSet2.Fields.Fields[i]; end; ClientDataSet1.Append; ClientDataSet2.Next; end;
for y:=0 to ClientDataSet2.RecordCount-1 do begin ClientDataSet1.Append; for i:=0 to ClientDataSet2.FieldCount-1 do ClientDataSet1.Fields.Fields[i]:=ClientDataSet2.Fields.Fields[i]; ClientDataSet1.Post; ClientDataSet2.Next; end; |
Dieser Quellcode kopiert alle Datensätze in ein zweites ClientDataSet, fügt die neue Spalte ein und kopiert die Datensätze "zurück". --> Funktionsgarantie !!!!
Allerdings habe ich, wie bereits weiter oben erwähnt, eine Integer-Spalte "ID" mit AutoInc. Will ich jetzt diesen Quellcode ausführen, z.B. über einen ButtonClick, so erhalte ich eine Fehlermeldung, dass die Spalte "ID" nicht editierbar sei.
Wie kann ich einem DBGrid unter Verwendung eines ClientDataSets zur Laufzeit eine neue Spalte hinzufügen ohne Datensätze zu verlieren und ohne Rücksicht auf Eigenschaften von Spalten wie zum Beispiel AutoInc nehmen zu müssen?
Vielen Dank für die hoffentlich zahlreich folgenden Comments.
MfG roka6803
Signatur? Was ist das? Brauch ich nicht...