Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Wie kann man eine Baumstruktur mit Access 2010 realisieren

Begonnen von Accessiv, November 11, 2012, 20:08:13

⏪ vorheriges - nächstes ⏩

Accessiv

Hallo,

kann mir einer von Euch erklären, wie man mit Access 2010 die u. a. Baumstruktur mit einer oder mehreren Tabellen realisiert?

Ordner1
     - Unterordner1.1
              - Unterordner1.1.1
              - Unterordner1.1.2
              - Unterordner1.1.3
      - Unterordner1.2
              - Unterordner1.2.1
              - Unterordner1.2.2
Ordner2
      - Unterordner2.1
               - Unterordner2.1.1

usw.

Gruß Helmut

database

Hallo,

'früher' hat man das mit einem TreeView-Control erledigt.  ;D
K.A. ob es das für Acc2010 noch gibt.  :-\

Sieh mal da rein:  http://dbwiki.net/wiki/Access_Beispieldatenbanken unter TreeView ...

HTH

Accessiv

Hallo Peter,
vielen Dank für den Hinweis. Sieht so aus als würde man mit dem von Dir vorgeschlagenen TreeView-Control eine Baumstruktur hinbekommt. Mein Problem ist nur, dass ich den Code in dem Modul "TreeView" nicht verstehe. Da meine VBA-Kenntnisse nur sehr rudimentär sind, hoffe ich auf einen Lösungsvorschlag ohne VBA. Mittlerweile habe ich schon herausgefunden, dass es irgendwie mit Tabellen funktionieren soll, die einen Verweis auf sich selbst enthalten. Das "irgenswie" habe ich aber noch nicht entschlüsselt.
Gruß Helmut

Beaker s.a.

Hallo Helmut,
Anbei DB mit Tabelle und Abfrage zur Verdeut-
lichung des prinzipiellen Vorgehens.
Das TreeView-Beispiel von Peter habe ich mir
auch angeschaut, komme damit aber in soweit
nicht klar, das ich nicht verstehe, wie die
Importdatei aufgebaut sein muss, die man da
zum Testen braucht (sind ja keine Beispieldaten
drin).
Ich selber habe das Control vor vielen Jahren
mal verwendet, dann nicht mehr, und so ist der
Code verloren gegangen. War erst nicht so ein-
fach, hatte es dann aber hinbekommen. Jetzt
müsste ich mich damit auch erst wieder intensiv
beschäftigen. Leider fehlt mir da etwas die Zeit.
Ohne VBA wird es aber wohl nicht gehen.
Vielleicht kann einer von den Regulars hier den
einen oder anderen Codeschnipsel aus der Kiste
zaubern, oder sogar ein einfacheres Beispiel,
dann bekommen wir das gemeinsam schon zu-
sammen.
Vielleicht googlest Du auch selber nochmal nach
VBA+TreeView.
gruss ekkehard

[Anhang gelöscht durch Administrator]
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Wurliwurm

Hallo Helmit,

eine Baumstruktur kann man in Formularen tatsächlich nur über das Treeview-Control anzeigen. Dieses Control erfordert allerdings einiges an Einarbeitungszeit. Ohne gute Programmierkenntnisse (und auch einem Grundverständnis von Rekursion) kann man nicht diesem Control nicht effizient arbeiten.

Man kann Hierarchien natürlich in Tabellen speichern, das wird millionenfach gemacht. Aber die Herarchie da rauszulesen und damit zu rechnen, erfordert wieder Programmierung (Google-Stichwort "Baumtraversierung").

Ich will Dir ein Beispiel hier kurz kopieren, wie man beliebige Hierarchien mit 2 Tabellen modellieren kann. Bei echtem Interesse kann ich das genauer darstellen und auch beim Treeview helfen.

Tabelle mit den Knoten des Baumes
CREATE TABLE tblSETHEADER
(SETName VARCHAR2(10) NOT NULL,
SETBez VARCHAR2(25) NOT NULL,
CONSTRAINT tblSETHEADER_Primary_Key Primary Key(SETNAME));

Tabelle, wo die Beziehung modelliert wird
CREATE TABLE tblSETLEAF
(SETNAME VARCHAR2(10) NOT NULL,
SUBITEM VARCHAR2(10) NOT NULL,
RhFlg NUMBER(5) NOT NULL,
CONSTRAINT tblSETLEAF_Primary_Key Primary Key(SETNAME, SUBITEM),
CONSTRAINT tblSETLEAF_SETH_fk FOREIGN KEY(SETNAME) REFERENCES tblSETHEADER(SETNAME),
CONSTRAINT tblSETLEAF_ITEM_UNIQUE UNIQUE(SUBITEM));

Beispieleinträge:

tblSETHEADER
0, "Wurzel"
O1, "Ordner1"
UO1, "Unterordner1.1"
UO11, "Unterordner1.1.1"
UO12, "Unterordner1.1.2"
UO13, "Unterordner1.1.3"

tblSETLEAF
0, O1, 1
0, O2, 2
O1, UO1, 1
UO1, UO11, 1
UO1, UO12, 2
UO1, UO13, 3




Beaker s.a.

Hallo Wurliwurm,
Danke, das Du helfen willst.
Ich glaube allerdings, dass der TS damit deutlich
überfordert ist; muss ja selber jetzt erstmal ein
paar Fragen stellen, um es zu verstehen.
Zitatwie man beliebige Hierarchien mit 2 Tabellen modellieren kann
Dein Beispiel zeigt aber nur drei Stufen - richtig?
Für weitere Stufen müsste man die tblSETLeaf
um weitere SUBITEMs erweitern?
Und wie funzt das zur Laufzeit, wenn man eine
weitere Stufe hinzufügen will?
Dank im Voraus für weitere Erläuterungen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Wurliwurm

Hallo Ekkehard,

schon möglich, daß der TS da überfordert ist. Schade, weil dann würde das wenig ergiebig.

Mein Beispiel kann beliebig tiefe Bäume modellieren. Die Tabellenstruktur habe ich in einem eigenen Projekt im Einsatz, dabei sind noch ein paar Felder mehr in den Tabellen. Mit diesen zusätzlichen Feldern (Hierarchietyp, Hierarchienummer) kan man mit Hilfe der 2 Tabellen beliebig viele Hierarchien parallel modellieren (mehrere Kostenstellenhierarchien, Materialhierarchien, Kundenhierarchien etc.., alles in den gleichen 2 Tabellen). Tatsächlich habe ich die Tabellen SETHEADER und SETLEAF aus dem SAP abgekupfert und dort werden in diesen beiden Tabellen praktisch alle Hierarchien gespeichert (dort haben sie aber viel viel mehr Spalten und es ist alles natürlich viel viel komplexer)

Aber Dein Beispiel ist natürlich auch absolut ausreichend. Mein Beispiel unterscheidet sich halt durch die Trennung der Hierarchie an sich von den Stammdaten.

Accessiv

Hallo Ekkehard, hallo Wurliwurm,

erst mal herzlichen Dank für Eure Hilfe bis hierher. So langsam lichtet sich bei mir auch etwas der Nebel, obwohl noch nicht alles ganz klar ist. Vielleicht habt ihr aber Lust mir weiterhin bei der Lösung meines eigentlichen Problems zu helfen. Das habe ich in dem Post "Brauche Hilfe beim Design einer Seminar-DB" beschrieben. Mittlerweile ist mir klar, dass ich zur Lösung des dort beschriebenen Problems eben eine Baumstruktur brauche und versuche mich nun Schrittchen für Schrittchen einer brauchbaren Lösung zu nähern. Während ihr Euch über mein Problem den Kopf zerbrochen habt, war ich aber auch nicht untätig und habe versucht das Seminarplanungs-Problem in einem anderen Datenbankmodell zu beschreiben (siehe Anlage). In dem Modell werden die Richtlernziele als RLZ (werden auf Seminarebene definiert), die Groblernziele als GLZ (werden auf Ebene der Unterrichtseinheiten definiert) und die Feinlernziele als FLZ (werden auf Ebene der Unterrichtsphasen definiert) abgekürzt. Diese Lernziele stellen im Prinzip die Baumstruktur da, ein RLZ hat mehrere GLZ und jedes GLZ wiederum mehrere FLZ.
Würde mich sehr freuen, wenn ihr mir weiterhin zur Seite stehen wüdet. Als erstes müssten wir wohl klären, in welchen Bereichen mein neues Datenbankmodell nachgebessert werden müsste. Vielleicht habt ihr dazu einen Vorschlag. Wenn das Datenbankmodell mit Eurer Hilfe dann einmal steht, könnten wir uns der Realisierung in einer Baumstruktur nähern.

Wie gesagt, erst einmal vielen Dank bis hierher! :D

[Anhang gelöscht durch Administrator]

Beaker s.a.

Hallo Helmut,
Sorry, aber da muss ich erst mal die Segel streichen  :(
Ich brauche einfach zu lange um mich da rein zu
fuchsen, dazu bin ich nicht versiert/geübt genug.
Ich hoffe jedoch, dass vielleicht einer der Profis,
denen das leichter fällt, in die Bresche springt.
Werde den Thread aber auf jeden Fall weiter mitlesen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Wurliwurm

Hallo Helmut,

erstmal will ich Anerkennung für das PDF aussprechen. Ist ein Modell einmal gut aufgezeichnet, ergeben sich die Tabellen und Schlüssel oft von selbst.

Die Lösung, die ich weiter oben vorgeschlagen habe, ist sehr flexibel, wenn man es nur leicht erweitert, könnte man zum Beispiel das gleiche Lernziel in mehreren verschiedenen "Lernzielbäumen" haben und könnte auch Teilbäume einfach "umhängen" und ähnliches. Der Nachteil ist, daß diese Baumtabelle sinnvoll nur mit (rekursiven) Programmierschleifen auslesbar wäre und auch Gültigkeitsprüfungen wie referenzielle Integrität kaum mehr anwendbar wären. Wahrscheinlich ist das nicht praktikabel und ohne viel VBA kann man das vergessen.

Eine alternative Modellierung wäre es, die Lernziele in 3 unterschiedlichen Tabellen zu führen und bei der Tabelle Feinlernziele einen Fremdschlüssel mit NOT NULL auf die Tabelle GLZ zu machen; gleiches für die Beziehung GLZ->RLZ. Von den Tabelle Kurse, Unterrichtseinheite und Unterrichtsphasen würde man dan Fremdschlüssel auf die jeweilige Lernzieltabelle machen.

Vorteil: Damit wäre in der Datenbank diese dreistufige Hierarchie fest verankert und es wäre sichergestellt, daß kein FLZ oder GLZ "hängt", sprich unzugeordnet ist.
Nachteil: Ein Lernziel kann immer nur genau ein "Mutter"-Lernziel haben.

Mit dieser Lösung könnte man zum Beispiel eine Baumansicht (Treeview) für ein RLZ machen:

Selektiere den Eintrag aus Tabelle RLZ wo Lernziel-ID = 4711
Erzeuge einen Knoten im Baum mit Key=4711
    Schleife über alle GLZ, welche RLZ=4711 zugeordnet haben
        Erzeuge Knoten mit Key=RLZ.ID hat und Parent-Key = 4711
            Schleife über alle FLZ, welche GLZ=GLZ.ID zugeordnet haben
                Erzeuge Knoten mit Key=FLZ.ID hat und Parent-Key =GLZ.ID

Die praktische Programmierung ist eigentlich gar nicht so schwer. Nachdem ein Treeview jetzt ungefähr 15-mal gemacht habe, und dabei selbst Hilfe aus dem Netz benutzt habe, würde ich Dir da gerne helfen.

Was mir an dem Datenmodell auffällt: In der Entität "Lernziele" kommt zum Beispiel das Attribut Kurs vor. Jetzt ist hat aber ein Kurs ein RLZ.
Wenn jetzt Kurs 4711 das RLZ 0815 hat, steht dann auch der Kurs 4711 im Lernziel drin oder ein anderer? Am besten, man modelliert ein Datenbank so, daß Widersprüche nicht auftreten können.

Oder folgendes Problem habe ich:
Wenn man einen Kurs belegt, enthält dieser Unterrichtseinheiten, welche wiederum aus Unterrichtsphasen bestehen.
Jede Unterrichtsphase hat ein FLZ. Das heißt, wenn man einen Kurs nimmt, hat man eine Menge von FLZ. Wie willst Du sicherstelen, daß alle diese FLZ dem gleichen GLZ des Kurses zugeordnet sind?

Beispiel
Kurs 4711 hat GLZ "Tanzen"
 GLZ Tango
    Grundschritte Tango hat FLZ 0815
   ...
 Walzer
   ...
 Salsa
  ...

Wie willst Du sicherstellen, daß die Hierarchie der Lernziele identisch mit der Unterrichtshierarchie ist?

Fragen über Fragen. Was Du modellieren willst, ist nicht trivial und erfordert eine Menge Fachwissen und Übung. Insgesamt ist dieser Teil der schwerste Teil bei einem DB-Entwirf, weil man hier viele Fehler machen kann, welche einem später immer verfolgen.









Beaker s.a.

#10
Hallo,
ZitatDatum/Zeit: Heute um 22:29:59
Ich hoffe jedoch, dass vielleicht einer der Profis,
denen das leichter fällt, in die Bresche springt.
ZitatAutor: Wurliwurm, Datum/Zeit: Heute um 22:30:21
Das nenne ich immer "Duplizität der Ereignisse"  ;D
Danke.
Ich hoffe, dass ich mit lernen darf  ;)
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Accessiv

Hallo Wurliwurm,

Zitat von: Wurliwurm am November 13, 2012, 22:30:21
Eine alternative Modellierung wäre es, die Lernziele in 3 unterschiedlichen Tabellen zu führen und bei der Tabelle Feinlernziele einen Fremdschlüssel mit NOT NULL auf die Tabelle GLZ zu machen; gleiches für die Beziehung GLZ->RLZ. Von den Tabelle Kurse, Unterrichtseinheite und Unterrichtsphasen würde man dan Fremdschlüssel auf die jeweilige Lernzieltabelle machen.

Vorteil: Damit wäre in der Datenbank diese dreistufige Hierarchie fest verankert und es wäre sichergestellt, daß kein FLZ oder GLZ "hängt", sprich unzugeordnet ist.
Nachteil: Ein Lernziel kann immer nur genau ein "Mutter"-Lernziel haben.

den Ansatz halte ich für eine gute Idee. In der Tat habe ich bei meinem Modell das Problem, die Lernziele eindeutig der Unterrichtshirarchie zuzuordnen. Oder anders gesagt hier komme ich einfach nicht weiter! ??? Nur eine Tabelle "Lernziele" zu verwenden trägt der Tatsache Rechnung, dass Lernziele immer gleich strukturiert sind, egal ob es RLZ, GLZ oder FLZ sind. Sie werden eben nur jeweils für eine andere Unterrichtshirarchieebene definiert:
RLZ für den Kurs, GLZ für die Unterrichtseinheit und FLZ für die Unterrichtsphase. Um bei Deinem u. a. Beispiel zu bleiben sähe das so aus:

Der Kurs1 "Lateinamerikanische Tänze lernen" hat das RLZ: "Der Kursteilnehmer (TN) beherrscht die Grundschritte des Tango und des Salsa" und umfasst insges. zwei Unterrichtseinehiten (UE).
     Das GLZ1 für UE1 im Kurs1 lautet: "Der TN kann die Grundschritte des Tango".
            Das FLZ1 für Unterrichtsphase 1 der 1. UE im Kurs1 lautet: "Der TN kann erkennen, zu welcher Musik ein Tango getanzt wird".
            Das FLZ2 für Unterrichtsphase 2 der 1. UE im Kurs1 lautet: "Der TN kann die Tangoschritte des Tanzlehrers nachahmen".
            Das FLZ3 für Unterrichtsphase 3 der 1. UE im Kurs1 lautet: "Der TN kann selbstständig die ersten Tangoschritte nach Musik tanzen".
     Das GLZ2 für UE2 im Kurs2 lautet: "Der TN kann die Grundschritte des Salsa".
            Das FLZ1 für Unterrichtsphase 1 der 2. UE im Kurs1 lautet: "Der TN kann erkennen, zu welcher Musik eine Salsa getanzt wird".
            Das FLZ2 für Unterrichtsphase 2 der 2. UE im Kurs1 lautet: "Der TN kann die Salsaschritte des Tanzlehrers nachahmen".
            Das FLZ3 für Unterrichtsphase 3 der 2. UE im Kurs1 lautet: "Der TN kann selbstständig die ersten Salsaschritte nach Musik tanzen".
Der Kurs2 "Standardtänze lernen" hat das RLZ: "Der TN beherrscht die Grundschritte des Walzers und Foxtrots".
     Kurs2 ist im Folgenden genau so strukturiert wie Kurs1.

Das ist mit Deinem Vorschlag eventuell einfacher zu realisieren als mit meinem Modell. Wie könnte man Deinen Treeview

Zitat von: Wurliwurm am November 13, 2012, 22:30:21
Selektiere den Eintrag aus Tabelle RLZ wo Lernziel-ID = 4711
Erzeuge einen Knoten im Baum mit Key=4711
     Schleife über alle GLZ, welche RLZ=4711 zugeordnet haben
         Erzeuge Knoten mit Key=RLZ.ID hat und Parent-Key = 4711
             Schleife über alle FLZ, welche GLZ=GLZ.ID zugeordnet haben
                 Erzeuge Knoten mit Key=FLZ.ID hat und Parent-Key =GLZ.ID

denn modellieren? Hast Du einen Vorschlag?

Zitat von: Wurliwurm am November 13, 2012, 22:30:21
Was mir an dem Datenmodell auffällt: In der Entität "Lernziele" kommt zum Beispiel das Attribut Kurs vor. Jetzt ist hat aber ein Kurs ein RLZ.
Wenn jetzt Kurs 4711 das RLZ 0815 hat, steht dann auch der Kurs 4711 im Lernziel drin oder ein anderer?

Die Attribute Typ, Bereich, Kurs, Unterrichtseinheit und Unterrichtsphase hatte ich vorgesehen, um jeweils eine Referenz auf die entsprechende Tabelle speichern zu können. Deshalb habe ich diese Attribute als Fremdschlüssel (FK) gekennzeichnet. Aber wie gesagt, der ganze Ansatz ist vielleicht falsch.

Gruß Helmut

@Ekkehard
Natürlich würde ich mich freuen, wenn Du passiv oder aktiv mit dabei bleiben würdest.

Accessiv

Hallo Wurliwurm,

ich habe mal versucht ein neues DB-Modell mit einzelnen Tabellen für RLZ, GLZ und FLZ zu erstellen (siehe Anlage). Es ist allerdings keine rekursive Tabellenstruktur mehr enthalten. Was hältst Du davon? Glaubst Du damit kann man weiterarbeiten?

Gruß Helmut

[Anhang gelöscht durch Administrator]

Wurliwurm

Hallo Helmut,

ich bin diese Woche mit Erkältung zuhause und habe bei der Gelegenheit mal ein Demoprogramm zum Treeview aufbereitet. Und zwar mit der speziellen Hierarchietabelle. Nur so als Anschauungmaterial, wie beliebige Hierarchien modelliert werden können.

Probier mal, ob Du es zum Laufen bringst (dazu muß das Treeview aus dem SYSTEM32-Ordner im Windows eingebunden sein) und spiel mal damit rum. Ich führ mir mal dein Beispiel zu Gemüte.

Grüße
Johannes

[Anhang gelöscht durch Administrator]

Accessiv

Hallo Wurliwurm,

erst einmal gute Besserung für Deine Erkältung!

Habe mir Dein Demoprogramm mal angeschaut (den James Bond Kurs finde ich übrigens klasse) brauche aber noch ein bisschen Zeit um zu verstehen, wie die Tabellen aufgebaut sind und vor allem was der Modul-Code alles so macht.

Außerdem habe ich versucht das Treeview einzubinden, habe im Win-System32-Ordner aber nur eine tree.com gefunden. Meinst Du die? Ich weiß auch nicht wo und wie ich diese Treeview irgendwo einbinden kann. Kannst Du mir dazu ein paar Hilfestellungen geben?

Gruß Helmut

PS: In dem Modell, das ich gestern gepostet habe ich übrigens noch die 1:n-Verbindungen von tblRLZ - tblGLZ und von tblGLZ - tblFLZ vergessen. Damit Dein Vorschlag vom 13.11.2012 richtig umgesetzt wird müssen die natürlich noch rein.