2015-09-25 125 views
0

我想打开基于查询的记录集。该查询具有10个与表单匹配的参数。这些参数有点复杂,因为它们正在搜索部分字符串匹配。问题定义Querydef参数,运行时错误13类型不匹配

我遇到了多个问题,它似乎访问不会让我打开一个记录集基于查询从表单拉参数。相反,我现在试图打开一个querydef并将其传递给记录集。我现在尝试运行该函数时出现运行时错误13类型不匹配。有没有更好的方法来做我想做的事情?有没有人有任何解决这个错误的见解?错误是突出显示第一个参数(出口国),但如果这是一个问题,我相信他们都是。谢谢!

*修改,试图通过记录传递条件参数,而不是

Function StatementUpdate() 

Dim dbs As DAO.Database 
Dim rstStatements As DAO.Recordset 
Dim rstCBG As DAO.Recordset 
Dim concStatement As String 
Dim strSQL As Variant 


Set dbs = CurrentDb() 
strSQL = "SELECT [Statement] FROM [St_Gen_Qry] WHERE" _ 
    & " (([Statement Category]='General Information')" _ 
    & " And ([Export Country] Like '*" & Forms!New_Shipment_Home_frm.[Export Country] & "*'" _ 
    & " Or [Export Country]='All')" _ 
    & " And ([Export State] Like '*" & Forms!New_Shipment_Home_frm.[Export State] & "*'" _ 
    & " Or [Export State]='All')" _ 
    & " And ([Import Country] Like '*" & Forms!New_Shipment_Home_frm.[Import Country] & "*'" _ 
    & " Or [Import Country]='All')" _ 
    & " And ([Import State] Like '*" & Forms!New_Shipment_Home_frm.[Import State] & "*'" _ 
    & " Or [Import State]='All')" _ 
    & " And ([Shipment Type] Like '*" & Forms!New_Shipment_Home_frm.[Shipment Type] & "*'" _ 
    & " Or [Shipment Type]='All')" _ 
    & " And ([Material Category] Like '*" & Forms!New_Shipment_Home_frm.[Material Category] & "*'" _ 
    & " Or [Material Category]='All')" _ 
    & " And ([Sub Category] Like '*" & Forms!New_Shipment_Home_frm.[Sub Category] & "*'" _ 
    & " Or [Sub Category]='All')" _ 
    & " And ([Transgenic/ Conventional] Like '*" & Forms!New_Shipment_Home_frm.RegCode & "*'" _ 
    & " Or [Transgenic/ Conventional]='All')" _ 
    & " And ([Intended Use] Like '*" & Forms!New_Shipment_Home_frm.[Intended Use] & "*'" _ 
    & " Or [Intended Use]='All')" _ 
    & " And ([Permit] Like '*" & Forms!New_Shipment_Home_frm.[Permit Required] & "*'" _ 
    & " Or [Permit]='All')" _ 
    & " And ([Active]='Yes'));" 

Set rstStatements = dbs.OpenRecordset(strSQL, dbOpenDynaset) 
Set rstCBG = dbs.OpenRecordset("SELECT Cross_Border_Grid_Table.ID, Cross_Border_Grid_Table.St_General FROM Cross_Border_Grid_Table WHERE (Cross_Border_Grid_Table.ID)= " & [Forms]![New_Shipment_Home_frm]![Text105]) 


rstCBG.MoveFirst 

'loop through each record in the CBG that matches select query 
Do Until rstCBG.EOF 
    concStatement = "" 
    rstStatements.MoveFirst 
    Do Until rstStatements.EOF 
     concStatement = concStatement & vbCrLf & rstStatements(0) & vbCrLf 
     rstStatements.MoveNext 
    Loop 
     rstCBG.Edit 
     rstCBG![St_General] = concStatement 
     rstCBG.Update 
     rstCBG.MoveNext 
     Loop 

rstCBG.Close 
rstStatements.Close 

Set rstStatements = Nothing 
Set rstCBG = Nothing 
Set dbs = Nothing 

Debug.Print "Done" 

End Function 

回答

0

你的主要问题是你想传递一个QueryDef参数的条件表达式。因此,每个参数语句中的第一个OR必须是字符串的一部分,您将其作为VBA运算符外部使用。其次,您需要使用LIKE *子句按字符串模式进行搜索。然后,您可能需要用单引号包装表单值。也许这是可能的,但querydef参数通常采用单个值,而不是条件表达式。

虽这么说,你可以在VBA记录(顺便说一句类似于其他记录)与动态条件表达式绝对传递表单值:

strSQL = "SELECT [Statement] FROM [St_Gen_Qry] WHERE" _ 
     & " (([Statement Category]='General Information')" _ 
     & " And ([Export Country] Like '*" & Forms!New_Shipment_Home_frm.[Export Country] & "*'" _ 
     & " Or [Export Country]='All')" _ 
     & " And ([Export State] Like '*" & Forms!New_Shipment_Home_frm.[Export State] & "*'" _ 
     & " Or [Export State]='All')" _ 
     & " And ([Import Country] Like '*" & Forms!New_Shipment_Home_frm.[Import Country] & "*'" _ 
     & " Or [Import Country]='All')" _ 
     & " And ([Import State] Like '*" & Forms!New_Shipment_Home_frm.[Import State] & "*'" _ 
     & " Or [Import State]='All')" _ 
     & " And ([Shipment Type] Like '*" & Forms!New_Shipment_Home_frm.[Shipment Type] & "'*" _ 
     & " Or [Shipment Type]='All')" _ 
     & " And ([Material Category] Like '*" & Forms!New_Shipment_Home_frm.[Material Category] & "*'" _ 
     & " Or [Material Category]='All')" _ 
     & " And ([Sub Category] Like '*" & Forms!New_Shipment_Home_frm.[Sub Category] & "*'" _ 
     & " Or [Sub Category]='All')" _ 
     & " And ([Transgenic/ Conventional] Like '*" & Forms!New_Shipment_Home_frm.RegCode & "*'" _ 
     & " Or [Transgenic/ Conventional] ='All')" _ 
     & " And ([Intended Use] Like '*" & Forms!New_Shipment_Home_frm.[Intended Use] & "*'" _ 
     & " Or [Intended Use]='All')" _ 
     & " And ([Permit Like '*" & Forms!New_Shipment_Home_frm.[Permit Required] & "*'" _ 
     & " Or Permit='All') And (Active='Yes'))" 

Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset) 
+0

谢谢你的建议!我仍然在strSQL上遇到类型不匹配的情况。这是代码的修改部分。 – MDeck

+0

请勿将'LIKE'语句包装在圆括号中,并且必须在表单值和通配符星号('*')周围包含单引号。当你在VBA字符串中断行时,还要确保在'WHERE','AND'和'OR'后加空格。看到我的编辑.. – Parfait

+0

谢谢!我觉得我非常接近。我仍然得到一个运行时间3075的错误,说在strSQL中有一个缺少的操作符,但是我会梳理一下,看看我能否弄清楚。 – MDeck