AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TreeView - Daten gruppieren

Ein Thema von Ayumi · begonnen am 4. Aug 2005 · letzter Beitrag vom 4. Aug 2005
Antwort Antwort
Ayumi

Registriert seit: 20. Apr 2005
18 Beiträge
 
#1

TreeView - Daten gruppieren

  Alt 4. Aug 2005, 11:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 11:51
Was stimmt mit dieser Antwort nicht?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Ayumi

Registriert seit: 20. Apr 2005
18 Beiträge
 
#3

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 12:00
was ich machen muss, ist mir schon klar. Ich weiß nur nicht wie ich es umsetzen kann. Ansonsten ist an der Antwort nichts auszusetzen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 12:10
Na dann frag doch erstmal da weiter. Jetzt diskutieren wir hier an zwei Enden und keiner weiß, was im anderen Foruzm schon besprochen wurde.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#5

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 12:26
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!
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TreeView - Daten gruppieren

  Alt 4. Aug 2005, 22:52
Moin,

ich habe den Code erstmal aufgeräumt...

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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