Hallo an alle,
ich habe wieder mal ein kleines Problem.
Und zwar möchte ich eine Abfrage generieren. Diese soll die Daten bei Start nach mehreren Kriterien filtern. Zunächst soll eine Messagebox eingeblendet werden die mich nach dem Datum fragt. Also Anfangsdatum und Enddatum, danach welcher Hersteller, Nennbreite und zuletzt nach der Zählernummer.
Dafür habe ich folgenden SQL-Code geschrieben:
HAVING (((Erfassung.Datum)>=[Formulare]![von]![datum_bericht] Or (Erfassung.Datum)<[Formulare]![bis]![datum_bericht])) OR (((Hersteller.Hersteller)=[Formulare]![welcher]![Hersteller])) OR (((Erfassung.Nennbreite)=[Formulare]![welche]![Nennbreite])) OR (((Erfassung.Coilnummer)=[Formulare]![welche]![Coilnummer]))
Jetzt habe ich das Problem, dass das Programm abbricht, wenn eine Bedingung erfüllt ist, gebe ich quasi nur einen Zeitraum ein und einen Hersteller, so wird nur nach Zeitraum gefiltert, da es das erste Kriterium ist nach dem gesucht wird. Ich möchte aber, dass auch weiter gefiltert wird wenn ich mehrere Kriterien eingebe.
Kann mir da jemand weiterhelfen?
Danke schonmal im Voraus
Mfg Robby
Hallo,
"... einen Zeitraum ein
und einen Hersteller ..."
Dann solltest du deine Kriterien auch mit UND verknüpfen.
Zitat)=[Formulare]![welcher]![Hersteller]
Deine Formulare heißen tatsächlich 'von', 'bis', 'welche' und 'welcher' ?
Hallo,
zunächst einmal danke für deine Antwort.
Du hast Recht, wenn ich immer nach Hersteller und Zeitraum Filtern wöllte, dann müsste ich es mit AND verbinden. Ich möchte aber einmal nur nach einem Zeitraum filtern und das nächste mal nach dem Zeitraum, Hersteller und Anlage. Und beim dritten mal von mir aus nach allen Kriterien.
Wenn ich das dann mit AND verbinden würde, und nicht alle Felder ausfülle, würde ich ja dann gar kein Ergebnis erhalten.
Mfg Robby
Hallo,
eine dynamisch veränderbare Abfrage mit so vielen Kriterien aus Parametern zu erstellen wird sehr aufwändig sein.
Nimm doch ein Formular mit entsprechenden Textfeldern und baue den SQL-String per VBA zusammen.
Hier kannst du leichter und vor allem übersichtlicher arbeiten.
Den so entstandenen Sting weist du deiner Abfrage ebenfalls per VBA zu und öffnest sie dann.
HTH
Hallo,
@Forumsleitung
Weiss nicht ob Ihr es erlaubt Links zur "Konkurrenz"
zu posten, also falls es nicht gern gesehen ist, bitte
Euren Regeln entsprechend eingreifen.
@Robby
Schau Dir dies mal an:
http://www.office-loesung.de/ftopic13271_0_0_asc.php (http://www.office-loesung.de/ftopic13271_0_0_asc.php)
hth
gruss ekkehard
Hallo Ekkehard und HTH,
zunächst einmal danke für eure Antworten und den Link. War jetzt paar Tage nicht auf Arbeit und konnte daher nicht eher ein Feedback geben.
Der Code aus dem Link funktioniert soweit auch ganz gut. Habe ihn für meinen Fall ein bisschen angepasst und sieht jetzt so aus.
Public Sub SQLString(FieldValue As Variant, FieldName As String, _
Criteria As String, ArgCount As Integer, _
Typ As Integer, Optional bAnd As Boolean = True)
If Nz(FieldValue, "") <> "" Then
If bAnd Then
If ArgCount > 0 Then Criteria = Criteria & " AND "
Else
If ArgCount > 0 Then Criteria = Criteria & " OR "
End If
Select Case Typ
Case 1 'Datum
Criteria = Criteria & FieldName & "= #" & _
Format(CDate(FieldValue), "mm-dd-yyyy") & "#"
Case 2 'String Like
Criteria = Criteria & FieldName & " Like '*" & FieldValue & "*'"
Case 3 ' Zahl
Criteria = Criteria & FieldName & " = " & Str(FieldValue)
Case 4 'String =
Criteria = Criteria & FieldName & " = '" & FieldValue & "'"
Case 5 'Ja/nein
If FieldValue = "Ja" Or FieldValue = "True" Or _
FieldValue = True Then
Criteria = Criteria & FieldName & " = -1"
Else
Criteria = Criteria & FieldName & " = 0"
End If
End Select
ArgCount = ArgCount + 1
End If
End Sub
Private Function Filterbedingung()
Dim ArgCount As Integer
ArgCount = 0
myCriteria = ""
SQLString Me!Datumvon, Datumvon, myCriteria, ArgCount, 1
SQLString Me!Datumbis, Datumbis, myCriteria, ArgCount, 1
SQLString Me!Hersteller, Hersteller, myCriteria, ArgCount, 3
SQLString Me!Anlage, Anlage, myCriteria, ArgCount, 2
SQLString Me!Nennbreite, Nennbreite, myCriteria, ArgCount, 3
' Falls kein Kriterium spezifiziert wurde, gebe alle Datensätze zurück.
If myCriteria = "" Then myCriteria = "True"
Filterbedingung = myCriteria
End Function
Private Sub Berichtsvorschau_Click()
Me.Filter = Filterbedingung()
Me.FilterOn = True
DoCmd.OpenReport "Abfrage", acViewPreview
End Sub
Das Problem was jetzt noch besteht ist, dass der Code zwar alle Filterkriterien erkennt, aber am Ende den Filter nicht anwendet.
Das heißt, wenn ich eine Haltemarke reinmache und den Code Schritt für Schritt durchgehe sehe ich, dass er für jedes Feld die eingegeben Werte erkennt und auch bei
Filterbedingung = myCriteria
die richtigen Filterbedingungen erkennt. Aber er schafft es einfach nicht diese Filterkriterien nach dem Klicken auf die Befehlsschaltfläche "Berichtsvorschau" auch anzuwenden. Weiß jemand woran das liegen könnte?
Danke für die Hilfe
Mfg Robby