Hallo.
Ich habe eine Datenbank bekommen, in der mit einem Suchformular nach bestimmten Feldern "gestaffelt" gesucht werden kann, d.h. es werden in einer Datenblattansicht zuerst alle Werte angezeigt, dann nur die gesuchten nach Kriterium 1, und auch diese können weiter differenziert werden nach Kriterium xy.
Realisiert ist diese Suchfunktion bisher so:
Private Sub cmdSuchen_Click()
Dim strSuchfilter As String
strSuchfilter = SuchfilterErstellen
If Len(strSuchfilter) > 0 Then
frmDatasheet.Filter = strSuchfilter
frmDatasheet.FilterOn = True
Else
frmDatasheet.Filter = ""
frmDatasheet.FilterOn = False
End If
End Sub
Private Function SuchfilterErstellen() As String
Dim strFilter As String
Dim strFieldname As String
Dim ctl As Control
For Each ctl In Me.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox
strFieldname = Mid(ctl.name, 4)
If ctl.ControlType = acTextBox Then
If Len(ctl.Value) > 0 Then
strFilter = strFilter & " AND " & strFieldname & " LIKE '" & Replace(ctl.Value, "'", "''") & "'"
End If
Else
If Not IsNull(ctl.Value) Then
Select Case Left(ctl.name, 3)
Case "cbo"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
Case "txt"
strFilter = strFilter & " AND " & strFieldname & " = '" & Replace(ctl.Value, "'", "''") & "'"
Case "chk"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
End Select
End If
End If
End Select
Next ctl
If Len(strFilter) > 0 Then
SuchfilterErstellen = Mid(strFilter, 5)
End If
End Function
Es gibt hier nun zwei Textfelder "Startdatum" und "Enddatum", nach diesen kann auch hervorragend gesucht werden. Das Problem ist allerdings, dass nicht nach einem bestimmten Datum (es geht dabei nur um Jahreszahlen) gesucht werden kann, das zwischen Start- und Enddatum liegt.
Es müsste also ein weiteres ungebundenes Textfeld hinzugefügt werden, in das beispielsweise "1995" eingegeben wird und das z.B. Datensätze ausgibt, die Startdatum 1992 und Enddatum 2000 haben o.ä.
Ist es möglich, das in diese Suchfunktion zu integrieren?
Hi,
Zitat von: Michel_koeln am März 14, 2013, 22:51:13
Das Problem ist allerdings, dass nicht nach einem bestimmten Datum (es geht dabei nur um Jahreszahlen) gesucht werden kann, das zwischen Start- und Enddatum liegt.
Das ist mit einem Vergleich möglich, der => bzw =< enthält.
Zusätzlich mußt Du aus Deinem Datumsfeld das Jahr herausholen: Year(Startdatum).
Das folgende ist ungetestet:
Select Case Left(ctl.Name, 3)
Case "cbo"
' unter der Annahme cboJahr_von und cboJahr_bis wurden als neue Felder hinzugefügt:
Select Case Mid(ctl.Name, 4)
Case "Jahr_von"
strFilter = strFilter & " AND " & Year(Startdatum) & " => " & ctl.Value
Case "Jahr_bis"
strFilter = strFilter & " AND " & Year(Enddatum) & " =< " & ctl.Value
Case Else
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
End Select
Case "txt"
strFilter = strFilter & " AND " & strFieldname & " = '" & Replace(ctl.Value, "'", "''") & "'"
Case "chk"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
End SelectHarald
Hallo,
vielen Dank schonmal.
Ich glaube, ich muss das Problem genauer schildern. Es handelt sich bei den Jahreszahlen um (vierstellige) Textfelder (bzw. Felddatentyp ZAHL), nicht um Datumsfelder. Diese sind "startdatum" und "enddatum". Grundsätzlich müsste der von dir erstellte Code also zu den Textfeldern (txt...), nicht zu den Kombinationsfeldern (cbo...).
In der Suche habe ich zwei ungebundene Felder "txtstartdatum" und "txtenddatum", damit kann ich z.B. alles anzeigen lassen, was Startdatum 1992 und Enddatum 1999 hat. Das funktioniert soweit. Jetzt hätte ich aber gerne ein zusätzliches Suchfeld (bspw. einfach nur "jahr" oder so), wo ich ein Jahr wie 1995 eingebe. Die Eingabe soll dann abgleichen, ob der Wert zwischen "startdatum" und "enddatum" liegt -> angezeigte Datensätze wären dann z.B. der oben genannte 1992-1999, aber nicht: 2001-2003.
Hallo,
ZitatEs handelt sich bei den Jahreszahlen um (vierstellige) Textfelder (bzw. Felddatentyp ZAHL), nicht um Datumsfelder. Diese sind "startdatum" und "enddatum".
Warum heißt das dann Start-, bzw End
DATUM. ??
.
.
.
.
End Select
Next ctl
If not Isnull(Me!lngJahr) Then strFilter = strFilter & " AND " & Me!lngjahr & " between StartDatum and Enddatum"
' lngJahr ist ein ungebundenes Formulartextfeld für die Eingabe der JahresZAHL. "Startdatum" und "Enddatum" sind die Tabellenfelder, die die Start- und End-Jahreszahl beinhalten.
If Len(strFilter) > 0 Then
SuchfilterErstellen = Mid(strFilter, 5)
End If
.
.
Vielen Dank, das scheint ein richtiger Weg zu sein. Allerdings habe ich nun noch das Problem, dass bei der Suche (wenn lngjahr nicht leer ist) noch einmal ein Parameterabfargefenster erscheint - mit der erneuten Eingabe funktioniert es dann, aber eben nur für den dort eingegebenen Wert. Ich denke, das liegt daran, dass das Feld lngjahr keine Entsprechung in der Tabelle hat, oder?
Hallo Michel,
mal ein kleines Beispiel, wie es auch geht.
Gruß Oma
[Anhang gelöscht durch Administrator]
Hallo,
ja, das liegt an diesem "pseudo"-variablen Code....
Der geht davon aus, dass die Textfelder im Formular sich mit den Tabellenfeldern decken(müssen), bis auf den Prefix (z. B. "txt") im Namen.
Versuch es mal so:
Private Sub cmdSuchen_Click()
Dim strSuchfilter As String
strSuchfilter = SuchfilterErstellen
If Len(strSuchfilter) > 0 Then
frmDatasheet.Filter = strSuchfilter
frmDatasheet.FilterOn = True
Else
frmDatasheet.Filter = ""
frmDatasheet.FilterOn = False
End If
End Sub
Private Function SuchfilterErstellen() As String
Dim strFilter As String
Dim strFieldname As String
Dim ctl As Control
For Each ctl In Me.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox
strFieldname = Mid(ctl.name, 4)
If ctl.ControlType = acTextBox Then
If Len(ctl.Value) > 0 Then
If ctl.Name = "lngJahr" Then
strFilter = strFilter & " AND " & Me!lngjahr & " between StartDatum and Enddatum"
Else
strFilter = strFilter & " AND " & strFieldname & " LIKE '" & Replace(ctl.Value, "'", "''") & "'"
End If
End If
Else
If Not IsNull(ctl.Value) Then
Select Case Left(ctl.name, 3)
Case "cbo"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
Case "txt"
strFilter = strFilter & " AND " & strFieldname & " = '" & Replace(ctl.Value, "'", "''") & "'"
Case "chk"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
End Select
End If
End If
End Select
Next ctl
If Len(strFilter) > 0 Then
SuchfilterErstellen = Mid(strFilter, 5)
End If
End Function"
strFilter = strFilter & " AND " & strFieldname & " = '" & Replace(ctl.Value, "'", "''") & "'"
Case "chk"
strFilter = strFilter & " AND " & strFieldname & " = " & ctl.Value
End Select.
End Select
Next ctl
If Len(strFilter) > 0 Then
SuchfilterErstellen = Mid(strFilter, 5)
End If
.
.
Vielen Dank euch beiden!
Ich komme erst heute abend wieder dazu, werde mir dann aber beide Vorschläge genauer ansehen.
Nochmals vielen Dank. Die Lösungen von euch sind super, allerdings habe ich es letztendlich nochmal anders gelöst:
Ich habe ein neues Steuerelement hinzugefügt (Kombinationsfeld mit einigen Werten/Jahreszahlen, in das aber auch frei eingetragen werden kann), und da gilt dann:
strFilter = strFilter & " AND " & ctl.Value & " BETWEEN Startdatum AND Enddatum "