如何从VBA运行参数化查询。来自记录集

时间:2015-06-25 19:51:52

标签: vba ms-access parameterized-query

我有一个表单,用户从组合框中选择供应商的名称,其目录文件将被导入。然后组合框选择驱动查询以创建包含从所有供应商配置文件的表中查询的多个配置文件变量的单记录记录集(rsProfile)。然后,这些变量将用于一系列不同的查询,以将供应商的独特结构化文件重新格式化,转换和规范化为可导入系统的标准化格式。

我很沮丧,我无法弄清楚如何构建我将使用一个或多个从配置文件记录集自动填充的参数的存储查询。

这是我的rsProfile收获代码。有用。请注意, intVdrProfileID 是一个全局变量集,并在其他地方使用。

Private Sub btn_Process_Click()

Dim ws As Workspace
Dim db, dbBkp As DAO.Database
Dim qdf As DAO.QueryDef
Dim rsProfile, rsSubscrip As Recordset
Dim strSQL As String
Dim strBkpDBName As String
Dim strBkpDBFullName As String

strBkpDBName = Left(strVdrImportFileName, InStr(strVdrImportFileName, ".") - 1) & "BkpDB.mdb"
strBkpDBFullName = strBkpFilePath & "\" & strBkpDBName

Set db = CurrentDb
Set ws = DBEngine.Workspaces(0)

MsgBox ("Vendor Profile ID = " & intVdrProfileID & vbCrLf & vbCrLf & "Backup file path: " & strBkpFilePath)

' Harvest Vendor Profile fields used in this sub
strSQL = "SELECT VendorID, Div, VPNPrefix, ImportTemplate, " & _
                 "VenSrcID, VenClaID, ProTyp, ProSeq, ProOrdPkg, ProOrdPkgTyp, JdeSRP4Code, " & _
                 "PriceMeth, " & _
                 "ProCost1Frml, ProCost2Frml, " & _
                 "ProAmt1Frml, ProAmt2Frml, ProAmt3Frml, ProAmt4Frml, ProAmt5Frml " & _
         "FROM tZ100_VendorProfiles " & _
         "WHERE VendorID = " & intVdrProfileID & ";"

Set qdf = db.QueryDefs("qZ140_GetProfileProcessParms")
qdf.SQL = strSQL
Set rsProfile = qdf.OpenRecordset(dbOpenSnapshot)
DoCmd.OpenQuery "qZ140_GetProfileProcessParms"
' MsgBox (qdf.SQL)

我已经使用QueryDefs在运行时重写存储的查询,尽管它有效,但它非常麻烦,并不适用于所有内容。

我希望使用DLookups将下面的示例作为存储查询。我可以在VBA中使用它,但我无法使用存储的查询。我对其他建议持开放态度。

存储查询“qP0060c_DirectImportTape”:

SELECT 
    DLookUp("[VPNPrefix]","rsProfile","[VendorID]=" & intVdrProfileID) & [PartNo] AS VenPrtId,
    Description AS Des,
    DLookup("[Jobber]","rsProfile",[VendorID=" & intVdrProfileID) AS Amt1,
INTO tP006_DirectImportTape
FROM tJ000_VendorFileIn;

附录: 让我调整问题,使其更复杂一些。我有一个大约40个查询的集合,每个查询使用不同的参数集合(或没有)。我还有一个表,其中包含每个供应商“订阅”的特定查询集。目标是建立一个数据库,非编码用户可以在其中添加新的供应商配置文件,并创建/修改将针对该供应商文件运行的特定查询集。到目前为止,我有近100家供应商,因此对每个供应商进行单独编码是不切实际的。每个供应商文件将平均受到14次不同的更新查询。

简化示例: 需要使用查询1,2和5处理Vendor1文件.Bundor2文件可能只需要更新查询2和4.这些查询的参数可能如下所示:

query1(parm1) query2(parm1,parm4,parm8,parm11) query4(parm5,parm6,parm7,parm8,parm9,parm10,parm11) query5() - 不需要parms

这是核心查询处理,仅循环查询与当前供应商文件相关的查询。 rsSubscrip 是包含此筛选查询列表的记录集(从主表中查询)。

' Run all subscribed queries
MsgBox "Ready to process query subscription list."
With rsSubscrip
    Do While Not .EOF
        db.Execute !QueryName, dbFailOnError
        .MoveNext
    Loop
    .Close
End With

1 个答案:

答案 0 :(得分:0)

您可以使用语法

设置预定义查询的参数
Set qdf = CurrentDB.QueryDefs(QueryName)
qdf.Parameters(ParameterName) = MyValue

要向查询添加参数,请在sql

中的SELECT语句之前添加以下内容
PARAMETERS [ParameterOne] DataType, [ParameterTwo] DataType;
SELECT * FROM tblTest;