Announcement

Collapse
No announcement yet.

Daten in einer Baumstruktur sortieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten in einer Baumstruktur sortieren

    Hallo,
    ich möchte Daten in einer Baumstruktur Sortieren...<BR>
    Folgende Quelldaten :<BR>
    <BR>
    Gruppe / Parent_Gruppe / Bezeichnung<BR>
    2 NULL Papier<BR>
    7 NULL Tabak<BR>
    9 NULL Kaugummi<BR>
    10 NULL Eis<BR>
    11 NULL Snacks<BR>
    12 NULL Langnese<BR>
    13 NULL Schöller<BR>
    5 1 Zigaretten<BR>
    6 2 Filter<BR>
    1 4 Büro<BR>
    3 5 Stifte<BR>
    4 6 Lineale<BR>
    8 7 Süsses<BR>
    <BR>
    wie mann sieht, kommt nach der ersten Ebene mit Parent Null die Gruppe 5 mit Parent 1. Diese kann aber nicht angelegt werden, da Gruppe 1 erst zwei Schritte später angelegt wird. Wie kann ich Recursiv Sortieren ?<BR>
    <BR>
    Richtig Sortiert müßte das so aussehen:<BR>
    <BR>
    Gruppe / Parent_Gruppe / Bezeichnung<BR>
    2 NULL Papier<BR>
    7 NULL Tabak<BR>
    9 NULL Kaugummi<BR>
    10 NULL Eis<BR>
    11 NULL Snacks<BR>
    12 NULL Langnese<BR>
    13 NULL Schöller<BR>
    6 2 Filter<BR>
    8 7 Süsses<BR>
    4 6 Lineale<BR>
    1 4 Büro<BR>
    5 1 Zigaretten<BR>
    3 5 Stifte<BR>
    <BR>
    Hat einer eine Idee ?<BR>

  • #2
    Hallo Sascha,

    ich vermisse den Eintrag für '1 NULL <Bezeichnung>'. So wie das Aussieht gibt es das 'Sub-Item' '1 4 Büro', ohne daß das 'Parent-Item' '1 NULL <Bezeichnung>' überhaupt existiert???

    Joche

    Comment


    • #3
      Danke für deine antwort,

      doch das gibt es. 1/4 bezieht sich auf 4/6 und dieses wiederum auf 6/2 dieses wiederum aud 2/NULL womit wir am startknoten wären.<BR>
      <BR>
      -2/NULL<BR>
      6/2<BR>
      4/6<BR>
      1/4<BR>
      <BR>
      Parent bezieht sich ja immer auf den davorliegenden Knoten<BR>
      Hast du vielleicht eine weitere Idee

      Comment


      • #4
        äh - nö, so auf die Schnelle nicht, aber ich denk mal drüber nach...

        Joche

        Comment


        • #5
          Hallo,

          ich verstehe das Problem noch nicht.
          WEnn ich in die DB COnstraints packe, die mir zusichern, dass eine Element nur eingefuegt werden kann, wenn sein Parent da ist, dann ist das ja prinzipiell eine gute Sache, da es mir inkonsistenzen und datenleichen verhindert. Warum sollte man also die Daten in der falschen Reihenfolge eingeben koennen??? Geht bei der Eingabe was schief, finde ich die Leiche nicht mehr mit einer Anwendung, weil die ja wahrscheinlich auf der Hierarchie basiert.
          Fuer eine Erstimport, bei dem ich weiss, dass die einzufuegenden Daten nicht soritert aber komplett sind, schaltet man halt die Constraints und Trigger ab. Dann sind die Daten drin, und beim Einschalten ueberprüft die DB, ob die DAten konsistent sind.
          Oder gehts hier um was anderes????

          Gruss

          Stefa

          Comment


          • #6
            ich hab's so verstanden, daß er die Daten schon hat, und z.B. in einer TreeView darstellen will und die richtige Sortierung nicht hinbekommt...

            Joche

            Comment


            • #7
              Aha - verstehe
              Muesste dann der richtig sortierte Baum nicht so aussehen??

              <pre>
              2 NULL Papier
              6 2 Filter
              4 6 Lineale
              1 4 Büro
              5 1 Zigaretten
              3 5 Stifte
              7 NULL Tabak
              8 7 Süsses
              9 NULL Kaugummi
              10 NULL Eis
              11 NULL Snacks
              12 NULL Langnese
              13 NULL Schöller
              </pre>

              Wieviele Ebenen brauchen wir denn? Recursiv kann da sehr langsam gehen. Wenn das nur wenige Ebenen sind (z.B. 3) dann wuerde ich das in drei Tabellen ausplitten. Nicht schoen und ein wenig unflexibel aber schnell. Zumindest wurde ich in der obigen Struktur eine Information ueber die Ebene einfliessen lassen, in der ich mich befinde.

              Aber ist das wirklich so gemeint???

              Gruss

              Stefa

              Comment


              • #8
                Hi Sven,

                so rein in SQL ist mir nix eingefallen, was ich hier mit Paradox hätte ausprobieren können...

                Aber folgende Funktion liefert die gewünschte Sortierung in ein TRichEdit:
                <PRE>
                RichEdit1->Lines->Clear();
                AnsiString tab = "\t";
                TStringList* slTemp = new TStringList();
                int parentgruppe = 0;
                do
                {
                q->ParamByName("ppg")->AsInteger = parentgruppe;
                q->Prepare();
                q->Open();
                if (q->FindFirst())
                {
                do
                {
                slTemp->Add(qGruppe->AsString);
                RichEdit1->Lines->Add(qGruppe->AsString + tab + qParent_Gruppe->AsString + tab + qBezeichnung->AsString);
                } while (q->FindNext());
                }
                if (q->Active)
                q->Close();
                if (q->Prepared)
                q->UnPrepare();
                if (!slTemp->Text.IsEmpty())
                {
                parentgruppe = slTemp->Strings[0].ToInt();
                slTemp->Delete(0);
                }
                else
                break;
                } while (true);

                delete slTemp;
                </PRE>

                Grüße Joche

                Comment


                • #9
                  Ach ja, der SQL für die Query:
                  <PRE>
                  SELECT
                  *
                  FROM test
                  WHERE (parent_gruppe = pg)
                  ORDER BY gruppe ASC
                  </PRE&gt

                  Comment


                  • #10
                    Hallo,

                    ich habs nicht getestet, aber als ORACLE-Pseudocode muesste es doch so aussehen, oder?

                    <PRE>
                    GET_EBENE (ID1)
                    BEGIN

                    OPEN CURSOR FOR
                    SELECT GRUPPE, PARENT
                    FROM tabelle
                    WHERE PARENT = ID1
                    ORDER BY GRUPPE ASC

                    WHILE DATA FOUND
                    FETCH INTO REC
                    get_ebene(REC.GRUPPE);
                    EOW

                    IF NO_DATA => RETURN;

                    END CURSOR

                    END

                    </PRE>

                    Aufruf waere dann get_ebene (NULL).

                    Da muss man natuerlich aufpassen mit den Cursorn: Man kann nicht belíebeig viele davon aufmachen. Also muss man noch eine Grenze einbauen bzw. die DB-Konfiguration entsprechend ausrichten.

                    ciao

                    Stefa

                    Comment


                    • #11
                      Hallo,
                      mit der Option des levels, würde ich, glaube ich, mein Problem lösen können. Durch einen geschickten Order by sollte das dann funktionieren.

                      <BR><BR>
                      Danke im Vorraus, ich werde es mal probiere

                      Comment

                      Working...
                      X