尝试使用VBA在Access中编写查询

时间:2015-07-15 20:37:07

标签: vba ms-access

我在Access VBA中使用以下语法导致类型不匹配。我正在尝试更新名为" Billing"通过查看任何记录是否有一个日期来查看我的" Certs"中的字符串值。表格" 2012-07-01"对应于我的表格的billYear文本框,例如2012年和我的billMonth文本框,例如07.有没有更好的方法来编写VBA或看到错误 - 非常感谢:

Dim sRecert As String
Dim byear As Integer
Dim bmonth As Integer

byear = Me.billYear
bmonth = Me.billMonth

sRecert = "Update Billing set recertifying = -1 where (select     certificationExpireDate from certs where Left((certificationExpireDate),4) =  " & byear
    & " and Mid((certificationExpireDate),6,2) =  " & bmonth & ")"

DoCmd.RunSQL sRecert

我可能没解释得很好。我创建了一个从我的表单调用的真正的查询: DoCmd.OpenQuery" updateRecert"
我在下面设置我的SQL作为我正在使用的实际日期的测试。它在SQL Server(ODBC链接)中 我的dbo_certs表和我的dbo_billing表只共享一个可连接字段peopleID:

UPDATE dbo_Billing AS a INNER JOIN dbo_certs AS b ON a.peopleid = b.peopleid 
SET a.recertifying = -1
WHERE b.certificationExpireDate = '2015-08-31 00:00:00.000';

以上给出了数据不匹配错误。 我的底线是我的表单上有两个文本框,可以将数据传递到我的VBA代码中:

  • billMonth,在这种情况下是8,因为它是一个整数 一个问题
  • billYear是2015

所以如果dbo_cert的字段'certificationExpireDate'是' 2015-08-31 00:00:00.000'那么我需要用-1更新我的dbo_billing表的'重新认证'字段。但只有从形式上可以获得。

2 个答案:

答案 0 :(得分:1)

有没有更好的方法来编写VBA或看到错误?

是。您需要错误处理

我认为问题不在代码中,我认为它在SQL中。

要对代码进行故障排除,请将其包装在一个好的错误处理程序中。

Public Sub MyRoutine()

    On Error GoTo EH

    'put your code here

    GoTo FINISH

EH:

    With Err
        MsgBox "Error" & vbTab & .Number & vbCrLf _
            & "Source" & vbTab & .Source & vbCrLf & vbCrLf _
            & .Description
    End With

    'for use during debugging
    Debug.Assert 0
    GoTo FINISH
    Resume

FINISH:

    'any cleanup code here

End Sub

当msgbox显示错误时,请记下Source。这可以帮助您确定错误的来源。

调试期间使用的“后续行”很有帮助。以下是如何使用它们:

  • 执行将在Debug.Assert 0行停止
  • 将黄色箭头(确定下一行要执行的行)拖到“恢复行”
  • 点击键盘上的{F8}(或使用菜单Debug> Step Into)

这将转到发生错误的行。在您的情况下,它可能是您代码的最后一行。

答案 1 :(得分:0)

SQL中的错误......但是!!您确定certificationExpireDate 字符串 一直 等于yyyy-mm-dd图案??与你所拥有的“不确定”关系有关系是危险的。我认为这不是一个好的数据库设计。

但是,毕竟,对于你的情况:

<强> VBA:

sRecert = "UPDATE Billing a inner join certs b " & _
          "on format(a.imaginary_date_field, """yyyy-mm-dd""") = b.certificationExpireDate " & _
          "set a.recertifying = -1 " & _
          "where CInt(Left((b.certificationExpireDate),4)) =  " & byear & " and CInt(Mid((b.certificationExpireDate),6,2)) =  " & bmonth

<强> 的QueryDef:

PARAMETERS Forms!your_form!byear Short, Forms!your_form!bmonth Short;
UPDATE Billing a inner join certs b
    on format(a.imaginary_date_field, "yyyy-mm-dd") = b.certificationExpireDate
    set a.recertifying = -1
    where CInt(Left((b.certificationExpireDate),4)) = Forms!your_form!byear and CInt(Mid((b.certificationExpireDate),6,2)) = Forms!your_form!bmonth

<强> 已更新

  

不匹配错误

您可能会收到错误,因为您有日期/时间字段,而不是字符串。 MS Access查询中的日期使用#符号进行写入。 WHERE b.certificationExpireDate = #2015-08-31 00:00:00.000#;

在你的情况下:

PARAMETERS Forms!your_form!byear Short, Forms!your_form!bmonth Short;
UPDATE dbo_Billing AS a INNER JOIN dbo_certs AS b ON a.peopleid = b.peopleid 
SET a.recertifying = -1
WHERE year(b.certificationExpireDate) = Forms!your_form!byear and Month(b.certificationExpireDate) = Forms!your_form!bmonth;

有关详情,请按this链接