Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Datum "von....bis..." in Formular abfragen und an Abfrage weitergeben

Begonnen von joerg_w, Oktober 15, 2010, 11:22:54

⏪ vorheriges - nächstes ⏩

joerg_w

Hallo,

ich habe vor kurzem (mit viel Hilfe aus diesem Forum) ein Formular gebastelt,
mit dem ich per Auswahl in Listenfeldern Kriterien für eine Abfrage auswählen kann.

Ich will dem Formular noch ein weiteres Kriterium hinzufügen - und zwar, dass nur
Datensätze von bis zu einem bestimmten Datum ausgewählt werden.

Problem 1: Wie bekommee ich ein "Feld" in das Formular, in dem der Benutzer den Zeitraum
festlegen kann, den er abfragen will

Problem 2: Wie gebe ich die Eingabe des Benutzers an die Abfrage weiter.

Hier ist der Code, den in im Moment verwende:

Private Sub Befehl2_Click()
    Dim sAuswahlPerson As String
    Dim sAuswahlVorgang As String
    Dim sAuswahlStatus As String
    Dim strSQL As String
    Dim itm As Variant
    Dim chkWhere As Boolean

    'SQL-Grundgerüst zusammenstellen

   strSQL = "SELECT A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr, A_Auswertung_j.Beschreibung, T_Leistungsstunden.Person, " & _
                    "T_Leistungsstunden.Stunden, T_Vorgang.[A-Status], T_Vorgang.Projekt, T_Leistungsstunden.Datum " & _
                    "FROM T_Vorgang INNER JOIN (T_Leistungsstunden INNER JOIN A_Auswertung_j ON T_Leistungsstunden.VorgangsNr = A_Auswertung_j.VorgangsNr) ON T_Vorgang.VorgangsNr =     T_Leistungsstunden.VorgangsNr "


    'Die Listenfelder einzeln auf Auswahlen abfragen - beginnen mit Personen
    For Each itm In Me!Liste0.ItemsSelected
        itm = Me!Liste0.ItemData(itm)
        sAuswahlPerson = sAuswahlPerson & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlPerson) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlPerson = Left(sAuswahlPerson, Len(sAuswahlPerson) - 1)
    End If
    '################################################
    'Liste mit Vorgängen
    For Each itm In Me!Liste9.ItemsSelected
        itm = Me!Liste9.ItemData(itm)
        sAuswahlVorgang = sAuswahlVorgang & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlVorgang) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlVorgang = Left(sAuswahlVorgang, Len(sAuswahlVorgang) - 1)
    End If
    '################################################
    'Liste mit Stati
    For Each itm In Me!Liste13.ItemsSelected
        itm = Me!Liste13.ItemData(itm)
        sAuswahlStatus = sAuswahlStatus & "'" & itm & "',"
    Next itm

    'Liste aufbereiten
    If Len(sAuswahlStatus) > 0 Then
        'Letztes Komma wieder abziehen
        sAuswahlStatus = Left(sAuswahlStatus, Len(sAuswahlStatus) - 1)
    End If
   
    '################################################################
    'Festlegen der WHERE-Klausel
    'für die ausgewählten Personen
    If Len(sAuswahlPerson) > 0 Then
        strSQL = strSQL & "WHERE T_Leistungsstunden.Person IN (" & sAuswahlPerson & ")"
        chkWhere = True
    End If
   
    If Len(sAuswahlVorgang) > 0 Then
        If chkWhere = True Then    'für ausgewählte Personen UND Vorgänge
            strSQL = strSQL & " AND T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
        Else
            'für ausgewählte Projekte
            strSQL = strSQL & "WHERE T_Leistungsstunden.VorgangsNr IN (" & sAuswahlVorgang & ")"
            chkWhere = True
        End If
    End If

    If Len(sAuswahlStatus) > 0 Then
        If chkWhere = True Then 'für ausgewählte Personen UND / ODER Vorgänge UND Stati
            strSQL = strSQL & " AND T_Vorgang.[A-Status] IN (" & sAuswahlStatus & ")"
        Else
            'für ausgewählte Stati
            strSQL = strSQL & "WHERE T_Vorgang.[A-Status] IN (" & sAuswahlStatus & ")"
            chkWhere = True
        End If
    End If
    '#################################################################
    'Anfügen der Sortieranweisung

    strSQL = strSQL & " ORDER BY A_Auswertung_j.Firma, T_Leistungsstunden.VorgangsNr;"

    'SQL-String kontrollieren
    Debug.Print strSQL

    CurrentDb.Querydefs!A_Auswertung_gesamt.SQL = strSQL
   
    'Öffnen des Berichts

    DoCmd.OpenReport "B_Auswertung_gesamt", acViewReport



Vielen Dank & Gruß

Jörg

Wodka43

Hallo na,

Problem 1:

Du öffnest dein Formular in der Entwurfsansicht, und fügst ein Textfeld da ein wo du es haben willst, benennst es aussagekräftig und gut ;-)

Problem 2:
du fügst folgende funktion im vbcode des Formulars hinzu:

Function UsaDateFormat(Date_str As Variant) As String
'***************************************
'Description: Wandelt ein Datum in US-Format um für verwendung in SQL-Abfragen
'
'Parameter: Date_str = ein Datumswert
'
'Returns: Datumsstring in US-Format mit # als Begrenzer
'
'Comment:
'***************************************
     On Error GoTo UsaDateFormat_err

    Dim d As Integer
    Dim M As Integer
    Dim y As Integer
    Dim s As Integer
    Dim Mi As Integer
    Dim h As Integer
    Dim H_str As String
    Dim Pm_flag
    Dim Msg_str As String
    Dim Result As String

     If IsDate(Date_str) Then
         d = day(Date_str)
         M = month(Date_str)
         y = year(Date_str)
       
         s = second(Date_str)
         Mi = minute(Date_str)
         h = hour(Date_str)

         Pm_flag = 0
         If h / 12 > 1 Then
             H_str = LTrim(str$(h - 12))
             Pm_flag = -1
         Else
             H_str = LTrim(str$(h))
         End If

         Result = LTrim(str$(M)) & "/"
         Result = Result & LTrim(str$(d)) & "/"
         Result = Result & LTrim(str$(y)) & " "
         Result = Result & H_str & ":"
         Result = Result & LTrim(str$(Mi)) & ":"
         Result = Result & LTrim(str$(s))
         If Pm_flag Then Result = Result & " PM"
         Result = "#" & Result & "#"
     Else
         Msg_str = "Falsches Datumformat: " & Date_str
         msgboX Msg_str, 64
         Result = ""
     End If

     UsaDateFormat = Result


End Function


dann fügst du in deinen veröffentlichten Code noch hinzu:

'irgendwo, wo du den strSQL mit den where bedingungen ergänzt
    If Len(DeinNeuesTextfeld) > 0 Then
        If chkWhere = True Then 'für ausgewählte Personen UND / ODER Vorgänge UND Stati
            strSQL = strSQL & " AND T_Vorgang.[DeinDatumsFeld] < " & UsaDateFormat(me.DeinNeuesTextfeld)
        Else
            'für ausgewählte Stati
            strSQL = strSQL & "WHERE T_Vorgang.[DeinDatumsFeld] < " & UsaDateFormat(me.DeinNeuesTextfeld)
            chkWhere = True
        End
"Nimm das Leben nicht zu ernst, du kommst da eh nicht lebend raus"
;)

oma

Hallo,

wenn man öfters ein Datum in SQL einsetzen möchte, kann man eine Funktion dafür benutzen. Diese muss aber nicht "so lang" sein, wie die von Wodka.
Man kommt mit einem Einzeiler aus:

Public Function StrDatum(dat As Date) As String
StrDatum = Format$(dat, "\#yyyy\-mm\-dd hh\:nn\:ss\#")
End Function


und dann in SQL:      ...DatumFeld >= " & StrDatum(Me!DatumSuchFeld)

ohne die Funktion    ...DatumFeld <= " & Format(Me!DatumSuchFeld, "\#yyyy-mm-dd\#")


Gruß Oma
nichts ist fertig!