none
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.

     

     tblWarengruppen
    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

    Dienstag, 11. Januar 2011 11:47

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
    Dienstag, 11. Januar 2011 14:59
    Moderator
  • 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
    Freitag, 21. Januar 2011 09:49
    Moderator
  • tach Michael,

    Der Fehler liegt im falschen Parameter für GetOrder(), auch hier muss die Warengruppe angegeben werden:

    AusdrucksfolgeHRC: GetOrder([tblWarengruppe].[Warengruppe])

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Dienstag, 25. Januar 2011 15:38
    Moderator

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
    Dienstag, 11. Januar 2011 12:08
    Moderator
  • 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

    Dienstag, 11. Januar 2011 14:32
  • Ich bekomme leider bei der ausführung einen fehler

    Argumenttyp ByRef unverträglich

        GetPath = GetPath(m_Hierarchy) & "\\" & m_Hierarchy![WarengruppeBezeichnung]

    kann das leider nicht zuordnen

     

    Dienstag, 11. Januar 2011 14:53
  • 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
    Dienstag, 11. Januar 2011 14:59
    Moderator
  • Danke Stefan - echt klasse

    Jetzt fehlt mir noch eine Sache - wie kann ich mit diesen daten ein TreeView füllen - damit würde ich gerne die Warengruppe dem artikel zuordnen

     

     

    Mittwoch, 12. Januar 2011 06:57
  • 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
    Mittwoch, 12. Januar 2011 09:31
    Moderator
  • 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
    
    Dienstag, 18. Januar 2011 07:01
  • hallo,

    das ganz habe ich nicht getestet, sondern nur so mal aus dem Handgelenk geschüttelt. Eventuell ist da noch ein kleiner Glitch drin. Stell mal eine Beispiel.mdb online...


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Dienstag, 18. Januar 2011 09:58
    Moderator
  • Sorry ich hab hier noch nicht gerade viel gemacht drum wohl eine etwas blödere frage

    kann ich das hier im forum hochladen? - wenn ja wo  

    Dienstag, 18. Januar 2011 14:26
  • 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
    Dienstag, 18. Januar 2011 14:37
    Moderator
  • 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?

    Wie nutze ich den Skydrive?

    Grüße,

    Robert

    Mittwoch, 19. Januar 2011 08:34
    Besitzer
  • Freitag, 21. Januar 2011 07:12
  • 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
    Freitag, 21. Januar 2011 09:49
    Moderator
  • 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

     

    Montag, 24. Januar 2011 15:11
  • 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 3

    Der 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
    Montag, 24. Januar 2011 15:30
    Moderator
  • 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

    Montag, 24. Januar 2011 19:35
  • 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
    Dienstag, 25. Januar 2011 09:52
    Moderator
  • 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

     

    Dienstag, 25. Januar 2011 11:45
  • 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
    Dienstag, 25. Januar 2011 12:04
    Moderator
  • 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

     

    Dienstag, 25. Januar 2011 15:19
  • tach Michael,

    Der Fehler liegt im falschen Parameter für GetOrder(), auch hier muss die Warengruppe angegeben werden:

    AusdrucksfolgeHRC: GetOrder([tblWarengruppe].[Warengruppe])

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Dienstag, 25. Januar 2011 15:38
    Moderator
  • DANKE genau das war es - jetzt funktioniert es durchgängig - genau nach dieser gesamtlösung habe ich ewig gesucht

    VIELEN DANK für die hilfe und die geduld

    Michael

    Dienstag, 25. Januar 2011 16:33