Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TreeView - Daten gruppieren (https://www.delphipraxis.net/51004-treeview-daten-gruppieren.html)

Ayumi 4. Aug 2005 11:49


TreeView - Daten gruppieren
 
Hallo,
ich habe eine Funktion, die Daten aus der DB ausliest. Das Auslesen aus der DB und Anzeigen im TreeView funktioniert soweit.
Im TreeView sehen meine Daten folgendermaßen aus:
2000
--Xyz
----Test
2000
--Abc
----Test1
2000
--Abc
----Test2

Ich möchte aber, dass es folgendermaßen aussieht
2000
--Xyz
----Test
--Abc
----Test1
----Test2

Kann mir da jemand weiter helfen

Vielen Dank im Voraus
Ayumi


Delphi-Quellcode:
function TDataModule1.fuelleTreeView( var TreeView1: TTreeView):boolean;
var
i                  : integer;
VkampagneRec       : PKampagneRec;
vJahrTreeNode      : TTreeNode;
vKundeTreeNode     : TTreeNode;
vProduktTreeNode   : TTreeNode;
vKampagneTreeNode  : TTreeNode;
vMutterTreeNode    : TTreeNode;

begin
try
   vMutterTreeNode := nil;
  begin
  with ADODataSet1 do
  begin
    close;
    CommandType := cmdText;
    CommandText :=   'select ' +
                      'decode (to_char(max(a.sttmact), ''yyyy''), '''', ''unbekannt'', to_char(max(a.sttmact), ''yyyy'')) Jahr, ' +
                      'c.advert, c.product, c.ccamp, c.icamp ' +
                      'from campaign c, actions a ' +
                      'where c.ccamp = a.ccamp(+) ' +
                      'group by c.ccamp, c.icamp, c.product, c.advert ' +
                      'order by jahr, c.advert, c.product, c.icamp';
    Open;
    First;
  end;

  while not ADODataSet1.Eof do
   begin
    new(vKampagneRec);
    //datum, kunde, produkt, kampagne aus der Datenbankselektion lesen
    vKampagneRec^.rec_Jahr       := ADODataSet1.FieldByName('Jahr').AsString;
    vKampagneRec^.rec_Kunde      := ADODataSet1.FieldByName('advert').AsString;
    vKampagneRec^.rec_produkt    := ADODataSet1.FieldByName('product').AsString;
    vKampagneRec^.rec_kampagne   := ADODataSet1.FieldByName('icamp').AsString;


   vJahrTreeNode:=TreeView1.Items.AddObject(vMutterTreeNode,ADODataSet1.FieldByName('Jahr').AsString, vkampagneRec);
   vKundeTreeNode := TreeView1.Items.AddChildObject(vJahrTreeNode, ADODataSet1.FieldByName('advert').AsString, vKampagneRec);
   vProduktTreeNode := TreeView1.Items.AddChildObject(vKundeTreeNode, ADODataSet1.FieldByName('product').AsString, vKampagneRec);
   vKampagneTreeNode := TreeView1.Items.AddChildObject(vProduktTreeNode, ADODataSet1.FieldByName('icamp').AsString, vKampagneRec);
    ADODataSet1.next;
   end;
   result := true;
 end;
except
  begin
  result := false;
 end;
end;
end;

Luckie 4. Aug 2005 11:51

Re: TreeView - Daten gruppieren
 
Was stimmt mit dieser Antwort nicht?

Ayumi 4. Aug 2005 12:00

Re: TreeView - Daten gruppieren
 
was ich machen muss, ist mir schon klar. Ich weiß nur nicht wie ich es umsetzen kann. Ansonsten ist an der Antwort nichts auszusetzen.

Luckie 4. Aug 2005 12:10

Re: TreeView - Daten gruppieren
 
Na dann frag doch erstmal da weiter. Jetzt diskutieren wir hier an zwei Enden und keiner weiß, was im anderen Foruzm schon besprochen wurde.

ibp 4. Aug 2005 12:26

Re: TreeView - Daten gruppieren
 
Delphi-Quellcode:
..
// finde node mit namen
node:=node.getfirstnode;
while (node=nil) or (node.text=name)
  node:=node.getnextsibling;
...
das sollte helfen! mal so ins blaue getippt!

omata 4. Aug 2005 22:52

Re: TreeView - Daten gruppieren
 
Moin,

ich habe den Code erstmal aufgeräumt...

Zitat:

Zitat von Ayumi
Delphi-Quellcode:
function TDataModule1.fuelleTreeView(TreeView1: TTreeView):boolean;
var i, jahr            : integer;
    VkampagneRec       : PKampagneRec;
    vJahrTreeNode      : TTreeNode;
    vKundeTreeNode     : TTreeNode;
    vProduktTreeNode   : TTreeNode;
    vKampagneTreeNode  : TTreeNode;
    vMutterTreeNode    : TTreeNode;
begin
  try
    vMutterTreeNode := nil;
    with ADODataSet1 do begin
      close;
      CommandType := cmdText;
      CommandText :=  
        'SELECT DECODE(TO_CHAR(MAX(a.sttmact), ''yyyy''), ' +
        '             '''', ' +
        '             ''unbekannt'', ' +
        '             TO_CHAR(MAX(a.sttmact), ''yyyy'')) Jahr, ' +
        '      c.advert, c.product, c.ccamp, c.icamp ' +
        'FROM campaign c, actions a ' +
        'WHERE c.ccamp = a.ccamp(+) ' +
        'GROUP BY c.ccamp, c.icamp, c.product, c.advert ' +
        'ORDER BY jahr, c.advert, c.product, c.icamp';
      Open;
    end;

    jahr:=-1;
    vJahrTreeNode:=nil;
    while not ADODataSet1.Eof do begin
      new(vKampagneRec);
      //datum, kunde, produkt, kampagne aus der Datenbankselektion lesen
      vKampagneRec^.rec_Jahr       := ADODataSet1.FieldByName('Jahr').AsString;
      vKampagneRec^.rec_Kunde      := ADODataSet1.FieldByName('advert').AsString;
      vKampagneRec^.rec_produkt    := ADODataSet1.FieldByName('product').AsString;
      vKampagneRec^.rec_kampagne   := ADODataSet1.FieldByName('icamp').AsString;

      if jahr <> ADODataSet1.FieldByName('Jahr').AsInteger then begin
        jahr:=ADODataSet1.FieldByName('Jahr').AsInteger;
        vJahrTreeNode:=TreeView1.Items.AddObject(
          vMutterTreeNode,
          ADODataSet1.FieldByName('Jahr').AsString,
          vkampagneRec
        );
      end;
      vKundeTreeNode := TreeView1.Items.AddChildObject(
        vJahrTreeNode,          
        ADODataSet1.FieldByName('advert').AsString,
        vKampagneRec
      );
      vProduktTreeNode := TreeView1.Items.AddChildObject(
        vKundeTreeNode,
        ADODataSet1.FieldByName('product').AsString,
        vKampagneRec
      );
      vKampagneTreeNode := TreeView1.Items.AddChildObject(
        vProduktTreeNode,
        ADODataSet1.FieldByName('icamp').AsString,
        vKampagneRec
      );
      ADODataSet1.next;
    end;
    result := true;
  except
    result := false;
  end;
end;

Da du nach dem Jahr sortierst kannst du dir das doch einfach merken und bei einer Änderung einen neuen Jahr-Knoten anlegen. Sonst bleibt der Knoten einfach unverändert. Ein Jahr -1 wird es nie geben und somit ist die richtige Initalisierung auch gegeben.

Aber mal ne ganz andere Frage, alle Knoten auf dem Weg zum Blatt bekommen den selben vKampagneRec. Dann gibt es doch keine Unterscheidung mehr und wie soll das beim Zusammenfassen gehen?
Wird der reservierte Speicher überhaupt wieder richtig freigegeben? Dann müsste es bei dir nur so Zugriffsverletzungen hageln. Oder merkst du dir alle Zeiger und schaust, ob du den Zulöschenden vielleicht schon freigegeben hast?

MfG
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz