# [Access] Optionales Kriterium aus Formular an Abfrage



## Wolfsbein (5. Oktober 2002)

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.


----------



## Dario Linsky (5. Oktober 2002)

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.


----------



## Wolfsbein (6. Oktober 2002)

Danke das hört sich nicht schlecht an. Ich bin aber ziemlich neu in Access. Wenn ich mir die SQL Abfragen also vorher zusammenstelle:

```
sql1 = 'Select...'
sql2 = 'Select...'
```
Wie muss ich dann das SQL Statement in den Code einbinden, damit genau diese Abfrage ausgeführt wird?


----------



## Dario Linsky (6. Oktober 2002)

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.


```
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 
	
	
	



```
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.


----------



## Wolfsbein (6. Oktober 2002)

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.


----------



## Dario Linsky (6. Oktober 2002)

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:

```
SELECT * FROM tabelle WHERE feld = deine_funktion();
```


----------



## Wolfsbein (6. Oktober 2002)

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?


----------



## Dario Linsky (6. Oktober 2002)

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:

```
Public Function test(i As Integer) As Integer
test = i + 1
End Function
```

kannst du die abfrage so gestalten:

```
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.


----------



## Wolfsbein (6. Oktober 2002)

Danke damit werde ich jetzt mal rumbasteln.


----------



## Wolfsbein (7. Oktober 2002)

Also ich hab das jetzt mal so gemacht wie du gesagt hast. Leider geht es nicht .

```
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.


----------



## dfd1 (7. Oktober 2002)

Hänge doch mal die DB an. Vieleicht bekommst du so eine einfachere Lösung


----------



## Wolfsbein (7. Oktober 2002)

Tut mir leid, aber anhängen kann ich die DB nicht.


----------



## Dario Linsky (7. Oktober 2002)

die variable "blub" (sehr genialer variablenname, könnte glatt von mir stammen ) wird nur an deine funktion übergeben. wenn du einen wert zurückgeben willst, musst du dem namen der funktion diesen wert zuweisen:


```
Public Function qryBoardsReport(blub As String) As String
    If [Forms]![frmdoQuery]![txtPPC] = "" Then
       qryBoardsReport = ""
    End If
    If [Forms]![frmdoQuery]![txtPPC] <> "" Then
       qryBoardsReport = [Forms]![frmdoQuery]![txtPPC]
    End If
End Function
```

in deinem bisherigen code gibt die funktion gar nichts zurück, also bleibt auch die abfrage leer.
trotzdem gibt es eine möglichkeit, wie du den wert über die variable "blub" zurückgeben kannst. du könntest z.b. den parameter der funktion als referenz-variable definieren, aber das macht in deinem fall nicht unbedingt sinn.


----------



## Wolfsbein (8. Oktober 2002)

Das mit dem Rückgabewert habe ich jetzt verstanden. Nur haut es so auch nicht hin. Ich werde hier posten, wenn es mit irgendwie in den Schoß gefallen ist .


----------



## Wolfsbein (8. Oktober 2002)

OK Kommando zurück. Ich denke das Problem liegt an einer ganz anderen Stelle. Wenn ich die Funktion rauswerfe und Forms!frmdoQuery!txtPPC bzw. formulare!... reinschreibe dann wird auch kein Datensatz angezeigt, obwohl ein richtiger PPC im Feld stehen würde. Jetzt könnt man sagen, du Trottel du hast eine Rechtschreibfehler drin. Leider ist dem nicht so . Ich habe Forms!... sogar mit Aufbauen definiert. Das Feld und das Formular heißen wirklich so . Wenn ich in das Kriterienfeld gar nichts reinschreibe, dann werden natürlich wieder alle DS angezeigt. Ich weiß jetzt echt nicht mehr weiter. Ist das nun ein Bug?


----------

