Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Suchfunktion um Datum zwischen Start- und Enddatum erweitern

Begonnen von Michel_koeln, März 14, 2013, 22:51:13

⏪ vorheriges - nächstes ⏩

Michel_koeln

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?

bahasu

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 Select

Harald
Servus

Michel_koeln

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.

DF6GL

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 EndDATUM.  ??


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

Michel_koeln

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?

oma

Hallo Michel,

mal ein kleines Beispiel, wie es auch geht.

Gruß Oma

[Anhang gelöscht durch Administrator]
nichts ist fertig!

DF6GL

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

Michel_koeln

Vielen Dank euch beiden!

Ich komme erst heute abend wieder dazu, werde mir dann aber beide Vorschläge genauer ansehen.

Michel_koeln

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 "