Autor Beitrag
Tom.Schröder
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mi 24.10.07 10:57 
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:

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

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

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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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)
Einloggen, um Attachments anzusehen!
Critter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 328
Erhaltene Danke: 3

Windows 7
Delphi 7 Pro.
BeitragVerfasst: 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.

ausblenden 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

_________________
Diejenigen, die grundlegende Freiheiten aufgeben, um ein wenig mehr vorrübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit.
(Benjamin Franklin;"The Papers of Benjamin Franklin", Vol. 6, Apr. 1, 1755, through Sep. 30, 1756)
Tom.Schröder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Do 25.10.07 18:00 
Problem gelöst.

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

waren sehr hilfreich dafür :-)