none
Sortieren im Bericht nach Spalte x im Kombinationsfeld Access 2003

    Frage

  • Hallo

    kann man eigentlich in einem Bericht nach einer Spalte in einem Kombinationsfeld Sortieren lassen?

    Ich meine Direkt im bericht nicht in der Abfrage des Berichtes

     

    Donnerstag, 17. November 2011 14:56

Antworten

  • Das entspricht im Grunde meiner Lösung, lediglich in eine Funktion ausgelagert. Warum ist eine 1:n Verknüpfung nicht zulässig? Das ist sie normalerweise schon.

    Zur Beschleunigung deiner Funktion solltest du hier  ausnahmeweise mal mit einer globalen Variablen arbeiten, z.B. so (ungetested)

    Private m_LGID  As DAO.Recordset
    
    Public Function GetOrderLagerort(LID As Long) As Long
    
      If m_LGID Is Nothing Then
        Set LGID = CurrentDb.OpenRecordset( _
          "SELECT AL.ID, ALB.Sortierung " & _
          "FROM tblArtikelLagerort AL" & _
          "INNER JOIN tblArtikelLagerortBezeichnung ALB ON AL.Lagerort = ALB.Lagerort ;"
      End If
    
      m_LGID.FindFirst "ID = " & LID
      If m_LGID.NoMatch Then
        GetOrderLagerort = 0
      Else
        If IsNull(LGID!Sortierung) = False Then 
          GetOrderLagerort = LGID!Sortierung 
        Else 
          GetOrderLagerort = 0
        End If
      End If
      
    End Function
    

    Jenachdem wie oft sich der Inhalt des JOINS ändern kann, musst du vor dem Ausführen der Abfrage die Variable m_LGID zurücksetzen.
    Montag, 21. November 2011 13:56
    Moderator

Alle Antworten

  • kann man eigentlich in einem Bericht nach einer Spalte in einem Kombinationsfeld Sortieren lassen? Ich meine Direkt im bericht nicht in der Abfrage des Berichtes 

    Hallo,

    Durch Formularbezug in der ORDER BY-Klausel ist das nicht moeglich, es gibt zwar keine Fehlermeldung, aber da der Wert des Kombifeldes als Literal interpretiert wird, wird es einfach ignoriert. Wenn du willst, kannst du den SQL-String per VBA aufbauen und danach die Sortierung der Abfrage setzen (verkuerztes Beispiel):

    strSQL = "SELECT ... FROM ... WHERE ... ORDER BY " & Me!Kombifeld.Value & ";"

    CurrentDb.QueryDefs("DeineAbfrage").SQL = strSQL

    Gruss - Peter

     

    Freitag, 18. November 2011 18:29
    Moderator
  • Wenn du nach dem Wert sortieren willst, musst anstatt eines Kombinationsfeldes im Bericht diese Sortierung in der RecordSource des Berichts machen. D.h. du musst hier die Tabelle, aus dem die Daten für das Kombinationsfeld kommen, mittels einem (LEFT) JOIN anbinden und nach dem Anzeigefeld sortieren.
    Sonntag, 20. November 2011 16:35
    Moderator
  • Danke für eure Antworten

    das mit den daten aus der Tabelle funktioniert leider nicht weil ich keine 1:1 verknüpfung machen kann und eine 1:n in diesem falle nicht zulässig war

    ich habe es  nun über eine funktion gelöst

    Public Function GetOrderLagerort(LID As Long) As Long
    Dim LGID  As DAO.Recordset
    Set LGID = CurrentDb.OpenRecordset("SELECT tblArtikelLagerort.ID, tblArtikelLagerortBezeichnung.Sortierung, tblArtikelLagerort.LagerortBezeichnung FROM tblArtikelLagerort INNER JOIN tblArtikelLagerortBezeichnung ON tblArtikelLagerort.Lagerort = tblArtikelLagerortBezeichnung.Lagerort WHERE tblArtikelLagerort.ID=" & LID)
    
    If LGID.RecordCount = 0 Then
           GetOrderLagerort = 0
    Else
           If IsNull(LGID!Sortierung) = False Then GetOrderLagerort = LGID!Sortierung Else GetOrderLagerort = 0
    End If
    LGID.Close
    Set LGID = Nothing
      
    End Function
    

    die Funktion rufe ich nun in meiner Abfrage über

    SortiEins: GetOrderLagerort(Wenn(IstNull([tblAufpos.LagerortEins])=Wahr;0;[tblAufpos.LagerortEins]))

    als spalt in der Abfrage auf

    kann sein das ich das nun fürchterlich kompleziert gelöst habe - aber es geht so

    Montag, 21. November 2011 13:02
  • Das entspricht im Grunde meiner Lösung, lediglich in eine Funktion ausgelagert. Warum ist eine 1:n Verknüpfung nicht zulässig? Das ist sie normalerweise schon.

    Zur Beschleunigung deiner Funktion solltest du hier  ausnahmeweise mal mit einer globalen Variablen arbeiten, z.B. so (ungetested)

    Private m_LGID  As DAO.Recordset
    
    Public Function GetOrderLagerort(LID As Long) As Long
    
      If m_LGID Is Nothing Then
        Set LGID = CurrentDb.OpenRecordset( _
          "SELECT AL.ID, ALB.Sortierung " & _
          "FROM tblArtikelLagerort AL" & _
          "INNER JOIN tblArtikelLagerortBezeichnung ALB ON AL.Lagerort = ALB.Lagerort ;"
      End If
    
      m_LGID.FindFirst "ID = " & LID
      If m_LGID.NoMatch Then
        GetOrderLagerort = 0
      Else
        If IsNull(LGID!Sortierung) = False Then 
          GetOrderLagerort = LGID!Sortierung 
        Else 
          GetOrderLagerort = 0
        End If
      End If
      
    End Function
    

    Jenachdem wie oft sich der Inhalt des JOINS ändern kann, musst du vor dem Ausführen der Abfrage die Variable m_LGID zurücksetzen.
    Montag, 21. November 2011 13:56
    Moderator
  • Danke - die 1:n ist in meiner vorhanden abfrage nicht zulässig da ...

    Die SQL-Anweisung konnte nicht ausgeführt werden, da sie mehrdeutige Inklusionsverknüpfungen enthält........

    daher

    Aber rückfrage - du arbeitest dort mit findfirst ist dieses an dieser stelle schneller?

    Montag, 21. November 2011 15:56
  • Die Sache mit den Inklusionsverknüpfungen ist normalerweise einfache gelöst: Du musst lediglich vom "Anflanschpunkt" ausgehende alle zu deiner Sortierung gehörendenden Tabellen mit einem LEFT JOIN (1:n) in der korrekten Richtung anbinden.

    Ja, da das RecordSet nur einmal geöffnet wird.

    Montag, 21. November 2011 16:15
    Moderator