[Gelöst] VirtualDBTreeEx

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MacWomble
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

Beitrag von MacWomble »

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
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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: VirtualDBTreeEx

Beitrag von theo »

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.

MacWomble
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

Beitrag von MacWomble »

Möglicherweise habe ich mich unklar ausgedrückt.
VirtualTreeEx.png
VirtualTreeEx.png (15.87 KiB) 1859 mal betrachtet

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.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
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

Beitrag von MacWomble »

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.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

MacWomble
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

Beitrag von MacWomble »

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.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: VirtualDBTreeEx

Beitrag von theo »

Warum willst du eigentlich den gesamten Baum durchnummerieren?
Wäre es nicht schlauer nur jeweils alle Kinder zu sortieren?

Code: Alles auswählen

 
1
2
 1
 2
  1
  2
  3
 3
3

MacWomble
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

Beitrag von MacWomble »

theo hat geschrieben:Wäre es nicht schlauer nur jeweils alle Kinder zu sortieren?


Macht doch keinen Unterschied, ausser dass ich bei der Kinder-Lösung aufwändiger sortieren muss.

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.

MacWomble
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

Beitrag von MacWomble »

Habe gerade etwas herausgefunden:

wenn ich

Code: Alles auswählen

Node := VirtualDBTreeEx.GetNextSibling(Node); 

verwende, bekomme ich nur einen Schleifendurchlauf (ab aktueller Position im Tree) und komme mit Keyfield.value auch an den richtigen Wert.

Verwende ich

Code: Alles auswählen

Node := VirtualDBTreeEx.GetNext(Node);

Wird die Schleife passend oft durchlaufen, aber ich bekomme nur den Key-Wert des ersten Datensatzes

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.

MacWomble
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

Beitrag von MacWomble »

Ich habe es nun gefunden: :shock:

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.

Antworten