Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zwei Tabel als Baum Darstellen (https://www.delphipraxis.net/68642-zwei-tabel-als-baum-darstellen.html)

thklingler 3. Mai 2006 08:39

Datenbank: TurboDB • Version: 5.07 • Zugriff über: mit den TurboDB Componenten

Zwei Tabel als Baum Darstellen
 
Hallo ich bekomme es nicht hin das meine zwei Tabel als Baum Angezeigt werden.

Tabel1
Hersterller_ID(Autoinc/Key)|Firma(String]

Tabel2
Pr_ID(Autoinc/Key)|Hersterller_ID(integer/RelationHersterller_ID)|Bezeichung(String)

Ich würd das ganz nun gerne als Baum darstellen

+Hersterller1
--Bezeichung 1
--Bezeichung 2
+Hersterller2
--Bezeichung 3
usw.

Ich kann bei TurboDB die Hersteller Bezeichung auch als Link direkt in Tabel2 anzeigen wenn das einfacher ist.
Die Komponenten ELPack und DBTree liegen vor und können benutze werden.

Bitte entschuldigt wenn die Frage dumm ist, aber ich muss zum ersten mal mit Datenbanken arbeiten.

marabu 3. Mai 2006 09:50

Re: Zwei Tabel als Baum Darstellen
 
Hallo Thomas,

egal welche TreeView-Komponente du verwendest, die Daten aus der ersten Tabelle besetzen die Ebene 0 in deiner TreeView und die Daten aus der zweiten Tabelle die Ebene 1. Da es sich bei TurboDB meines Wissens um eine lokale Datenbank handelt, kannst du ruhig direkt auf die Table-Komponenten zugreifen und diese über die MasterSource-Eigenschaft miteinander verknüpfen. In den Knoten der TreeView solltest du die ID des jeweiligen Datensatzes als Node.Data mitführen, damit du beim Auswählen eines Knotens sofort auf den Datensatz der Tabelle positionieren kannst.

Grüße vom marabu

thklingler 3. Mai 2006 13:06

Re: Zwei Tabel als Baum Darstellen
 
Danke für die schnelle Hilfe, leider reichen meine bescheiden Kentnisse nicht aus um das Umzuseztzen, in welcher Tabele muss(soll) ich die Verknüpfung zum Master machen?
Denn ich kann keinen Tabel als Mastersource deffinieren sondern nur eine Datasourcekomponente. Auch kann ich bei den Komponenten nur die Datasource ansteuern wobei ELPack eine eigene Dataspurckomponente benötig

marabu 3. Mai 2006 13:15

Re: Zwei Tabel als Baum Darstellen
 
Nehmen wir an du hast Table1 und Table2, DataSource1 und DataSource2, dann trägst du Table1 als DataSet in DataSource1 ein (Table2 analog) und DataSource1 als MasterSource in Table2.

marabu

thklingler 3. Mai 2006 13:25

Re: Zwei Tabel als Baum Darstellen
 
Wenn ich das so mach dann wir im Grid des Datsource2 das ich immoment zur Kontrolle nutz nur noch die Bezeichungen des Hersteller 1 angezeigt ist das OK ?

marabu 3. Mai 2006 13:34

Re: Zwei Tabel als Baum Darstellen
 
Das sind die Auswirkungen der Master-Detail-Konfiguration. In einer Baumansicht (TreeView) kann man dann von Knoten zu Knoten springen und dabei die DataSource für ein Grid von DataSource1 auf 2 wechsel. Ob das deinen Wünschen entspricht, musst du besser wissen als ich. Das einzige mir bekannte Element deiner Benutzerschnittstelle war bisher eine TreeView. Vielleicht solltest du dein GUI etwas beschreiben - noch besser einen Screen-Shot zu deiner Beschreibung anhängen.

marabu

thklingler 3. Mai 2006 14:08

Re: Zwei Tabel als Baum Darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So weit binn ich noch gar nicht :oops: , ich Versuch immoment in einem Testprojekt die Daten so darzustellen wie ich mir das Vorstelle.

Meine Idee war dem Nutzer eine Baustruktur anzuzeigen in welcher die Hauptunkte die Hersteller sind, unter jedem Hersteller sollten dann die möglichen Bezeichner stehen.

Wenn ich es so mach wie oben Beschrieben stehen im TreeView nur die Daten des ersten Herstellers mit dem ersten Bezeichner als Hauptkonten. Die zwei Tabel und Datasource komponeten sind wie oben beschreiben eingestellt.

Die Werte des dxDBTreeView1 sind wie folgt eingestellt:

Datasource =Datasource 2
DisplayField=Bezeichung
KeyField=Pr_ID
ListField=Bezeichung
ParentField=Hersteller.

Anbei ein ScreenShoot wie es immoment aussieht.

marabu 4. Mai 2006 21:04

Re: Zwei Tabel als Baum Darstellen
 
Hallo Thomas,

die Komponenten von Developer Express sind bei mir leider nicht installiert. Vielleicht kann ja jemand helfen, der mit diesen Komponenten arbeitet?

Gute Nacht

marabu

thklingler 5. Mai 2006 10:22

Re: Zwei Tabel als Baum Darstellen
 
Wenn du mir es mit den ELpack Komponenten oder einer anderen (wenn du mir sagst wo ich diese herbekomme) erkären kannst so das ich es verstehe :-) , ist mir das auch recht ich bin nicht an die Komponente gebunden ich hätte nur gern das aussehen wie Beschrieben.

raiguen 5. Mai 2006 13:21

Re: Zwei Tabel als Baum Darstellen
 
Moin :-)
Vom Prinzip her machst Du es so:
Delphi-Quellcode:
procedure BaumErstellen;
  var
    tn0, tn1: TTreeNode;
begin
  if not Table1.Active then Table1.Open else Table1.First;
  if not Table2.Active then Table2.Open else Table2.First;

  tvBaum.BeginUpdate; //--ständiges Neuzeichnen unterbinden
  tvBaum.Items.Clear; //--alten Baum leeren

  while not Table1.Eof do
    begin
      //-- Ebene 0 -> Hersteller
      tn0 := tvBaum.Items.Add(nil, Table1.FieldByName('FIRMA').Text);
      tn0.HasChildren := True;

      //-- Ebene 1 -> Bezeichnung
      while not Table2.Eof do
        begin
          tn1 := tvBaum.Items.AddChild(tn0, Table2.FieldByName('BEZEICHNUNG').Text);
          tn1.HasChildren := False;
          Table2.Next;
      end;
      Table1.Next;
  end;

  tvBaum.EndUpdate; //--erstellten Baum anzeigen
end;
{
Somit würde Dein Baum dann so aussehen:
+ Metecno
   G4
   Hipertec
   Hipertec Sound
+ Thyssen
}

thklingler 5. Mai 2006 13:41

Re: Zwei Tabel als Baum Darstellen
 
Was deffinierst du als tvBaum?

marabu 5. Mai 2006 13:42

Re: Zwei Tabel als Baum Darstellen
 
tv ist oft die mnemonische Kennzeichnung des Variabletyps - hier TreeView.

marabu

thklingler 5. Mai 2006 14:01

Re: Zwei Tabel als Baum Darstellen
 
Danke hab es hinbekommen, dass ist jetzt aber keine Datenintensivekomponente wozu brauche ich die dann?

Das BeginUpdate und EndUpdate wird bei mir angemault tvBaum enthält kein element diese Typs.

Wie bekomme ich nun heraus welchen eintrag der User gewählt hat?

marabu 5. Mai 2006 16:01

Re: Zwei Tabel als Baum Darstellen
 
BeginUpdate() und EndUpdate() sind Methoden von TreeView.Items - also tvBaum.Items.BeginUpdate() und es wird funktionieren. Sobald du einen Knoten auswählst wird das Ereignis OnChange() gefeuert - du musst nur entsprechenden Code dafür schreiben. Beim Befüllen des Baums solltest du den Primärschlüssel der Tabelle in der Eigenschaft Data des Knoten mitführen:

Delphi-Quellcode:
tn0 := tvBaum.Items.AddChildObject(nil,
         Table1.FieldByName('FIRMA').Text,
         Pointer(Table1.FieldByName('ID').AsInteger)
       );
Jetzt kannst du im Ereignis OnChange() recht einfach unterscheiden:

Delphi-Quellcode:
procedure TDemoForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
  case Node.Level of
    0: // Hersteller
      Table1.Locate('ID', Integer(Node.Data), []);
    1: //Produkt
      Table2.Locate('ID', Integer(Node.Data), []);
  end;
end;
Das ist ohne datensensitive Komponenten, wie du schon richtig bemerkt hast.

marabu

thklingler 5. Mai 2006 16:19

Re: Zwei Tabel als Baum Darstellen
 
Danke für die Hilfe läuft super,
aber wozu gibt es datenintensive Komponenten :?: wenn man die Lösung ohne macht ?

thklingler 5. Mai 2006 16:59

Re: Zwei Tabel als Baum Darstellen
 
Noch ein hoffentlich nicht so dumme Frage. Wie kann ich feststellen ob auf einen Root oder einen Child gecklickt wurde?
Da die Zeiger für die DB mitlaufen habe ich immer einen Bezeichner ausgwählt auch wenn der User nur auf einen Rootknoten gecklickt hat, ich zur weiter Verarbeitung aber einen ausgewählten Bezeichner brauche.

marabu 5. Mai 2006 17:18

Re: Zwei Tabel als Baum Darstellen
 
Die datensensitiven Komponenten gibt es seit D1. Durch die schematisierte Anwendung dieser Komponenten wird ein schnelles Erfolgserlebnis beim Erstkontakt sicher gestellt. Meine Sicht.

Der aktuelle Datensatz in der Tabelle kann ja ruhig beibehalten werden. Du schreibst von einem Root-Knoten - wieviele davon hast du und warum? Wenn ich auf Level 0 abfrage, dann gehe ich davon aus, dass alle Hersteller als Root-Knoten (auf der obersten Ebene) eingetragen wurden.

marabu

thklingler 5. Mai 2006 19:52

Re: Zwei Tabel als Baum Darstellen
 
Ich dachte die Hersteller sind die Rootkonten, wenn das Prog Fertig ist werden ca. 10-15 Hersteller in der DB sein.

Noch was anderes ist mir aufgefallen, das Onchange Ereigins wird nicht ausgeführt wenn man von einem Unterpunkt auf einen Aufgeklappten Unterpunkt eines anderen Kontens klickt.

Währe es nicht besser das mitfühere des Pointers in das Onclickereignis zulegen? Da dieses immer bei einer Änderung vorhanden ist.

marabu 5. Mai 2006 20:12

Re: Zwei Tabel als Baum Darstellen
 
Zitat:

Zitat von thklingler
Noch was anderes ist mir aufgefallen, das Onchange Ereigins wird nicht ausgeführt wenn man von einem Unterpunkt auf einen Aufgeklappten Unterpunkt eines anderen Kontens klickt.

Wenn das bei dir so ist, dann läuft da etwas schief.

Zitat:

Zitat von thklingler
Wäre es nicht besser das Mitführen des Pointers in das Onclick-Ereignis zulegen, da dieses immer bei einer Änderung vorhanden ist?

Nicht unbedingt, aber du solltest ruhig ein wenig damit experimentieren. Es gibt viele Stellen, die man in einer TreeView anklicken kann - und es gibt mehr als eine Maustaste. Das Ändern eines Knotens im Programm - ohne Mausklick - löst auch kein OnClick-Ereignis aus. Probiere einfach alles aus und mache dich mit der Komponente vertraut. Am Besten auch ohne Bezug zur Datenbank, sonst vermischst du unnötig zwei potentielle Problemfelder.

marabu

thklingler 8. Mai 2006 08:39

Re: Zwei Tabel als Baum Darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du hast recht, das Onchange wird ausgeführt nur die Db wird nicht aktuallisiert.

Ich habe folgendes geändert um das zu testen:

Delphi-Quellcode:
procedure TForm1.tvbaumChange(Sender: TObject; Node: TTreeNode);

begin
Showmessage('jetzt');
   case Node.Level of
    0: // Hersteller
      DataModule2.TdbTable1.Locate('Hersteller_ID', Integer(Node.Data), []);
    1: //Produkt
      DataModule2.TdbTable2.Locate('Pr_ID', Integer(Node.Data), []);
  end;
Label1.Caption:=DataModule2.TdbTable1.FieldValues['Firma'];
Label2.Caption:=DataModule2.TdbTable2.FieldValues['Bezeichung'];
Label3.Caption:=IntToStr(DataModule2.TdbTable2.FieldValues['maxl']);
Label4.Caption:=IntToStr(DataModule2.TdbTable2.FieldValues['Breite']);

end;
Das Showmessage wird immer ausgeführt, die DB(Labels) werde nicht aktuallisiert. Warum ?


Zip mit Datendateien angehängt

An bei noch das TestProg als Zip da könnt ihr das Verhalten selbst sehen.

raiguen 8. Mai 2006 10:20

Re: Zwei Tabel als Baum Darstellen
 
Moin :-)
Das Testprogramm läösst sich leider nicht ausführen, da die zugehörigen Datafiles fehlen ;-)

Zu Deinem Problem: du sagst nicht, welche DB keine Aktualisierung erhält ;-) Ich vermute mal, dass wahrscheinlich die Table2 nicht immer aktualisiert wird. Soweit ich mich erinnere, istt ja Table2 die Detailtabelle von Table1 und es werden dann ja auch nur die zugehörigen Detailsätze angezeigt. Solange ein Unterknoten von Table1 angeklickt wird, dürfte die Case-Abfrage im OnChange-Ereignis auch den angeklickten Detailsatz finden. Wenn aber auf ein Unterknoten eines anderen Hauptsatzes(Table1) geklickt wird, dann kann der Datensatz auch nicht gefunden werden ;-)
Lösung (Gedankenansatz):
Delphi-Quellcode:
procedure TForm1.tvbaumChange(Sender: TObject; Node: TTreeNode);
var: ParentNode: TTreeNode;
begin
Showmessage('jetzt');
   case Node.Level of
    0: // Hersteller
      DataModule2.TdbTable1.Locate('Hersteller_ID', Integer(Node.Data), []);
    1: //Produkt
      begin
        ParentNode := Node.Parent;
        if Integer(ParentNode.Data) <> DataModule2.TdbTable1.FieldByName('Hersteller_ID').Value then
          DataModule2.TdbTable1.Locate('Hersteller_ID', Integer(ParentNode.Data), []);
      DataModule2.TdbTable2.Locate('Pr_ID', Integer(Node.Data), []);
     end;
  end;
Label1.Caption:=DataModule2.TdbTable1.FieldValues['Firma'];
Label2.Caption:=DataModule2.TdbTable2.FieldValues['Bezeichung'];
Label3.Caption:=IntToStr(DataModule2.TdbTable2.FieldValues['maxl']);
Label4.Caption:=IntToStr(DataModule2.TdbTable2.FieldValues['Breite']);

end;
Es muss also zunächst geprüft werden, ob der zum angeklickten Unterknoten zugehörige Elternknoten (ParentNode) die gleiche Hersteller_ID hat wie der zur Zeit aktuelle Datensatz der Haupttabelle; wenn nicht, dann muss erst die Haupttabelle auf die ID des Eltenknoten eingestellt werden, damit sich die Detailtabelle entsprechend aktualisieren kann und erst dann wird auch der zum angeklickten Unterknoten zugehörige Datensatz gefunden und angezeigt...
Hoofe, ich hab mich nicht zu kompliziert ausgedrückt :roll:

thklingler 8. Mai 2006 10:30

Re: Zwei Tabel als Baum Darstellen
 
Zitat:

Das Testprogramm läösst sich leider nicht ausführen, da die zugehörigen Datafiles fehlen
:oops: Ups Schnelligkeit schütz nicht vor dummheit, Ich habe die Datendatei oben in das Zip mit eingefügt.

Danke für die schnelle Hilfe, werde das nach dem essen ausprobieren.

raiguen 8. Mai 2006 11:31

Re: Zwei Tabel als Baum Darstellen
 
Moin :)
Jo, jetzt klappt's ;-)
Wie ich's mir gedacht habe: wenn Unterknoten von einem zuvor selektierten Haupteintrag (in den Beispieldaten Metecno) angeklickt werden, dann wird der entsprechende Unterdatensatz gefunden. Wird jedoch auf einen Unterdatensatz eines anderen Herstellers (hier: Thysen) geklickt, passiert nix... Der Grund: siehe mein Posting #21 ;-)

thklingler 8. Mai 2006 12:55

Re: Zwei Tabel als Baum Darstellen
 
Danke für die Hilfe jetzt geht es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 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