Autor Beitrag
roka6803
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50


Delphi 5 Ent. & Delphi 7
BeitragVerfasst: Mo 07.11.05 23:47 
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

ausblenden 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:

ausblenden 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;     //kopiere Datenmenge
  ClientDataSet1.Close;
  ClientDataSet1.FieldDefs.Add('TEST',ftString,20);  //neues Feld hinzufügen
  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; // springt auf das nächste Record
  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...
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 08.11.05 02:47 
Du bist sehr optimistisch. Was ähnliches war doch heute schon mal da. Mit Paradox und BDE. Da kommt wohl immer weniger an Feedback, weil es auf dem Schrottplatz gelandet ist. Zumindest wäre mal in diesem Fall zu klären, warum ein ClientDataSet überhaupt gebraucht wird. Habe noch keinen konkreten Zweck dafür entdeckt, vielleicht ja jetzt. Im Source ist mir folgendes aufgefallen : da steht mittendrin irgendwo CreateDataset. Wird dadurch eventuell was überschrieben ? In Richtung COMMIT ist auch nichts zu sehen. Dann das "Erzeugen zur Laufzeit". Man erzeugt also ein neues Feld in einer Tabelle, und nun ? Schließlich muß auch das Programm wissen, daß plötzlich eine neue Spalte in einer Tabelle aufgetaucht ist. Ansonsten kann man sie ja gar nicht im Programm benutzen. Vielleicht erklärt mir mal einer, wie das alles zusammenpaßt. Ein Clientdataset liegt übrigens im Speicher.

_________________
Gruß
Hansa
roka6803 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50


Delphi 5 Ent. & Delphi 7
BeitragVerfasst: Di 08.11.05 15:05 
Hallo Hansa,

ist ja ein recht nettes Comment, was du da von dir gibst. Nun, was an einem ClientDataSet der Vorteil ist? Das ist ganz einfach: Mit einem ClientDataSet habe ich eine "Datenbank" zur Verfügung die keine weiteren Treiber benötigt. Das heisst, dass das spätere Programm auf jedem Windows-Rechner ab Windows 2000 ohne weitere zusätzliche Änderungen am System bezüglich Treibern für Datenbanken läuft. Zudem werden die Datensätze lokal im Anwendungsordner gespeichert.

Commit, Laufzeit.......

Ich bin mir ziemlich sicher, dass der Quellcode funtioniert, zumindest wenn keine Spalten mit AutoInc vorhanden sind.



MfG roka6803

_________________
Signatur? Was ist das? Brauch ich nicht...