基本 Visual Basic 程序错误 - 可能是变量/语法错误标记为 Fat

问题描述

这是经过编辑的代码,包含 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...