Entwickler-Ecke

Datenbanken - Typisierte Datei durch DB ersetzen - DataSets in DataSets


Tom.Schröder - Mi 24.10.07 10:57
Titel: Typisierte Datei durch DB ersetzen - DataSets in DataSets
Guten Morgen!

Ich würde gerne bei einem Projekt von mir die Datenstruktur ändern.

Das Problem an der Sache: bislang verwende ich typisierte Dateien, das passt wunderbar.
Allerdings sind änderungen und ergänzungen ein absolutes grauen, da an sehr vielen Stellen geändert werden muss (speichern/laden).

Nun ist ein Bestandteil:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
type
  TDatenSatz1 = class(TObject)
    private
     Attribut1 : String[15];
     Attribut2 : Integer;
     Attribut3 : boolean;
  end;


Davon habe ich mehrere in einer TObjectList.


Delphi-Quelltext
1:
2:
var
 MyDaten : TObjectList; // TDatenSatz1


Man sieht: nicht komplex. Bislang kein Problem. (MyDaten ließe sich wunderbar durch ein TClientDataSet mit entsprechenden Feldern String, Integer und boolean ersetzen)

Nun verkomplizieren wir das ganze:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TDatenSatz1 = class(TObject)
    private
     Attribut1 : String[15];
     Attribut2 : Integer;
     Attribut3 : boolean;
  end;

type
  TDatenSatz2 = class(TObject)
    private
     Attribut1 : String[15];
     Attribut2 : Integer;
     Attribut3 : boolean;
     Attribut4 : TObjectList //TDatenSatz1
  end;


Und ändern noch intern den Inhalt von MyDaten:


Delphi-Quelltext
1:
2:
var
 MyDaten : TObjectList; // TDatenSatz2


Wie ließe sich nun MyDaten durch ein TClientDataSet beschreiben?
Dieses hätte 4 Felder: String, Integer, Boolean, DataSet.
Wie kann ich sagen, dass es sich bei dem DataSet in diesem Feld um die DataSet-struktur von oben handelt?


MfG
Tom Schröder
Aachen


Tom.Schröder - Mi 24.10.07 12:11

Hum, ich spiele die ganze Zeit rum, aber ich bekomme es nicht hin :-)

Siehe das angefügte Bildchen:
In das obere Grid sollen Name, Vorname, Geburtstadutm und... meinetwegen die ID des Nummerndatasets.

Im Oberen Grid ist ein Datensatz ausgewählt:
Tom Schröder 1.1.2007 4


In das untere Grid die Nummern.

Z.b.
ICQ 324526317
Telefon 35727527425724
Handy 4362437243
Arbeit 24572357437
Schuhgröße 41
Katzen 2

Wähle ich im oberen Grid einen Datensatz aus, soll im unteren Grid die dazugehörigen Nummern angezeigt werden (welche ja für jeden Eintrag auch in Zahl unterschiedlich sein können)


Critter - Mi 24.10.07 12:36

Hi,

dafür benötigst du 3 Tabellen.

Tabelle 1 entspricht deinem TDatenSatz2 aber ohne Attribut 4. Dafür verpasst du dem noch ein selbstincrementierendes Feld ID (autoinc).
Tabelle 2 entspricht TDatenSatz1 auch hier fügst du ein ID Feld ein (dies ist in der Regel in der ersten Spalte).

In der dritten Tabelle speicherst du dann die Verknüpfungen zwischen den beiden. Neben der Spalte ID hat diese Tabelle noch die Felder Tb1ID und Tab2ID.


Quelltext
1:
2:
3:
4:
5:
6:
7:
    ID         Tab1ID        Tab2ID
+--------+---------------+-----------+
|   1    |       1       |     1     |
|   2    |       1       |     2     |
|   3    |       1       |     4     |
|   4    |       2       |     3     |
+--------+---------------+-----------+


Hier würden z.B. der erste Eintrag aus Tabelle 1 die einträge 1,2 & 4 aus Tabelle 2 Zugeordnet werden. Der zweite Datensatz aus Tabelle 1 währe nur mit dem Datensatz 3 Aus Tabelle 2 verknüpft.

critter


Tom.Schröder - Mi 24.10.07 13:20

Danke für die Hilfe!

Das Prinzip ist klar:
Tabelle 1: Alle Personendaten
Tabelle 2: Alle Nummern
Tabelle 3: Welche Nummer zu welcher Person gehört

Also habe ich jetzt (immer noch dem Beispiel von gerade)
DataSet1:
ID | Name | Vorname | Geburtsdatum

DataSet2:

ID | Name | Nummer


Dataset3:

ID | IDTabelle1 | IDTabelle2

So die Theorie.

Wie mache ich die Verknüpfung in der Praxis?
Im Feldeditor gehe ich auf Neues Feld eintragen, für die ID nehme ich das AutoInc.
Aber die IDS? Als Integer? Die ID ist ja ein Integer - oder kann ich sagen dass es sich explizit um eine bestimmte ID handelt?

Ich spiele mal bisschen damit weiter :-)


Tom.Schröder - Mi 24.10.07 14:28

Die 'alte' Lösung:

Puh also vom Handling her gefällt mir meine Variante besser, mit den ObjectLists und so.


Wie kann ich es realisieren, dass zum Grid eine Listbox gehört: diese repräsentiert die zur Person gehörenden Nummern. Wähle ich einen Nutzer und füge in die ListBox einen Eintrag ein, sollte entsprechend Tabellen 2 und 3 ergänzt werden, aber daran scheitert es gerade bei mir :(


Tom.Schröder - Do 25.10.07 18:00

Problem gelöst.

http://tinyurl.com/27tduo
und
http://dn.codegear.com/article/29825

waren sehr hilfreich dafür :-)