[Gelöst] VirtualDBTreeEx
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
[Gelöst] VirtualDBTreeEx
Hallo,
ich beisse mir seid Tagen die Zähne aus und finde leider nirgens eine vernünftige Lösung.
Ich habe eine Anwendung mit einem Virtualtreeex erstellt. Das funktioniert so weit, die Baumstruktur stimmt.
Nun meine Fragen/Probleme:
1. in LevelField habe ich ein Integer-Feld 'Level' der DB eingetragen, dieses erhält aber keinen Wert
2. wie kann ich die Datensätze in exakt der Reihenfolge durchnummerieren, wie diese im Tree angezeigt sind (brauche diese Sortierung z.B. für den Druck)
alternativ: wo finde ich eine BeispielSQL die so sortiert wie der Tree
Die Datenbank besteht im wesentlichen aus
SatzID
Parent
Level (..der aber nicht funktioniert)
Bezeichnung
ich beisse mir seid Tagen die Zähne aus und finde leider nirgens eine vernünftige Lösung.
Ich habe eine Anwendung mit einem Virtualtreeex erstellt. Das funktioniert so weit, die Baumstruktur stimmt.
Nun meine Fragen/Probleme:
1. in LevelField habe ich ein Integer-Feld 'Level' der DB eingetragen, dieses erhält aber keinen Wert
2. wie kann ich die Datensätze in exakt der Reihenfolge durchnummerieren, wie diese im Tree angezeigt sind (brauche diese Sortierung z.B. für den Druck)
alternativ: wo finde ich eine BeispielSQL die so sortiert wie der Tree
Die Datenbank besteht im wesentlichen aus
SatzID
Parent
Level (..der aber nicht funktioniert)
Bezeichnung
Zuletzt geändert von MacWomble am Sa 28. Feb 2015, 18:24, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: VirtualDBTreeEx
Ich weiß nicht genau auf welchen Bereich deine Frage abzielt.
Ein TVirtualNode hat die Eigenschaften Parent und Index (innerhalb des Parent) und der VTV die Methode GetNodeLevel(Node).
Damit sollte eigentlich eine Lokalisierung möglich sein.
Ein TVirtualNode hat die Eigenschaften Parent und Index (innerhalb des Parent) und der VTV die Methode GetNodeLevel(Node).
Damit sollte eigentlich eine Lokalisierung möglich sein.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Möglicherweise habe ich mich unklar ausgedrückt.
Ich kann zwar die Nodes durch eine Schleife mit Zähler jagen und erhalte dann den richtigen Wert, bekomme diesen jedoch nicht in die Datenbank.
Was ich benötige sind die in rot dargestellten Nummern als Eintrag in der Datenbank. (bei Sportverein habe ich die 0 vergessen)Ich kann zwar die Nodes durch eine Schleife mit Zähler jagen und erhalte dann den richtigen Wert, bekomme diesen jedoch nicht in die Datenbank.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: VirtualDBTreeEx
Für mich stellt sich schon die frage ob der Wert überhaupt in die DB gehört. Für eine fortlaufende Nummerierung reicht ja das durch iterieren. Wenn du es in die DB gibst, wie stellst du sicher das die Werte aus deiner Treeview und der DB immer zusammenstimmen. Wenn du einen Punkt hinzufügst, so muss du die komplette Nummerierung ja neu durchrechnen und in der DB wieder korrigieren. Oder verwende die SatzID, die sollte ja auch eindeutig sein.
Irgendwie macht es für mich noch keinen Sinn.
Irgendwie macht es für mich noch keinen Sinn.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Da ich mit Lazreport Berichte erstellen muss und diese die richtige Reihenfolge darstellen müssen, dachte ich an eine Laufende Nummer. Die SatzID ist hierzu keinesfalls geeignet, da diese nur die Erfassungsreihenfolge nicht aber die Struktur wieder gibt.
Mit iterieren bekomme ich auch die laufenden Nummern, aber ich komme dann nicht gleichzeitig an den passenden Datensatz (keine Ahnung wie)
Dass ich immer die kompletten Datensätze aktualisieren muss, ist mir klar, aber dies ist nur vor der Druckaufbereitung nötig.
Ich kann nur dann auf die Nummerierung verzichten, wenn ich die Struktur exakt über eine SQL abbilden kann - und auch hier stehe ich auf dem Schlauch, obwohl dies natürlich die bessere Lösung wäre. Hier kommt hinzu, das es drei Satzarten in der Datenbank gibt, die bei der Sortierung zu berücksichtigen sind:
0 Archiv (Root)
1 Text
2 Gliederung
3 Detailsatz
Sortierung Archiv, (Text), Gliederung, (Text), Detail wobei der Text entweder vor den Gliederungen oder vor den Details kommt.
Verschachtelungstiefe theoretisch unbegrenzt
Bsp:
Root
.....Text
.....Text
.....Gliederung
.....Gliederung
..........Text
..........Gliederung
...............Text
...............Detail
...............Detail
..........Gliederung
...............Detail
..........Gliederung
Wie gesagt, der Baum stellt die richtige Reihenfolge dar - nur müsste ich das in die Datenbank bekommen.
Mit iterieren bekomme ich auch die laufenden Nummern, aber ich komme dann nicht gleichzeitig an den passenden Datensatz (keine Ahnung wie)
Dass ich immer die kompletten Datensätze aktualisieren muss, ist mir klar, aber dies ist nur vor der Druckaufbereitung nötig.
Ich kann nur dann auf die Nummerierung verzichten, wenn ich die Struktur exakt über eine SQL abbilden kann - und auch hier stehe ich auf dem Schlauch, obwohl dies natürlich die bessere Lösung wäre. Hier kommt hinzu, das es drei Satzarten in der Datenbank gibt, die bei der Sortierung zu berücksichtigen sind:
0 Archiv (Root)
1 Text
2 Gliederung
3 Detailsatz
Sortierung Archiv, (Text), Gliederung, (Text), Detail wobei der Text entweder vor den Gliederungen oder vor den Details kommt.
Verschachtelungstiefe theoretisch unbegrenzt

Bsp:
Root
.....Text
.....Text
.....Gliederung
.....Gliederung
..........Text
..........Gliederung
...............Text
...............Detail
...............Detail
..........Gliederung
...............Detail
..........Gliederung
Wie gesagt, der Baum stellt die richtige Reihenfolge dar - nur müsste ich das in die Datenbank bekommen.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Was ich versucht habe:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
Node: PVirtualNode;
Nr: integer;
begin
Nr:=1;
Node := VirtualDBTreeEx.GetFirst;
while Assigned(Node) do
begin
// hier müsste ich den Satz in der Datenbank aktualisieren - aber wie komme ich dran
Nr:= Nr+1;
Node := VirtualDBTreeEx.GetNext(Node);
end;
end;
Zuletzt geändert von MacWomble am Sa 28. Feb 2015, 14:33, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
Re: VirtualDBTreeEx
Warum willst du eigentlich den gesamten Baum durchnummerieren?
Wäre es nicht schlauer nur jeweils alle Kinder zu sortieren?
Wäre es nicht schlauer nur jeweils alle Kinder zu sortieren?
Code: Alles auswählen
1
2
1
2
1
2
3
3
3
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Macht doch keinen Unterschied, ausser dass ich bei der Kinder-Lösung aufwändiger sortieren muss.theo hat geschrieben: Wäre es nicht schlauer nur jeweils alle Kinder zu sortieren?
Ich benötige letztendlich ebenso die Verbindung zwischen Node und DB-Satz.
Und genau hier ist mein Problem, da ich in meiner Schleife nicht an den Wert des DBKeyfeldes von VirtualDBTreeEx komme.
Sicher ist das nur eine Kleinigkeit, die ich übersehe bzw. nicht vertsehe.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Habe gerade etwas herausgefunden:
wenn ich
verwende, bekomme ich nur einen Schleifendurchlauf (ab aktueller Position im Tree) und komme mit Keyfield.value auch an den richtigen Wert.
Verwende ich
Wird die Schleife passend oft durchlaufen, aber ich bekomme nur den Key-Wert des ersten Datensatzes
wenn ich
Code: Alles auswählen
Node := VirtualDBTreeEx.GetNextSibling(Node);
Verwende ich
Code: Alles auswählen
Node := VirtualDBTreeEx.GetNext(Node);
Code: Alles auswählen
procedure TfrmFindbuch.Button2Click(Sender: TObject);
var
Node: PVirtualNode;
Nr: integer;
begin
Nr:=1;
Node := DBTVGliederung.GetFirst;
while Assigned(Node) do
begin
// hier müsste ich den Satz in der Datenbank aktualisieren - aber wie komme ich dran
ShowMessage(inttostr(Nr)+' ' + inttostr(DBTVGliederung.KeyField.Value));
Nr:= Nr+1;
Node := DBTVGliederung.GetNext(Node); // oder DBTVGliederung.GetNextSibling(Node);
end;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: VirtualDBTreeEx
Ich habe es nun gefunden:

Code: Alles auswählen
procedure TfrmFindbuch.Button2Click(Sender: TObject);
var
Node: PVirtualNode;
Nr: integer;
begin
DBTVGliederung.Enabled:=False;
Nr := 1;
Node := DBTVGliederung.GetFirst;
while Assigned(Node) do
begin
DBTVGliederung.FocusedNode:=Node; // Das hat gefehlt :shock:
ZQuery_Archiv.Edit;
ZQuery_Archiv.FieldByName('ArchivFolge').Value:=Nr;
ZQuery_Archiv.FieldByName('ArchivLevel').Value:=DBTVGliederung.GetNodeLevel(node);
ZQuery_Archiv.ApplyUpdates;
Nr := Nr + 1;
Node := DBTVGliederung.GetNext(Node);
end;
DBTVGliederung.Enabled:=True;
Node := DBTVGliederung.GetFirst;
DBTVGliederung.FocusedNode:=Node;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.