[Access] Optionales Kriterium aus Formular an Abfrage

Wolfsbein

Erfahrenes Mitglied
Hallo
ich habe ein Formular bei dem ich drei Felder habe: Feld A, Feld B und Feld C. Mit einem Button wird eine Abfrage gestartet. Die Abfragekriterien sehen natürlich so aus: =[forms]![myForm]![Feld A]...
Wenn ich jetzt in Feld B, oder C nichts eingebe, dann erhalte ich keine Daten, logisch. Wie muss ich also die Abfrage definieren, bzw. den Code im Formular schreiben, damit, wenn in B und/oder C nichts steht einfach B und/oder C als Kriterium wegfällt? Danke.
 
mach das doch einfach per code und stell dir da einfach eine sql-anweisung zusammen. und je nachdem, ob in den einzelnen textfeldern was drinsteht, kannst du dann ja einfach die abfrage aufbauen.
 
Danke das hört sich nicht schlecht an. Ich bin aber ziemlich neu in Access. Wenn ich mir die SQL Abfragen also vorher zusammenstelle:
Code:
sql1 = 'Select...'
sql2 = 'Select...'
Wie muss ich dann das SQL Statement in den Code einbinden, damit genau diese Abfrage ausgeführt wird?
 
das kannst du am sinnvollsten mit recordset-objekten lösen. die musst du zur laufzeit erst erstellen, und kannst dann mit einer abfrage daten in das recordset laden.
im prinzip ist ein recordset ähnlich wie eine tabelle in der datenbank.

Code:
Dim rsAbfrage as ADODB.Recordset

Set rsAbfrage = New ADODB.Recordset
rsAbfrage.Open "SELECT * FROM tabelle;", CurrentProject.Connection, adOpenStatic, adLockPessimistic, -1
rsAbfrage.Close
Set rsAbfrage = Nothing

bei select-abfragen werden die entsprechenden daten, die die abfrage liefert in das recordset-objekt geladen. bei select-abfragen solltest du das recordset nachher auch mit der close-methode wieder schliessen - bei insert- oder create-abfragen wird das recordset automatisch wieder geschlossen.
und natürlich immer darauf achten, dass das objekt wieder gelöscht wird, wenn du es nicht mehr brauchst.

die andere möglichkeit ist, dass du die abfrage direkt über das connection-objekt von access ausführst. also einfach mit
Code:
CurrentProject.Connection.Execute "INSERT INTO tabelle (feld) VALUES('inhalt');"
bei select-abfragen brauchst du dann aber trotzdem ein recordset-objekt, in dem du deine daten speicherst.
 
Ok das habe ich verstanden. Nur wenn ich jetzt einen Bericht aufgrundlage des recordsets erstellen will, wo muss ich dann den Code hinschreiben? Normalerweiße gebe ich ja unter Datenherkunft eine Abfrage an.
 
ich weiss nicht, ob dich das jetzt irgendwie weiter bringt, aber du kannst doch einfach eine funktion (in einem modul) schreiben, die einen wert zurückgibt. und diese funktion kannst du als bedingung in die abfrage mit einbauen.
das sähe beispielsweise so aus:
Code:
SELECT * FROM tabelle WHERE feld = deine_funktion();
 
Hmmm. Das hört sich kompliziert an und ich bin noch Anfänger. Auf Module möchte ich übrigens komplett verzichten. Wie müsste ich den die Funktion als Bedingung in die Abfrage einbauen, also wo muss das hin?
 
das klingt komplizierter, als es eigentlich ist.
du legst einfach ein modul an, in dem du eine funktion schreibst die je nach zustand des formulars einen anderen wert zurück gibt.
dann legst du eine neue abfrage an, bei der du diese funktion als bedingung (kriterium) einträgst.
in deinem bericht stellst du diese abfrage dann als datenherkunft ein.

wenn dann der bericht aufgerufen wird, ruft der diese abfrage auf und die abfrage führt zuerst die funktion aus, und je nach rückgabewert hast du in dem bericht andere daten.

wenn du z.b. in einem modul folgende funktion hast:
Code:
Public Function test(i As Integer) As Integer
test = i + 1
End Function

kannst du die abfrage so gestalten:
Code:
SELECT * FROM tabelle WHERE feld = test(10);

dadurch werden alle datensätze zurückgegeben, bei denen die spalte "feld" den rückgabewert der funktion hat.
 
Also ich hab das jetzt mal so gemacht wie du gesagt hast. Leider geht es nicht :(.
Code:
Public Function qryBoardsReport(blub As String) As String
    If [Forms]![frmdoQuery]![txtPPC] = "" Then
       blub = ""
    End If
    If [Forms]![frmdoQuery]![txtPPC] <> "" Then
       blub = [Forms]![frmdoQuery]![txtPPC]
    End If
    
End Function
Das ist der Code im Modul. Und als Abfragekriterium schreibe ich: qryBoardsReport("blub"). Allerdings ist die Abfrage beidemale leer. Also wenn txtPPC einen Wert hat und wenn nicht auch. Ich bin kein großer VB-Kenner, aber die Variable blub ist doch die die zurückgegeben wird, oder? Ein return blub oder so gibt es ja nicht.
 
Zurück