【问题标题】:What is the missing operator in this VBA Code?此 VBA 代码中缺少的运算符是什么?
【发布时间】:2015-10-30 18:47:29
【问题描述】:

我将此代码构建为测试,以根据日期范围从 Access 2013 数据库中删除一系列记录。我在查询表达式 'START_DATE >= .....etc 中遇到缺少运算符错误。我也试过带撇号的 select 语句。

注意:CALL 行是实际代码中的全部一行。此外,如果我使用 Between/AND 而不是 >= /

  Function Delete_Range()

  Dim begdt As Date
  Dim enddt As Date

 'user inputs date range
  begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
  enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")


  Dim objectrecordset As ADODB.Recordset
  Set objectrecordset = New ADODB.Recordset

 'initiate recordset object
 objectrecordset.ActiveConnection = CurrentProject.Connection
 Call objectrecordset.Open("select START_DATE 
 from TEMP_DATE_RANGE where START_DATE IS >= "
 & begdt & " AND <= " & enddt, , , adLockBatchOptimistic)

 While objectrecordset.EOF = False
 'delete record
 objectrecordset.Delete
 objectrecordset.UpdateBatch

 'move to next record
 objectrecordset.MoveNext
 Wend

 End Function

感谢大家的帮助。这是有效的代码。

 DoCmd.SetWarnings (warningsoff)

 'Declare variables
 Dim begdt As String
 Dim enddt As String

 'User inputs variables
 begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
 enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")

 'Format variable as date and error handling
 If Not (IsDate(begdt) And IsDate(enddt)) Then
    MsgBox "Please enter a date using a the date format", vbOKOnly
     GoTo Finished

 Else
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#")
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#")

 End If

 'Delete records from tables based upon user input date range
 Dim SQL As String
 Dim SQL2 As String
 Dim SQL3 As String

  SQL = "DELETE * FROM TEST_TBL_1 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""
 SQL2 = "DELETE * FROM TEST_TBL_2 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""
 SQL3 = "DELETE * FROM TEST_TBL_3 WHERE START_DATE BETWEEN " & begdt & " AND " & enddt & ""

 DoCmd.RunSQL SQL
 DoCmd.RunSQL SQL2
 DoCmd.RunSQL SQL3

 'Close form and show process complete page
 DoCmd.SetWarnings (warningson)
 DoCmd.Close acForm, "DELETE HISTORY", acSaveNo
 DoCmd.OpenForm "COMPLETE", acNormal, "", "", , acNormal

 Finished:

 End Function

【问题讨论】:

  • 使用类似db.execute ("DELETE * FROM TEMP_DATE_RANGE WHERE START_DATE BETWEEN #" &amp; begdt &amp; "# AND #" &amp; enddt &amp; "#") 的东西会不会更简单,或者我在这里遗漏了什么?为什么需要选择和调用?

标签: sql ms-access vba ms-access-2013


【解决方案1】:

你正在为这些混合日期值和字符串表达式,这一切都从你的输入框开始,它总是返回一个字符串:

Dim begdt As String
Dim enddt As String

' user inputs date range
begdt = InputBox("Enter beginning date as mm/01/yyyy", "BEGINNING DATE")
enddt = InputBox("Enter ending date as mm/01/yyyy", "ENDING DATE")

If Not (IsDate(begdt) And IsDate(enddt)) Then
    ' Show error.
Else
    begdt = Format(begdt, "\#yyyy\/mm\/dd\#)
    enddt = Format(enddt, "\#yyyy\/mm\/dd\#)

    Dim SQL As String
    SQL = "Select START_DATE From TEMP_DATE_RANGE Where START_DATE Between " & begdt & " And " & enddt & ""
    Dim objectrecordset As ADODB.Recordset
    Set objectrecordset = New ADODB.Recordset

   'initiate recordset object
   objectrecordset.ActiveConnection = CurrentProject.Connection
   Call objectrecordset.Open(SQL, , , adLockBatchOptimistic)

   ' <Snip>
   ' Clean up.
End If

【讨论】:

    【解决方案2】:

    首先在 Access 查询设计器中制定查询逻辑和语法。假设 START_DATE 是日期/时间数据类型,请为目标日期范围的开始和结束选择几个静态值:

    SELECT START_DATE 
    FROM TEMP_DATE_RANGE
    WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30#
    

    根据需要进行调整。

    一旦你有了正确的 SQL 语句,就在你的 VBA 代码中构建相应的语句文本。

    Dim strSelect As String
    strSelect = "SELECT START_DATE FROM TEMP_DATE_RANGE " & _
        "WHERE START_DATE BETWEEN " & Format(begdt,"\#yyyy-m-d\#") & _
        " AND " & Format(enddt,"\#yyyy-m-d\#")
    Debug.Print strSelect '<- inspect this in Immediate window; Ctrl+g will take you there
    

    然后你可以使用 strSelectobjectrecordset.Open

    但是,由于您的目标是删除这些行,因此您实际上并不需要记录集。您可以简单地执行 DELETE 语句。

    DELETE FROM TEMP_DATE_RANGE
    WHERE START_DATE BETWEEN #2015-1-1# AND #2015-10-30#
    

    【讨论】:

      【解决方案3】:

      在 SQL 中,你不写:

      where a < 8 and > 7
      

      你写:

      where a < 8 and a > 7
      

      因此,您需要修复 where 子句:

      objectrecordset.ActiveConnection = CurrentProject.Connection
       Call objectrecordset.Open("select START_DATE 
       from TEMP_DATE_RANGE where START_DATE IS >= "
       & begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic)
      -----------------^
      

      可能还有其他问题,但这在 SQL 中是显而易见的。

      【讨论】:

        【解决方案4】:

        您可能需要在查询字符串中的日期周围插入一些单引号。像这样:

        Call objectrecordset.Open("select START_DATE from TEMP_DATE_RANGE where START_DATE BETWEEN '"  & begdt & "' AND '" & enddt & "'", , , adLockBatchOptimistic)
        

        **** 我编辑了这个以将 is >= 替换为 between 语句

        【讨论】:

          【解决方案5】:

          您的日期比较语法有点不对劲,删除 IS &gt;= 中的 IS 并记住添加 START_DATE &lt;= 而不仅仅是 &lt;=

          修正后变成:

          Call objectrecordset.Open("select START_DATE 
           from TEMP_DATE_RANGE where START_DATE >= "
          & begdt & " AND START_DATE <= " & enddt, , , adLockBatchOptimistic)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-03-29
            • 2011-03-08
            • 2011-10-05
            • 1970-01-01
            • 2013-07-24
            • 2017-07-21
            • 1970-01-01
            • 2020-06-23
            相关资源
            最近更新 更多