我在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代码中:
所以如果dbo_cert的字段'certificationExpireDate'是' 2015-08-31 00:00:00.000'那么我需要用-1更新我的dbo_billing表的'重新认证'字段。但只有从形式上可以获得。
答案 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。这可以帮助您确定错误的来源。
调试期间使用的“后续行”很有帮助。以下是如何使用它们:
这将转到发生错误的行。在您的情况下,它可能是您代码的最后一行。
答案 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链接