Veteran
Beiträge: 102
| Hallo an alle Mitleser,
weil das immer blöd ist, wenn man so eine Frage gefunden hat und keine Lösung dabei steht, hier mein (voraussichtlich letzter) Entwicklungsstand: Es ist lösbar, indem ich beim Formatieren anhand der (an den Bericht übergebenen) 4 Gruppierungsfelder via VBA schnell den aktuellen Berichtsfilter hinzufüge und ein DSum() ausführe. Diesen Werte schreibe ich dann in die jeweilige Textbox. Der Code dazu steht weiter unten.
In der lokalen Testdatenbank war das alles super und einigermaßen robust. Auf dem Echtsystem allerdings waren die Datenquellen einiges komplexer und der Server fühlbar langsamer, so dass der Bericht damit mehrere Minuten Erstellungszeit gebraucht hat und ich das gemeinsam mit dem Kunden für unbenutzbar erklärt habe.
Wer so etwas trotzdem mal braucht, kann unten im Code forschen.
tschö, Lorenz
#################################################
im Berichtsmodul (grpE... heißen die Gruppenkopf-Elemente der jeweiligen Ebene):
Dim m_strFilter As String
Dim m_strFeld01 As String
Dim m_strFeld02 As String
Dim m_strFeld03 As String
Dim m_strFeld04 As String
Private Sub Report_Open(Cancel As Integer)
m_strFilter = "WHERE " & IIf(Me.FilterOn, Me.Filter & " AND ", "")
m_strFeld01 = "fakturgtypIDRef"
m_strFeld02 = "faktufirmaIDRef"
m_strFeld03 = "faktuartikIDRef"
m_strFeld04 = "faktuID"
End Sub
Private Sub grpE1_Format(Cancel As Integer, FormatCount As Integer)
ZaehleFirmen Me.edtE01, ErzeugeSQL(Me, m_strFilter, m_strFeld01, m_strFeld02)
End Sub
Private Sub grpE2_Format(Cancel As Integer, FormatCount As Integer)
ZaehleFirmen Me.edtE02, ErzeugeSQL(Me, m_strFilter, m_strFeld01, m_strFeld02, m_strFeld03)
End Sub
Private Sub grpE3_Format(Cancel As Integer, FormatCount As Integer)
ZaehleFirmen Me.edtE03, ErzeugeSQL(Me, m_strFilter, m_strFeld01, m_strFeld02, m_strFeld03, m_strFeld04)
End Sub
#################################################
in einem allgemeinen Modul dann die Funktionen:
Sub ZaehleFirmen(edtEbene As TextBox, strSQL As String)
Dim rcsX As DAO.Recordset
If Left(UCase(strSQL), 6) = "SELECT" Then
Set rcsX = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
'Debug.Print strSQL
rcsX.MoveLast
edtEbene.Value = rcsX.RecordCount
rcsX.Close
Else
edtEbene.Value = strSQL 'dann war es kein SQL, sondern direkt ein Wert!
End If
End Sub
Function ErzeugeSQL(rptDieser As Report, strFilter As String, ParamArray varFelder() As Variant) As String
Dim strSQL As String
Dim intI As Integer
Dim booUnterFirma As Boolean
If varFelder(UBound(varFelder) - 1) = "faktufirmaIDRef" Then
'dann ist es die Bank-Ebene, also 1 zurückgeben
strSQL = "1"
Else
For intI = 0 To UBound(varFelder) - 2
If varFelder(intI) = "faktufirmaIDRef" Then
booUnterFirma = True 'dann ist es eine Ebene unterhalb einer Firmen-Ebene, dort dürfen keine Ergebnisse mehr ermittelt werden
Exit For
End If
Next
If booUnterFirma Then
strSQL = "" 'dann kann es kein Ergebnis geben
Else
strSQL = "SELECT "
For intI = 0 To UBound(varFelder)
strSQL = strSQL & "[" & varFelder(intI) & "], "
Next
If Right(strSQL, 2) = ", " Then
strSQL = Left(strSQL, Len(strSQL) - 2)
End If
strSQL = strSQL & " FROM [" & rptDieser.RecordSource & "] " & strFilter
For intI = 0 To UBound(varFelder) - 1
strSQL = strSQL & " [" & varFelder(intI) & "]=" & rptDieser.Controls(varFelder(intI)).Value & " AND "
Next
If Right(strSQL, 4) = "AND " Then
strSQL = Left(strSQL, Len(strSQL) - 4)
End If
strSQL = strSQL & " GROUP BY "
For intI = 0 To UBound(varFelder)
strSQL = strSQL & "[" & varFelder(intI) & "], "
Next
If Right(strSQL, 2) = ", " Then
strSQL = Left(strSQL, Len(strSQL) - 2)
End If
strSQL = strSQL & ";"
End If
End If
ErzeugeSQL = strSQL
End Function
|