AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Sortierung für TJvDBTreeView
Thema durchsuchen
Ansicht
Themen-Optionen

Sortierung für TJvDBTreeView

Ein Thema von Vincend · begonnen am 8. Dez 2010 · letzter Beitrag vom 9. Dez 2010
Antwort Antwort
Vincend

Registriert seit: 8. Dez 2010
10 Beiträge
 
#1

Sortierung für TJvDBTreeView

  Alt 8. Dez 2010, 10:31
Datenbank: MySQL • Version: 5.1 • Zugriff über: -
Hallo,
Ich habe ein relativ gr. Problem.

Ich habe eine Datenbank-Tabelle in der ich eine Baumstruktur speichere. Und suche eine Möglichkeit, dass ich diese richtig sortieren lassen kann (und in eine Query laden) um mit den Daten weiter zu arbeiten.
Die Darstellung im Programm selber funktioniert und ist auch richtig. Das übernimmt aber die JvDBTreeView und für nen Export muss ich das schon richtig sortiert haben.

Beispiel-Baum:
a
-b
--e
--f
---g
-c

Hierbei will ich so durch die Query laufen: a -> b -> e -> f -> g -> c
Da ich die Baumeinträge aber wilkürlich mache stehen diese nicht in der Reihenfolge in der Datenbank.

Hierüber bin ich gestolpert. http://www.delphipraxis.net/740213-post1.html
Komm damit aber nicht ganz weiter. Hab das mal in eine Test-DB geladen um zu schauen aber ich kann dann das Feld id nicht eindeutig zuordnen (ambiguouse).


Meine Datenbank sieht wie folgt aus.
Code:
CREATE TABLE `tbl_app_menue_xml_inhalte_content` (
  `id_app_menue_xml_inhalte_content` int(11) NOT NULL AUTO_INCREMENT,
  `tbl_app_menue_xml_inhalte_id` int(11) DEFAULT NULL,
  `sub_id_app_menue_xml_inhalte_content` int(11) DEFAULT NULL,
  `reihenfolge` int(11) DEFAULT NULL,
  `tbl_app_menue_xml_kategorie_id` int(11) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `eintrag_aktiv` char(1) DEFAULT NULL,
  `standart_verwenden` char(1) DEFAULT NULL,
  `geloescht` char(1) DEFAULT NULL,
  PRIMARY KEY (`id_app_menue_xml_inhalte_content`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;
Wichtig:
id_app_menue_xml_inhalte_content ist die id
sub_id_app_menue_xml_inhalte_content ist die Zuordnung zu dem übergeordneten Datensatz
reihenfolge sortiert die Elemente auf einer Ebene
name erklärt sich eig. von selbst

Unwichtig:
tbl_app_menue_xml_inhalte_id stellt aber die Zugehörigkeit jeden Datensatztes zur Gesamtmasse dar
tbl_app_menue_xml_kategorie_id ist ein Fremdschlüssel den ich zur Bestimmung bestimmung weiterer eigenschaften brauch
eintrag_aktiv, standart_verwenden & geloescht sind entweder optische Punkte oder Sachen die ch für den Export brauche

Mein Fragen:
1. Warum bekomm ich das Beispiel nicht zum laufen.(wo ist der Fehler mit dem ID Feld)
2. Wie portiere ich das richtig auf meine Struktur & was müsste ich noch ändern an den Eigenschaften meiner Datenbank.
  Mit Zitat antworten Zitat
Vincend

Registriert seit: 8. Dez 2010
10 Beiträge
 
#2

AW: Sortierung für TJvDBTreeView

  Alt 9. Dez 2010, 17:25
So...
ich hab mir jetzt was anderes überlegt.
Ich muss das ganze nicht in der Query schon sorteirt haben. Ich kann das auch über nen Array machen. Dann müssen die Daten nur dort richtig sortiert werden.

Für das löschen eines ganzes Astes hab ich mir dies hier zusammengebaut:
Code:
      while not b_loeschen_fertig do
      begin
        First;

        while not Eof do //Datensätze zu Array fügen
        begin
          if FieldByName('sub_id_app_menue_xml_inhalte_content').AsInteger = arr_Baum_Loeschen[i] then
          begin
            SetLength(arr_Baum_Loeschen, Length(arr_Baum_Loeschen) + 1);
            arr_Baum_Loeschen[Length(arr_Baum_Loeschen) - 1] := FieldByName('id_app_menue_xml_inhalte_content').AsInteger;
            b_eintrag_gefunden := true;
          end;

          Next;
        end; //Ende while

        //Abbruch wenn keine Datensatz zum Array gefügt wird & das Ende des Array erreicht ist
        if b_eintrag_gefunden = true then b_eintrag_gefunden := false
          else if i = Length(arr_Baum_Loeschen) - 1 then b_loeschen_fertig := true;

        i := i + 1;
      end; //Ende while
Baut auf ner Query auf.
b_loeschen_fertig, b_eintrag_gefunden = boolean
arr_Baum_Loeschen = array of Integer
Im Anschluss lauf ich halt den Array durch und lösche alle Datensätze.

Jetzt will ich das quasy für den Export Teilweise nutzen.
Dazu muss ich ja nur die Wurzel haben (Kein Problem).
Deren Kinder finden und nach "reihenfolge" sortieren (auch kein Problem).
Wenn ich jetzt die Liste durchlaufe muss ich aber den Ast von dort aus weiter runterlaufen bis ich am Ende angekommen bin und das einen weiter Springen in der 1. Child-Liste. Stichwort dabei ist "Rekursion". Nur gut, dass ich genau davon keinen Plan hab wie ich das anstelle weil ja jedes Child Element der Wurzel n Childs haben kann.
Das Problem zu lösen ist bestimmt einfacher?!
  Mit Zitat antworten Zitat
Vincend

Registriert seit: 8. Dez 2010
10 Beiträge
 
#3

AW: Sortierung für TJvDBTreeView

  Alt 9. Dez 2010, 22:19
*JUBEL JUBEL FREU FREU*

Endlich is es fertig!

Delphi-Quellcode:
procedure array_sortieren(i_uebergabe : Integer);
  var i_max, i_parent, i, i_ende : Integer;
      b_ende : Boolean;
      arr_test : array of Integer;
      arr_ausgabe : array of Integer;
      s_ausgabe : String;
begin
  b_ende := false;
  i := 0;
  i_ende := 1;
  SetLength(arr_test, 1);
  SetLength(arr_ausgabe, 1);

  with D_Datenmodul.qu_plz_ort do
  begin
    //Maximale Elemente das Baums finden
    Close;
    SQL.Text := 'SELECT COUNT(id_app_menue_xml_inhalte_content) as maximum ';
    SQL.Add('FROM tbl_app_menue_xml_inhalte_content ');
    SQL.Add('WHERE tbl_app_menue_xml_inhalte_id = '''+IntToStr(i_uebergabe)+'''');
    Open; First;
    i_max := FieldByName('maximum').AsInteger;
    //*****

    //Startpunkt des Baumes finden
    Close;
    SQL.Text := 'SELECT id_app_menue_xml_inhalte_content as parent_element ';
    SQL.Add('FROM tbl_app_menue_xml_inhalte_content ');
    SQL.Add('WHERE tbl_app_menue_xml_inhalte_id = '''+IntToStr(i_uebergabe)+''' + AND sub_id_app_menue_xml_inhalte_content = 0');
    Open; First;
    arr_test[0] := FieldByName('parent_element').AsInteger;
    arr_ausgabe[0] := FieldByName('parent_element').AsInteger;
    //*****

    while not b_ende do
    begin
      Close;
      SQL.Text := 'SELECT id_app_menue_xml_inhalte_content ';
      SQL.Add('FROM tbl_app_menue_xml_inhalte_content ');
      SQL.Add('WHERE sub_id_app_menue_xml_inhalte_content = '''+IntToStr(arr_test[Length(arr_test) - 1])+''' ');
      SQL.Add('AND id_app_menue_xml_inhalte_content not in (');

      for I := 0 to Length(arr_ausgabe) - 1 do //sortiertes nicht mehr beachten
      begin
        if i > 0 then SQL.Add(', ');
        SQL.Add(IntToStr(arr_ausgabe[i]));
      end;

      SQL.Add(') ORDER BY reihenfolge');
      Open; First;

      //Sortierung abspeichern & Baum-Pfadbestimmen in dem gesucht wird
      if not Eof then
      begin
        SetLength(arr_ausgabe, Length(arr_ausgabe) + 1);
        arr_ausgabe[Length(arr_ausgabe) - 1] := FieldByName('id_app_menue_xml_inhalte_content').AsInteger;
        i_ende := i_ende + 1;

        SetLength(arr_test, Length(arr_test) + 1);
        arr_test[Length(arr_test) - 1] := FieldByName('id_app_menue_xml_inhalte_content').AsInteger;
      end else
        SetLength(arr_test, Length(arr_test) - 1);
      //*****

      if i_ende = i_max then
        b_ende := true;
    end;
  end;

  for I := 0 to Length(arr_ausgabe) - 1 do
  s_ausgabe := s_ausgabe + ', ' + IntToStr(arr_ausgabe[i]);

  if (MessageDlg(s_ausgabe, mtWarning, [mbYes, mbCancel], 0) = mrYes) then
  begin

  end;
end;
Die Benennung is noch fürn hintern aber dafür wars ja auch nen Test in den Abendstunden.
Werd das die Tage mal vernünftig machen und online stellen.
Ausgehende Tabellenstruktur is ja oben.
  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 06:16 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