Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism 1:n Datenbank auslesen -> Menü erstellen (https://www.delphipraxis.net/129455-1-n-datenbank-auslesen-menue-erstellen.html)

Matt 19. Feb 2009 14:22

Datenbank: MDB • Zugriff über: ADO

1:n Datenbank auslesen -> Menü erstellen
 
Hallo DPler,

ich sitze hier vor eine großen Datenbank (mdb) und habe keine Ideen, die mir gestellte Anforderung zu erfüllen :-(
Vielleicht hat ja einer von Euch ein paar Anhaltspunkte, wie ich folgendes Problem angehen kann:

Die Datenbank enthält eine Menüstruktur (1:n) ich kenne die Tiefe nicht, diese ist auch unterschiedlich.
Die Daten sind folgendermaßen aufgebaut:

Feld ID = Counter
Feld NID = INT -> enthält die ID von dem Menüoberpunkt
Feld Name = TEXT -> Name des Menüs

Bisher war es so, dass auf einen Menüpunkt geklickt wurde und eine SQL Abfrage die entsprechenden Menüunterpunkte anhand der ID herausgesucht und angezeigt hat.
Jetzt möchte der Kunde aber ein statisches Menü, das einmalig ausgelesen und erstellt wird :-/

Mein Problem liegt darin, das ich die Tiefe nicht kenne und mir nichts einfällt, um das per SQL hinzubekommen!

Ich hoffe einer von Euch hat eine Idee!!!

Vielen Dank!

Grüße aus HH
Matt

mkinzler 19. Feb 2009 14:26

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Sollte per Rekursion möglich sein, da es sich hier ja um einen klassischen Baum handelt

fkerber 19. Feb 2009 14:27

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Hi!

Welche NID haben denn die Menüpunkte, die keinen Oberpunkt haben?
Wenn du die identifizieren kannst, dann könntest du doch quasi die Abfrage so behalten (also sozusagen den Klick auf den Menüpunkt ohne Ober-ID simulieren)

Oder denke ich ganz falsch?


Ciao, Frederic

Matt 20. Feb 2009 12:52

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Danke Ihr beiden, für Euer Interesse mir zu helfen!

Was Du jetzt genau mit Rekursion meinst, weiß ich leider nicht! Könntest Du da mal ins Detail gehen bitte? (wie man sowas über SQL hinbekommen kann meine ich :-))

Der erste Menüeintrag hat die NID 0 = root. Wie soll ich denn einen Klick per SQL simulieren?
Es geht darum, das beim Laden der Oberfläche der Baum einmalig erstellt werden soll und nicht wie jetzt durch einen Klick auf einen Eintrag, die nächste Unterebene erscheint :-/


Grüße Matt

fkerber 20. Feb 2009 13:56

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Hi!

Hmm, ich habe mich vllt. etwas unglücklich ausgedrückt, ich meinte im Prinzip das selbe wie Markus auch.
Ich versuche es nochmal anders. Also du hast doch jetzt wahrscheinlich eine SQL-Query, die dir zu einer gegebenen ID alle Kinder einsammelt und diese dann ins Menü baut, oder?

Wenn du jetzt hingehst und dir alle mit NID=0 raussuchst, hast du ja die oberste Ebene. Mit Klick simulieren meinte ich, du rufst jetzt die Prozedur auf, die zu gegebener ID die Kinder liefert, eben mit jeder ID der obersten Ebene. Sagen wir, du hast jetzt 10 Kinder bekommen. Dann rufst du wieder die Prozedur auf, diesmal jeweils mit der ID eines der Kinder usw. usf.

Aufhören kannst du, wenn du entweder alle Elemente hast (mitzählen) oder jedes Element keine Kinder mehr hat!


Ich hoffe, es ist jetzt etwas klarer - wenn nicht: fragen ;)


Ciao, Frederic

hoika 20. Feb 2009 15:15

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Hallo,

ich würde das anders machen.

Delphi-Quellcode:
type
  TDBMenuItem = class
    Id   : Integer;
    PreId : Integer; // NID
  end;
Eine einzige Query liest die komplette Tabelle aus
und trägt die Daten (TDBMenuItem) in eine TList (oder was abgeleitetes)

Noch ein paar Methoden, u.a.

FillList(Id) // alle Items der Id laden.


Heiko

Matt 20. Feb 2009 18:52

Re: 1:n Datenbank auslesen -> Menü erstellen
 
jaa... ok...

das ist schon mal ein Gedankenanstoss!! Danke Euch beiden!

Ich versuche mal mein Glück und melde mich wieder.

Sollte jemand einen konkreteren Vorschlag haben bin ich dafür natürlich immer noch offen (*zeitspar*) :-D

Gruß Matt

Matt 21. Feb 2009 03:04

Re: 1:n Datenbank auslesen -> Menü erstellen
 
Ich glaub ich habs, danke fkerber, hast mich auf den richtigen Weg gebracht.

Hier das Ergebnis (Rohformat)

Delphi-Quellcode:

select * from bla where parentid = 0 <- dataset
getit(0,0)

Sub getit(id, parentid)
  Dim parent As DataRow
  Dim ParentTab As DataTable
  ParentTab = tsearch.Tables("select")
     For Each parent In ParentTab.Rows
   //erstelle was...
     getit(parent.Item(0), parent.Item(2))
     Next parent
end sub
Item(0) = ID
Item(2) = ParentID

Ich danke Euch!!!

Gruß Matt

omata 21. Feb 2009 16:02

Re: 1:n Datenbank auslesen -> Menü erstellen
 
@Matt: Kannst du uns noch verraten, wie du das konkret in Delphi aufrufst? Das würde mich sehr interessieren, danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf