Access

Liebe/-r Experte/-in,
Ich habe eine Tabelle mit den Feldern Parameter Ergebnis Caps und Freigabe.

Über ein Formular mit Unterformular kann ich den zu suchenden Parameter auswählen und anzeigen. Das Feld Ergebnis kann leer oder gefüllt, das Feld Caps kann 1 oder 0 und die Freigabestufe kann 0 oder 1 sein.

Die Filteroptionen für Cap‘s in Verbindung mit der Parameterauswahl ist schon erstellt.

Ist es möglich die Filteroptionen Freigabestufe zusätzlicht zu erstellen oder
wie kann ich die vorhanden Filter so erweitern, das auf Basis der Parameter und Caps Anzeige nur alle Freigabestufe =1 bestätigt oder nur alle Freigabestufe =0 offenen je nach Auswahl angezeigt werden?

Wie muss ich (Anfänger)den u.a. VB Code ändern?

Private Sub Option56_GotFocus()
'FilterOptionen CAP Toxikologie = 0
End Sub

Private Sub Option58_GotFocus()
'FilterOptionen CAP Allergologie = 1
End Sub
Private Sub FilterOptionen_AfterUpdate()
’ Filter für die gewünschte Option anwenden oder löschen
If FilterOptionen = 1 Then
’ Me.Filter = „CAP = 0“ ‚Toxikologie = 0
Me.Filter = „CAP = 0 AND Parameter = '“ & ParameterFilter.Value & "‘"
Me.FilterOn = True ‚Filter anwenden
ElseIf FilterOptionen = 2 Then Me.Filter = „CAP = 1 AND Parameter = '“ & ParameterFilter.Value & "‘" 'Allergologie = 1
Me.FilterOn = True 'Filter anwenden
Else
Me.FilterOn = False 'Filter entfernen

End If
End Sub
Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)
’ Optionsgruppenwert so setzen, dass er den Filteraktionen
’ des Anwenders entspricht.
If ApplyType = acShowAllRecords Then
FilterOptionen = 1 ’ Option Alle Toxikologie = 0 setzen
ElseIf Filter = „CAP = 0“ Then
FilterOptionen = Null ’ Keine Option setzen
End If
End Sub

Können Ihr mir helfen oder ist mein Vorhaben nicht möglich?

Vielen Dank im Voraus

Manfred Roloff

Einfach den Filter - wie Du es mit „Caps“ und „Parameter“ bereits gemacht hast - um eine Dritte Bedingung, in Deinem Fall „Freigabestufe“ erweitern.

Ein Filter darf die gleichen Formulierungen enthalten wie die „where“ Bedingung in einer Abfrage (SQL-Statement).

Also „Bedingung1 and Bedingung2 and Bedingung3“ usw…

Guten Tag Manfred,

ich arbeite zwar schon ewig mit Access, habe mich aber bisher immer um die Verwendung der Filterfunktion gedrückt-habe das lieber in der Abfrage selbst eingebaut bzw. eine Abfrage auf eine Abfrage gelegt.
Daher - keine Ahnung !
sorry
Schönes Wochenende !
Peter

Hallo Herr Roloff,

so aus dem Ärmel kann ich Ihre Frage nicht beantworten, schlage daher ein Näherungsverfahren vor, bei dem man so viel lernt, dass sich der erstmalige Aufwand nach kurzer Zeit gelohnt hat.

(1) Drücken Sie Ihr Filteranliegen in einer Abfrage aus.
Wenn das gelungen, dann …
(2) Schauen Sie sich im Fenster des Abfrageentwurfs diese Abfrage als SQL-Code an.
(3) Fügen Sie diesen SQL-String durch paste&Copy in eine zuvor deklarierte String-Variable, z.B. strSQL, in Ihrer Prozedur ein.
strSQL = „…sql-string …“
(4) Danach schreiben Sie eine Zeile:
doCMD.RunSQL strSQL

Wenn Sie diesen kurzen Code in einem Ereignis unterbringen, z.B. wenn im Unterformular etwas angeklickt wird, wird diese Abfrage ausgeführt.

Ich hoffe, geholfen zu haben. Bin gern zu Weiterem bereit, aber am Samstag ab Mittag nicht erreichbar.

Gruß,
Tronicrot

Hallo Peter,
vielen Dank, das Du dich gemeldet hat

Schönes Wochenende
Manfred

Hallo!

Das hört sich nicht unlösbar an. Wenn ich das richtig verstehe dann sollte sich das in etwa so lösen lassen. Ich nehme hier an, dass es ein Steuerelement „Freigabestufe“ gibt, dass mit 1 oder 0 gefüllt ist.

If FilterOptionen = 1 Then
’ Me.Filter = „CAP = 0“ ‚Toxikologie =
Me.Filter = „CAP = 0 AND Parameter = '“ & ParameterFilter.Value & "‘" &
AND Freigabestufe = " & Freigabestufe.Value
Me.FilterOn = True 'Filter anwenden

ElseIf FilterOptionen = 2 Then Me.Filter = „CAP = 1 AND Parameter = '“ & ParameterFilter.Value & „’“ &
AND Freigabestufe = " & Freigabestufe.Value

'Allergologie = 1
Me.FilterOn = True 'Filter anwenden

Else
Me.FilterOn = False 'Filter entfernen

Klappt das?
Gruß, Tim

Hallo Tim
es hat nicht geklappt. Anbei meine Problem mit Beispiel:
Aufgabe1:
1.Parameter aus Listendeld auswählen: erwartete Anzeige alle DS Blei (U)
2. CAP Toxikologie = 0 auswählen : erwartete Anzeige alle DS CAP=0
Blei (U))

Aufgabe2:
1.Parameter aus Listendeld auswählen: erwartete Anzeige alle DS gE-Antikörper (X-C)
2. CAP Allergologie = 1 auswählen : erwartete Anzeige alle DS CAP=1

Meine Frage: wie binde ich die Aufgaben:
1.3a.Freigabestufe =0 offen auswählen: erwartete Anzeige alle DS Freigabestufe =0 (2 DS Blei (U))
1.3b.Freigabestufe =1 bestätigt auswählen: erwartete Anzeige alle DS Freigabestufe =1 (3 DS

2.3a.Freigabestufe =0 offen auswählen: erwartete Anzeige alle DS Freigabestufe =0
2.3b.Freigabestufe =1 bestätigt auswählen: erwartete Anzeige alle DS Freigabestufe =1
In die Optionsgruppe ein

Optionsgruppe
Name: FilterOptionen
Steuerelementinhalt: ist leer
Standardwert: 1
Bei Fokuserhalt
Optionswert: 1
Private Sub Option56_GotFocus 'FilterOptionen CAP Toxikologie = 0
Optionswert: 2
Private Sub Option58_GotFocus 'FilterOptionen CAP Allergologie = 1
Nach Aktualiesirung
Private Sub FilterOptionen_AfterUpdate()
’ Filter für die gewünschte Option anwenden oder löschen
'Stop
If FilterOptionen = 1 Then

’ Me.Filter = „CAP = 0“ ‚Toxikologie = 0
Me.Filter = „CAP = 0 AND Parameter = '“ & ParameterFilter.Value & "‘"
Me.FilterOn = True ‚Filter anwenden
ElseIf FilterOptionen = 2 Then Me.Filter = „CAP = 1 AND Parameter = '“ & ParameterFilter.Value & "‘" 'Allergologie = 1
Me.FilterOn = True 'Filter anwenden
Else
Me.FilterOn = False 'Filter entfernen

End If
End Sub

Frm_Labor_Messwert UnterformularFrei
L-Nummer_N Kuerzel Parameter Dimension Ergebnis Kommentar: CAP Freigabestufe
L-00874-09 41 Blei (U) µg/l 1,5 0 1
L-01100-09 41 Blei (U) µg/l 1,9 0 0
L-01101-09 41 Blei (U) µg/l 1,2 0 1
L-01102-09 41 Blei (U) µg/l 1,4 0 0
L-01103-09 41 Blei (U) µg/l 1,4 0 1
L-01104-09 234 IgE-Antikörper (X-C) 1 1
L-01104-09 234 IgE-Antikörper (X-C) 1 0
Listenfeld (Parameter) Ungebunden
ParameterFilter
Private Sub ParameterFilter_Change()
FilterOptionen_AfterUpdate
End

Vielen Dank im Vorraus
Gruß
Manfred

Hallo Andi
die Bedingung3 wird nicht ausgeführt.

Aber trotzdem vielen Dank

Manfred

Hallo Tronicrot

nach Fügen des SQL-String wird dieser Rot als Fehler dargestellt.
kannst Du mir die Schritte 3 und 4 wie Sie im Modul stehen müüsen an einen Beispiel zeigen?

Gruß
Manfred

Hallo Manfred,

zuerst einmal einige allgemeine Anmerkungen:

* Wenn man Anfragen an „Experten“ schickt, wird man in der Regel Antworten erhalten, die für einen „Anfänger“ schwer verständlich sind. Möglicherweise kann man mit den Antworten „Fortgeschrittener“ mehr anfangen.

* Man sollte bei Anfragen immer auch die Software-Version mit angeben. Es macht meist große Unterschiede, ob man z.B. in Access 2.0 oder in Access 2007 arbeitet!

Wenn ich die Anfrage richtig verstanden habe, geht es hier gar nicht um „Parameterabfragen“. Letztlich hat man ein Formular, auf Basis dessen Angaben man eine gefilterte Abfrage erstellen will. Parameterabfragen nutze ich, wenn der Benutzer beim Aufruf einer Abfrage per „Message Box“ um eine Angabe für einen Parameter gebeten wird.

Hier hingegen macht der Benutzer seine Auswahl(en) in einem Formular, auf Druck z.B. auf einen Button kann dann die Abfrage individuell erstellt werden. Ich mache das immer direkt im Programmcode (wo man die Bedingungen per SQL nutzt), es geht aber wohl auch per Filter.

Man sollte sich vorab einige Gedanken machen. Meist reicht es nicht, wenn man nur die Optionen „0“ und „1“ anbietet. Will man doch oft alle Werte sehen (also das aktuelle Kriterium unbeachtet lassen)! Also muss man dem Benutzer auch die dritte Option („Wert ignorieren“ o.ä.) anbieten! Die Filterbedingung wäre dann so etwas im Stil von "(CAP = " & Me.FilterCAP & „) OR (“ & Me.FilterCAP & „=2);“.

Hier meine Standard-Antwort zur Erstellung von Abfragen - etwas komplizierter, aber hier findest Du alle benötigten Informationen für den „Königsweg“:

Erstellen einer Abfrage mit komplexen Suchkriterien:

Im Prinzip kann die Abfrage direkt auf ein Eingabeformular zugreifen - dort kann man auch alle existierenden Werte eines Feldes als Combobox anbieten.
Die Abfrage würde dann für jede Bedingung ein Feld des Formulars abprüfen im Stil von

SELECT * FROM Tabelle WHERE
(Kriterium = Forms!Filter!ControlName) OR (Forms!Filter!ControlName IS NULL);

(IS NULL sollte man zulassen, damit man nicht GEZWUNGEN ist, einen Wert einzugeben!)

Du kannst Dir aber vorstellen, dass das schon bei drei Kriterien unglaublich schwer wird - man hat dann schon 2^3 = 8 Bedingungszeilen, um alle möglichen Kombinationen auszuwerten!

Zudem hat Access ein echtes Problem, wenn in etwas komplexeren Abfragen (Kreuztabelle usw.) auf ein Formular zugegriffen wird!

Ich mache so etwas deshalb immer per Programmcode - das ist zwar auf den ersten Blick viel komplizierter, aber auf jeden Fall flexibler und schneller!

Das Prinzip:

  1. In einem Formular werden alle notwendigen Auswahlmöglichkeiten bereitgestellt (wie oben).
  2. Erstellen einer Muster-Abfrage (mit allen Parametern, ruhig als Konstante), Speichern
  3. Auf Druck eines Button wird je nach ausgewählten Optionen der SQL-Text der Musterabfrage geändert!

Beispiel zu 3.:

Dim SQLText$, QD as QueryDef
SQLText = „“
If Not IsNull(Kriterium1) Then
'Suche nach Text
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & „(Haupttabelle.Feldname=“"" & Kriterium & „“")"
End If
If Not IsNull(Kriterium2) Then
'Suche Text mit Ähnlichkeitssuche (Joker)
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & „(Haupttabelle.Feldname LIKE „“*“ & Kriterium2 & „*“")"
End If
If Not IsNull(Kriterium3) Then
'Suche nach Zahl, Suche in Untertabelle
If Len(SQLText) > 0 Then SQLText = SQLText & " AND "
SQLText = SQLText & "( EXISTS (SELECT * FROM Tabelle WHERE "
SQLText = SQLText & "(Haupttabelle.ID = Tabelle.ID) AND "
SQLText = SQLText & „(Haupttabelle.Feldname=“ & Kriterium3 & „)))“
End If
If Len(SQLText) > 0 Then SQLText = " WHERE " & SQLText
SQLText = „SELECT * FROM Haupttabelle“ & SQLText & „;“
Set QD = CurrentDB.QueryDefs(„Abfragename“)
QD.SQL = SQLText
Set QD = Nothing

Das schöne an dieser Variante ist, dass man nicht benutzte Kriterien einfach weglassen kann - das macht die Abfrage deutlich schneller!

Liebe Grüße,
Kurt

Hallo Herr Roloff,
wenn ich ein kontretes Beispiel bringen soll, brauche ich 1. einige Sätze aus der Tabelle und 2. ein Abfrage, die Ihrem Filteranliegen entspricht.
(Falls das nicht klappe: ein/IhrBeispiel an Bedingungen, die die Abfrage erfüllen soll.

Vielleicht schaffen wir es.

Gruß,
Tronicrot

Hallo
Tronicrot

Kann ich Dir eine geziepte Beispiel DB senden?

Zu 2
Aufgabe1:
1.Parameter aus Listenfeld auswählen: erwartete Anzeige alle DS Blei (U)
2. CAP Toxikologie = 0 auswählen: erwartete Anzeige alle DS CAP=0 Blei (U))

Aufgabe2:
1.Parameter aus Listenfeld auswählen: erwartete Anzeige alle DS gE-Antikörper (X-C)
2. CAP Allergologie = 1 auswählen : erwartete Anzeige alle DS CAP=1

Meine Frage: wie binde ich die Aufgabe3a und b in die In die Optionsgruppe Aufgaben1+2 ein:
3a.Freigabestufe =0 offen auswählen: erwartete Anzeige alle DS Freigabestufe =0
3b.Freigabestufe =1 bestätigt auswählen: erwartete Anzeige alle DS Freigabestufe =1

Ansonsten zu 1.
Frm_Labor_Messwert UnterformularFrei
L-Nummer_N Kuerzel Parameter Dimension Ergebnis CAP Freigabestufe
L-00874-09 41 Blei (U) µg/l 1,5 0 1
L-01100-09 41 Blei (U) µg/l 1,9 0 0
L-01101-09 41 Blei (U) µg/l 1,2 0 1
L-01102-09 41 Blei (U) µg/l 1,4 0 0
L-01103-09 41 Blei (U) µg/l 1,4 0 1
L-00740-09 234 IgE-Antikörper (X-C) 1 1
L-00738-09 234 IgE-Antikörper (X-C) 1 0
L-00737-09 234 IgE-Antikörper (X-C) 1 1
L-01111-09 234 IgE-Antikörper (X-C) 1 0
L-01112-09 234 IgE-Antikörper (X-C) 1 1

Hallo, Problem wieder ein Stück besser verstanden. Bitte die angekündigte .mdb senden an:
[email protected]
Wenn da auch noch ein Formular enthalten wäre, mit dem die spätere Benutzung stattfinden soll, werden wir bald eine Lösung haben.
Gruß
Tronicrot

Hallo Kurt

Vielen Dank für die Info
habe aber schon eine andere Lösung gefunden

Liebe Grüße
Manfred

Hallo manfred,

leider kann ich Dir da nicht helfen, weil ich mit Access-VBA selbst noch nicht so viel gemacht habe.

Ich hoffe, Du findest einen geeigneten Ansprechpartner für Deine anfrage!

Viele grüße!

Dagmar

Hallo Dagmar
Danke, das Du gemeldest hast
Gruß
Manfred