问题描述
这是经过编辑的代码,包含 Gutav 的函数和 André 的实现代码。
如果没有错误,它似乎仍然无法正常工作。我一窍不通。
新代码:
Option Explicit
Private Sub Form_Load()
Dim rs As Recordset
Dim rs2 As Recordset
Dim Werte As String
Dim Datums_variable As Date
Dim actual_date As Date
Dim id As Integer
Dim strsql As String
actual_date = Date
Set rs = CurrentDb.OpenRecordset("select * from query_offene_wartungspunkte ",dbOpenDynaset)
Me.Test_Liste.RowSourceType = " Value List "
Do Until rs.EOF
Werte = rs!intervall
Select Case Werte
Case "jährlich"
Datums_variable = actual_date - 365
Case "halbjährlich"
Datums_variable = actual_date - 180
Case "monatlich"
Datums_variable = actual_date - 31
Case "wöchentlich"
Datums_variable = actual_date - 7
Case "täglich"
Datums_variable = actual_date - 1
Case "vierteljährlich"
Datums_variable = actual_date - 90
End Select
id = rs!id
strsql = "select * from query_offene_wartungspunkte " & _
"where [Date] > " & Csql(Datums_variable) & " And id = " & id
Debug.Print strsql
Set rs2 = CurrentDb.OpenRecordset(strsql,dbOpenDynaset)
If Not rs2.EOF Then
Werte = " Arbeitsplatz/Maschine: " & rs2!arbeitsplatz_maschine & " ArbeitsplatzNr: " & rs2!arbeitsplatz_nr
Me.Test_Liste.AddItem (Werte)
Else
' rs2 is empty
End If
rs.MoveNext
Loop
End Sub
Public Function Csql( _
ByVal Value As Variant) _
As String
#If Win32 Then
' Serves only to make the code compile unmodified in 32-bit VBA
' which misses the constant VBA.vbLongLong.
Const vbLongLong As Integer = 20
#End If
Const sqlNull As String = " Null"
Dim sql As String
Select Case VarType(Value)
Case vbEmpty ' 0 Empty (uninitialized).
sql = sqlNull
Case vbNull ' 1 Null (no valid data).
sql = sqlNull
Case vbInteger ' 2 Integer.
sql = Str(Value)
Case vbLong ' 3 Long integer.
sql = Str(Value)
Case vbSingle ' 4 Single-precision floating-point number.
sql = Str(Value)
Case vbDouble ' 5 Double-precision floating-point number.
sql = Str(Value)
Case vbCurrency ' 6 Currency.
sql = Str(Value)
Case vbDate ' 7 Date.
sql = Format(Value," \#yyyy\/mm\/dd hh\:nn\:ss\#")
Case vbString ' 8 String.
sql = Replace(Trim(Value),"'","''")
If sql = "" Then
sql = sqlNull
Else
sql = " '" & sql & "'"
End If
Case vbObject ' 9 Object.
sql = sqlNull
Case vbError ' 10 Error.
sql = sqlNull
Case vbBoolean ' 11 Boolean.
sql = Str(Abs(Value))
Case vbVariant ' 12 Variant (used only with arrays of variants).
sql = sqlNull
Case vbDataObject ' 13 A data access object.
sql = sqlNull
Case vbDecimal ' 14 Decimal.
sql = Str(Value)
Case vbByte ' 17 Byte.
sql = Str(Value)
Case vbLongLong ' 20 LongLong integer (Relevant in 64-bit VBA only).
sql = Str(Value)
Case vbUserDefinedType ' 36 Variants that contain user-defined types.
sql = sqlNull
Case vbArray ' 8192 Array. Ignored.
sql = sqlNull
Case Else ' Should not happen.
sql = sqlNull
End Select
Csql = sql & " "
End Function
有人可以帮我吗?
像这样:
Set rs2 = CurrentDb.OpenRecordset("select * from query_offene_wartungspunkte where Date > " & Datums_variable & " AND id = " & id = " & id,dbOpenDynaset)
解决方法
如果您想用 SQL 连接变量,请使用 Gustav 的 CSql()
function。
它处理日期、字符串和其他变量。
strSql = "select * from query_offene_wartungspunkte " & _
"where [Date] > " & CSql(Datums_variable) & " AND id = " & id
Debug.Print strSql
Set rs2 = CurrentDb.OpenRecordset(strSql,dbOpenDynaset)
为什么是Debug.Print
?见How to debug dynamic SQL in VBA
检查记录集是否有行的正确方法是:
If Not rs2.EOF Then
' use values
Else
' rs2 is empty
End If