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