News & Tipps zu Microsoft Access

Lesen Sie hier einige der besten Beiträge aus SmartTools Access Weekly sowie ausgewählte Inhalte anderer E-Mail-Newsletter von SmartTools Publishing rund um Microsoft Access.

Beitrag aus SmartTools Access Weekly

Kriterien für Berichte flexibel definieren, Teil 1

Access 365 2021 2019 2016 2013 2010

Für viele Berichte verwenden Sie als Datenbasis eine Abfrage, die Sie je nach Anforderung mit unterschiedlichen Kriterien definieren. Zum Beispiel geht es bei der Abfrage Ihres Lagers einmal um alle Artikel, die sich nicht mehr am Lager befinden ("Lagerbestand = 0") und ein anderes Mal sollen alle Artikel ermittelt werden, deren Bestand in einem bestimmten Bereich liegt ("Lagerbestand > WertVon UND Lagerbestand < WertBis"). In diesen Fällen kommen normalerweise unterschiedliche Abfragen zum Einsatz oder Sie ändern die Abfrage jeweils manuell nach Ihren Anforderungen. In unserem Tipp zeigen wir eine interessante Alternative: Mit einer wenig bekannten Technik können Sie Ihre Berichte so aufbauen, dass ein beliebiges Kriterium für die Abfrage eines bestimmten Feldes direkt beim Öffnen des Berichtes festgelegt werden kann.

Grundlage dieses Tricks ist die Eigenschaft "Cancel" der Ereignisprozedur "Beim Formatieren" des Detailbereiches eines Berichtes: Wird diese Eigenschaft auf "True" gesetzt, überspringt Access den aktuellen Datensatz und er wird nicht im Bericht ausgegeben. In dieser Ereignisprozedur kann also die Abfrage eines Kriteriums erfolgen und davon abhängig der Parameter "Cancel" gesetzt werden. Da es möglich sein soll, das Kriterium flexibel angeben zu können, scheiden Abfragen der Art "If Me.Lagerbestand > 1 And Me.Lagerbestand <= 100 Then..." aus, da man dazu die Kriterien "0" und "100" sowie die Vergleichsoperatoren ">" und "<=" separat erfragen und entsprechend auswerten müsste. Das Ergebnis wäre genauso umständlich zu handhaben, wie eine Parameterabfrage.

Lösen lässt sich das Problem durch den Einsatz der Funktion "Eval()": Dieser Funktion wird ein beliebiger Ausdruck wie zum Beispiel "5 > 10" als Zeichenkette übergeben. Das Ergebnis ist je nach Auswertung des Ausdruckes "True" oder "False". Da der Ausdruck als Zeichenkette übergeben wird, lässt er sich flexibel zusammensetzen. Beim Öffnen des Berichtes wird zunächst das Kriterium per "InputBox$()" erfragt und in einer globalen Variablen "strCriteria" abgelegt. Dort ist dann zum Beispiel "<= 100" oder "> 500" enthalten. Der abzufragende Wert wird in der Ereignisprozedur "Beim Formatieren" des Detailbereichs aus dem aktuellen Inhalt des betreffenden Feldes, also zum Beispiel per "CStr(Me.Lagerbestand)" gewonnen und ist dann beispielsweise "14". Der Aufruf von "Eval(CStr(Me.Lagerbestand) & " " & strCriteria)" entspricht dann dem Ausdruck "14 <= 100" und liefert in diesem Fall die Rückmeldung "True" oder bei "14 > 500" die Rückmeldung "False" als Ergebnis. Kehrt man dieses Ergebnis per "Not" um, kann man somit in der Ereignisprozedur "Beim Formatieren" den jeweiligen Datensatz direkt aufnehmen oder überspringen lassen:

Private Sub Detail_Format(Cancel As Integer, _
                          FormatCount As Integer)

  strEval = CStr(Me.Lagerbestand) & " " & strCriteria
  Cancel = Not Eval(strEval)
  DoEvents

End Sub

Um Wertebereiche oder bestimmte einzelne Werte abzufragen, geben Sie als Kriterium "Between x and y" oder "In (x, y, z)" ein. So selektiert zum Beispiel "Between 1 And 99" alle Datensätze, bei denen der Lagerbestand größer gleich "1" und kleiner "100" ist und ein Kriterium "In (10, 20, 30)" selektiert die Datensätze, bei denen der Lagerbestand exakt "10", "20" oder "30" ist.

Wenn Sie statt eines numerischen Wertes eine Zeichenfolge als Kriterium abfragen möchten, sind einige Besonderheiten zu beachten. Diese erläutern wir nächste Woche im zweiten Teil dieses Tipps, der auch den Einbau dieser Technik in Ihre eigenen Berichte Schritt für Schritt beschreibt.