Announcement

Collapse
No announcement yet.

TTreeView aus Datenbank füllen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TTreeView aus Datenbank füllen?

    Ich brauche Hilfe! Ich muss in meiner Anwendung Ein Treeview teilweise aus einer Datenbank (Hauptordner) und mit jeweils 8 festen Unterordnern füllen.
    Für die Unterordner muss ich dann abhängig vom zugehörigen Vaterknoten unterschiedliche Selects auf der Datenbank ausführen, die jeweils nur die Daten des Hauptordners (Mandanten) wiedergeben. Also in der Form:
    Select * from koststell where mandantid = <zugehöriger Vaterknoten>. Wie kann ich den entsrechenden Knoten referenzieren? In VB kann mann einen String als Key für jeden Treevieweintrag angeben.
    Gruß Andreas

  • #2
    Hi!<br>
    Feste Hierarchietiefe drei?<br>
    Dann wäre Knoten.parent.parent der Vaterknoten den Du suchst.<br>

    Sonst:<br>
    while Knoten.level > 0 do Knoten := Knoten.parent;<br>
    Damit kannst Du Dich nach "oben" hangeln.<br>

    BYE BERND<br&gt

    Comment


    • #3
      Danke erstmal, aber wie bringe ich den Knoten mit meinem Mandanten für die Selects in Verbindung?

      Gruß Andrea

      Comment


      • #4
        Wenn ich es recht verstehe fehlt Dir die ID des Mandanten richtig?<br>
        Diese Info kannst Du problemlos im TreeNode unterbringen<br>
        Knoten.Data := pointer ( VatersID ) zum setzen<br>
        VatersID := integer ( Knoten.data ) zum auslesen<br>

        BYE BERN

        Comment


        • #5
          Hallo,

          über welchen Weg wird auf die Datenbank zugegriffen? Wenn es sich um ADO handelt, würde ich auf die speziellen Fähigkeiten des <b>SHAPE</b>-Providers zurückgreifen. Das folgende Beispiel demonstriert dies mit der Northwind-Beispieldatenbank:
          <pre>
          SHAPE {SELECT * FROM Customers}
          APPEND ({SELECT * FROM Orders}
          RELATE CustomerID TO CustomerID)')
          </pre>
          Konfiguration im Objektinspektor:
          <pre>
          object ADODataSet1: TADODataSet
          Active = True
          Connection = ADOConnection1
          CursorType = ctStatic
          CommandText =
          'SHAPE {SELECT * FROM Customers}'#13#10'APPEND ({SELECT * FROM Orders}'#13 +
          #10'RELATE CustomerID TO CustomerID)'
          Parameters = <>
          Left = 392
          Top = 11
          object ADODataSet1CustomerID: TWideStringField
          FieldName = 'CustomerID'
          FixedChar = True
          Size = 5
          end
          object ADODataSet1CompanyName: TWideStringField
          FieldName = 'CompanyName'
          Size = 40
          end
          object ADODataSet1City: TWideStringField
          FieldName = 'City'
          Size = 15
          end
          object ADODataSet1Chapter1: TDataSetField
          FieldName = 'Chapter1'
          ReadOnly = True
          IncludeObjectField = False
          end
          end
          object ADODataSet2: TADODataSet
          Active = True
          CursorType = ctStatic
          DataSetField = ADODataSet1Chapter1
          Parameters = <>
          Left = 392
          Top = 40
          object ADODataSet2OrderID: TAutoIncField
          FieldName = 'OrderID'
          ReadOnly = True
          end
          object ADODataSet2CustomerID: TWideStringField
          FieldName = 'CustomerID'
          FixedChar = True
          Size = 5
          end
          object ADODataSet2ShipName: TWideStringField
          DisplayWidth = 25
          FieldName = 'ShipName'
          Size = 40
          end
          object ADODataSet2ShipVia: TIntegerField
          DisplayWidth = 5
          FieldName = 'ShipVia'
          end
          object ADODataSet2Freight: TBCDField
          DisplayWidth = 10
          FieldName = 'Freight'
          Precision = 19
          end
          object ADODataSet2ShipPostalCode: TWideStringField
          FieldName = 'ShipPostalCode'
          Size = 10
          end
          end
          </pre>
          Übernahme der Daten ins TreeView:
          <pre>
          procedure TForm1.ShowData;
          var
          CNode, // Einhängepunkt für Master-Datensätze
          CNode2, // Einhängepunkt für Child-Datensätze
          CNode3 : TTreeNode;
          sName : String;
          begin
          with TreeViewData.Items do
          begin
          BeginUpdate;
          Clear;
          CNode := AddChild(nil, 'SHAPE-Daten');
          // Bitmap für den Wurzeleintrag festlegen
          CNode.ImageIndex := 0;
          try
          while not ADODataSet1.EOF do
          begin
          sName := ADODataSet1CompanyName.Value;
          CNode2 := AddChild(CNode, sName);
          CNode2.ImageIndex := 1;
          while not ADODataSet2.EOF do
          begin
          sName := ADODataSet2OrderID.AsString;
          CNode3 := AddChild(CNode2, sName);
          CNode3.ImageIndex := 2;
          ADODataSet2.Next;
          end;
          ADODataSet1.Next;
          end;
          finally
          EndUpdate;
          end;
          end;
          end;
          </pre>
          Wenn die Abfrage für jeden Hauptdatensatz einzeln benötigt wird, ist SHAPE auch dazu in der Lage, wobei ADO diese Anweisung automatisch immer dann neu ausführt, wenn der Hauptdatensatz neu positioniert wird:
          <pre>
          SHAPE {SELECT * FROM Customers}
          APPEND ({SELECT * FROM Orders WHERE CustomerID=?}
          RELATE CustomerID TO Parameter 0)
          </pre&gt

          Comment


          • #6
            Hallo Bernd!
            Also erstmal Danke für Deine Tips. Vielleicht sollte ich dazu sagen, dass ich unter DElphi noch nie ein TreeView progammiert habe. Ich habe das mit dem Data mal ausprobieert, aber nach Durchlauf ist
            Data = nil. Es wäre super, wenn Du mir mal ein kleines Beispiel schreiben könntest. Also die Mandanten sind bei mir die oberste Ebene, darunter jeweils acht feste, unterschiedliche Knoten. Vielleicht ein Beispiel bis zum ersten Unterknoten?
            Danke.

            Gruß Andrea

            Comment


            • #7
              Hallo Andreas!
              Erstmal Danke für DEin Beispiel.
              Also ich greife über die BDE auf eine Interbase - Datenbank zu.
              Vielleicht kannst Du mir ja auch ohne ADO weiterhelfen.
              Gruß Andrea

              Comment


              • #8
                Kein Thema mein erster TreeView hat 2-3 Tage in Anspruch genommen.<br>
                Zum Einfügen eines neuen Mandanten:<br>
                procedure TForm1.NeuerMandantenKnoten (<br>
                ID : integer; Name : String );<br>
                var<br>
                help, unter : ttreenode;<br>
                begin<br>
                help := treeview1.items.addchild ( nil, Name );<br>
                help.data := pointer ( ID );<br>
                unter := treeview1.items.addchild ( help, 'Unterknoten A' );<br>
                unter.data := pointer ( -1 );<br>
                unter.haschildren := true;<br>
                unter := treeview1.items.addchild ( help, 'Unterknoten B' );<br>
                unter.data := pointer ( -2 );<br>
                unter.haschildren := true;<br>
                unter := treeview1.items.addchild ( help, 'Unterknoten C' );<br>
                unter.data := pointer ( -3 );<br>
                unter.haschildren := true;<br>
                end;<br>
                <br>
                Jetzt das OnExpand Ereignis des TreeViews belegen:<br>
                if treeview1.selected = nil then<br>
                exit;<br>

                //Nur wenn die ID kleiner als 0 ist ist es ein Unerknoten!<br>
                if integer ( Treeview1.selected.data ) < 0 then begin<br>
                showmessage ( 'Mandant ist :' +<br>
                inttostr (<br>
                integer ( Treeview1.selected.parent.data ) ));<br>
                //Tja hier sind nun die Unterknoten mit "Leben" zu füllen!
                end;<br>
                BYE BERN

                Comment


                • #9
                  Hallo Bernd!

                  Danke für Deine Mühe. Werde es sofort ausprobieren.

                  Gruß Andrea

                  Comment

                  Working...
                  X