Benutzer mit den meisten Antworten
Gruppierung Sortierung

Frage
-
Hallo ich habe mir eine Warengruppentabelle erstellt in der ich Warengruppen zu Artikel hinterlege - in der gleichen tabelle kann ich aber auch Untergruppen speichern.
Warengruppe WarengruppeBezeichnung Ausdrucksfolge ZuWarengruppe 3 Hardware 1
12 Hardware PC 1 3 13 Hardware Rest 2 3 14 test Hardware PC 0 12 15 test Hardware PC Zwei 0 12 in meiner Artikel tabelle speicher ich nur die warenuntergruppe - zB die Warengruppe 15 -
soweit so gut - nun möchte ich in einem bericht die artikel aber gerne richtig zuärdnen
Sprich
Hardware
Artikel 1
Artikel 2
.....-Hardware PC
- Hardware
- test Hardware PC
Artikel 3
Artikel 4
.....- test Hardware PC Zwei
Artikel 5
Artikel 5
.....die tiefe der verzweigung soll "endlos" sein
ich verstehe nur nicht wie die abfrage für meinen bericht aussehen muss - kann ... oder geht es so überhaupt nicht
- Typ geändert Robert BreitenhoferModerator Mittwoch, 19. Januar 2011 08:35 Frage
- Bearbeitet Robert BreitenhoferModerator Mittwoch, 19. Januar 2011 08:42 Formatierung
Antworten
-
hi,
yup, ist ein Tippfehler, die Zeile muss
GetPath = GetPath(m_Hierarchy![idParent])& "\\"& m_Hierarchy![WarengruppeBezeichnung]
heißen. Und die ganze Funktion (die Rekursion war nicht so toll):
Public Function GetPath(AID As Long) As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "ID = " & AID If Not m_Hierarchy.NoMatch Then If IsNull(m_Hierarchy![idParent]) Then GetPath = m_Hierarchy![Bezeichnung] Else GetPath = GetPath(m_Hierarchy![idParent]) & "\\" & _ m_Hierarchy![Bezeichnung] End If End Function
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 19. Januar 2011 08:43
- Als Antwort markiert Peter DoeringMVP, Moderator Mittwoch, 19. Januar 2011 09:40
-
hi,
mal testen und schwupps ist der Fehler offensichtlich, man sollte nicht auf veränderliche Daten zu greifen, richtig ists so:
Public Function GetPath(AID As Long) As String Dim Bezeichnung As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "Warengruppe = " & AID If Not m_Hierarchy.NoMatch Then If IsNull(m_Hierarchy![ZuWarengruppe]) Then GetPath = m_Hierarchy![WarengruppeBezeichnung] Else Bezeichnung = m_Hierarchy![WarengruppeBezeichnung] GetPath = _ GetPath(m_Hierarchy![ZuWarengruppe]) & "\\" & Bezeichnung End If End If End Function
Die Aufrufreihenfolge ist das Problem: Zuerst wird die Rekursion durchgeführt, dann wird der eigentliche alte Wert benötigt.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort markiert Robert BreitenhoferModerator Freitag, 21. Januar 2011 10:16
-
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 25. Januar 2011 16:38
Alle Antworten
-
hallo,
Zuerst, ich werd' nicht richtig schlau aus deiner Tabellendefinition.
Eine "normale" selbstreferenzierende Tabelle sieht oft so aus:
Warengruppe:
ID, idParent, Bezeichnung
1, NULL, "Hardware"
2, 1, "PC"
3, 1, "Mobiles"
4, 2, "Notebooks"
5, 3, "Tablets"Es geht mit dieser Struktur relativ einfach, ist aber bei großen Datenmengen nicht der schnellste Weg:
Damit du gruppieren kannst, brauchst du den sogenannten Pfad in deiner hierarchischen Struktur. Ungefähr so, in einem Standardmodul:
Option Compare Database Option Explicit Private m_Hierarchy As DAO.Recordset Public Sub ClosePath() m_Hierarchy.Close Set m_Hierarchy = Nothing End Sub Public Sub OpenPath() If m_Hierarchy Is Nothing Then Set m_Hierarchy = CurrentDb.OpenRecordset("Warengruppe") End If End Sub Public Function GetPath(AID As Long) As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "ID = " & AID If Not m_Hierarchy.NoMatch Then GetPath = GetPath(m_Hierarchy) & "\\" & m_Hierarchy![Bezeichnung] End If End Function
Die Funktion benutzt du in der Abfrage für deinen Bericht als neues Feld: Pfad: GetPath(idWarengruppe). Danach kannst du dann gruppieren.
Im Report_Close Ereignis solltest du immer ClosePath() aufrufen.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Hmm genau das meine ich - gibt es für soetwas bessere lösungen als selbstreferenzierende tabellen?
ist blöd dargestellt oben - sollte als tabelle erscheinen war dann aber nicht irgendwie habe ich hier probleme mit der darstellung bei der erfassung
-
hi,
yup, ist ein Tippfehler, die Zeile muss
GetPath = GetPath(m_Hierarchy![idParent])& "\\"& m_Hierarchy![WarengruppeBezeichnung]
heißen. Und die ganze Funktion (die Rekursion war nicht so toll):
Public Function GetPath(AID As Long) As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "ID = " & AID If Not m_Hierarchy.NoMatch Then If IsNull(m_Hierarchy![idParent]) Then GetPath = m_Hierarchy![Bezeichnung] Else GetPath = GetPath(m_Hierarchy![idParent]) & "\\" & _ m_Hierarchy![Bezeichnung] End If End Function
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Robert BreitenhoferModerator Mittwoch, 19. Januar 2011 08:43
- Als Antwort markiert Peter DoeringMVP, Moderator Mittwoch, 19. Januar 2011 09:40
-
hi,
Siehe
http://support.microsoft.com/kb/209891
Die Funktion zum Füllen darf rekursiv sein. Was viel Zeit braucht ist das Lesen von Daten, daher solltest du es analog - aber halt top down - zum Pfadbeispiel machen mit einem modulweiten Recordset, welches du filterst.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
so wie nachvolgend geht es - fast
Public Function GetPath(AID As Long) As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "ID = " & AID If Not m_Hierarchy.NoMatch Then If IsNull(m_Hierarchy![idParent]) Then GetPath = m_Hierarchy![Bezeichnung] Else GetPath = GetPath(m_Hierarchy![idParent]) & "\\" & _ m_Hierarchy![Bezeichnung] End If End Function --------------------------------------------------------------------------------
nur habe ich dann in der bezeichnung jedes mal die bezeichnung der hauptgruppe anstelle der untergruppe - ich verstehe leider nicht wieso
also hardware//hardware//hardware
anstelle von hardware//pc//Notebooks
-
-
hi,
> Sorry ich hab hier noch nicht gerade viel gemacht drum wohl eine etwas blödere frage
Z.B. SkyDrive:http://office.microsoft.com/de-de/office-live/was-ist-windows-live-skydrive-HA101845721.aspx
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Hallo MCDPone,
Um Dateien auszutauschen mit den MSDN Foren kannst Du, sowie Steffan Hoffmann Dir gesagt hat, SkyDrive benutzen. Schau mal hier wie das gemacht wird?
Grüße,
Robert
-
So nun hab ichs - danke - also das mit skydrive
http://cid-51385ee122f4f11a.office.live.com/self.aspx/%c3%96ffentlich/WGR.zip
-
hi,
mal testen und schwupps ist der Fehler offensichtlich, man sollte nicht auf veränderliche Daten zu greifen, richtig ists so:
Public Function GetPath(AID As Long) As String Dim Bezeichnung As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "Warengruppe = " & AID If Not m_Hierarchy.NoMatch Then If IsNull(m_Hierarchy![ZuWarengruppe]) Then GetPath = m_Hierarchy![WarengruppeBezeichnung] Else Bezeichnung = m_Hierarchy![WarengruppeBezeichnung] GetPath = _ GetPath(m_Hierarchy![ZuWarengruppe]) & "\\" & Bezeichnung End If End If End Function
Die Aufrufreihenfolge ist das Problem: Zuerst wird die Rekursion durchgeführt, dann wird der eigentliche alte Wert benötigt.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort markiert Robert BreitenhoferModerator Freitag, 21. Januar 2011 10:16
-
Ich bin's noch mal
Die Hierarchy wird mir ja angezeigt - was mir jetzt nicht klar ist wie ich das sinnvoll in einem Bericht umsetzen kann
Mein bericht soll in etwa so aufgebaut sein
Hardware
Artikel 1
Artikel 2
.....-Hardware PC (Ist untergruppe von Hardware)
Artikel 3
Artikel 4
.....- test Hardware PC Zwei (Ist untergruppe von Hardware und wiederum untergruppe von Hardware PC )
Artikel 5
Artikel 6 .....Software
Artikel 7
Artikel 8
In der tblWarengruppe gibt es dann noch zusätzlich ein Feld Ausdrucksreihenfolge welches dann noch die Sortierung in der jeweiligen Gruppe oder Untergruppe beinhaltet
-
tach,
Die Hierarchy wird mir ja angezeigt - was mir jetzt nicht klar ist wie ich das sinnvoll in einem Bericht umsetzen kann
Mein bericht soll in etwa so aufgebaut sein
Hardware
Artikel 1
Artikel 2
.....
-Hardware PC (Ist untergruppe von Hardware)
Artikel 3Der durch GetPath() zurückgegbene Wert ist dein Gruppierungskriterium. Der Berichtsaufbau ist recht simpel:
Erstelle dir eine Abfrage auf allen deinen Artikel mit dem Pfad (GetPath()). Die darin enthaltenen Trennzeichen kannst du benutzen um einen Einzug zu simulieren. Z.B.
Das Pfadtrennzeichen - in unserem Fall der doppelt Schrägstrich - darf nicht in den Gruppenbezeichnungen als normaler Inhalt auftauchen. Dann kannst du die Hierarchieebene berechnen:
Ebene: (Len(GetPath(ID)) - Len(Replace(GetPath(ID), "//", ""))) / 2
Damit erzeugst du den Einzug:
Indent: Space(Len(GetPath(ID)) - Len(Replace(GetPath(ID), "//", ""))) / 2 + 1)
Dann brauchst du nur noch den Bericht zu gruppieren, in den Gruppenkopf kommt der Pfad und in den Detailbereich als erstes Feld die Artikelbezeichnung als berechnetes Feld:
Artikelbezeichnung: [Indent] + [Bezeichung]
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Hallo Stefan - klingt erst mal gut - nur verstehe ich es nicht
die
Ebene: (Len(GetPath(ID)) - Len(Replace(GetPath(ID), "//", ""))) / 2
Indent: Space(Len(GetPath(ID)) - Len(Replace(GetPath(ID), "//", ""))) / 2 + 1)
sollen mit in die Abfrage?
Ebene: denke ich mal zur Berrechnung der Ebenen Tiefe
Indent: Verstehe ich leider nicht und woher kommt die ID
also wie du siehst bisschen viel Bahnhof bei mir
-
hi,
Ebene: denke ich mal zur Berrechnung der Ebenen Tiefe
Jo.
Indent: Verstehe ich leider nicht und woher kommt die ID
Das ist deine Warengruppen ID des Artikels. Das ganze erzeugt dir einen "Einschub" aus entsprechend vielen Leerzeichen, damit du die gewünschten Einrückungen bekommst.
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Soweit so gut ich hatte das mit der Ebene nicht hinbekommen weil wir oben im beispiel als trenner \\ hatten und unten dann //
Den Indent benötige ich so in der form nicht da ich keinen Einzug möchte sondern alles nach gruppen innerhalb der gruppen auflisten möchte
Nur was jetzt mein problem ist ist die Sortierung ich habe in der tblWarengruppe ein Zahlenfeld Ausdrucksreihenfolge welches die Sortierung innerhalb der Ebene regeln soll.
z.B
Hardware = Ausdrucksreihenfolge = 1
Hardware\\Hardware PC = Ausdrucksreihenfolge = 1
Hardware\\Hardware Rest = Ausdrucksreihenfolge = 2
Software = Ausdrucksreihenfolge = 2
so möchte ich die Artikel dann innerhalb der Warengruppen auch im Bericht/Abfrage Sortieren
dann kommt noch das Sortieren nach Artikelbezeichnung...aber das dürfte dann das geringere problem sein
-
hi,
so möchte ich die Artikel dann innerhalb der Warengruppen auch im Bericht/Abfrage Sortieren
Da deine Reihenfolge auf den einzelnen Ebenen definiert ist, musst du dir analog zur GetPath()-Funktion eine GetOrder()-Funktion schreiben, welche dir anstatt der Warengruppenbezeichnung dir die Reihenfolge zurück gibt:
Public Function GetOrder(AID As Long) As String Dim Reihenfolge As String OpenPath GetPath = vbNullString m_Hierarchy.FindFirst "Warengruppe = " & AID If Not m_Hierarchy.NoMatch Then Reihenfolge = "00000000" & m_Hierarchy![Ausdrucksreihenfolge] Reihenfolge = Right(Reihenfolge, 8) If IsNull(m_Hierarchy![ZuWarengruppe]) Then GetOrder = Reihenfolge Else GetOrder= _ GetOrder(m_Hierarchy![ZuWarengruppe]) & "\\" & Reihenfolge End If End If End Function
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Hallo Stefan - Ich hab es noch einmal hochgeladen
http://cid-51385ee122f4f11a.office.live.com/self.aspx/%c3%96ffentlich/WGR.zip
der sinn ist mir ja allgemein klar - aber das ergebniss ist nicht richtig in meiner abfrage/bericht
wäre dir sehr dankbar wenn du dir das in der mdb noch einmal anschauen könntest
Danke
Michael
-
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 25. Januar 2011 16:38