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

问题描述 投票:0回答:1

我有一个表单,用户可以从组合框中选择供应商的名称,该供应商的目录文件将被导入。然后,组合框选择驱动一个查询来创建一个单记录记录集 (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 次不同的更新查询。

简化示例: Vendor1 文件需要使用查询 1、2 和 5 进行处理。Vendor2 文件可能只需要更新查询 2 和 4。这些查询的参数可能如下:

查询1(参数1) 查询2(参数1、参数4、参数8、参数11) 查询4(parm5、parm6、parm7、parm8、parm9、parm10、parm11) query5 () - 不需要参数

这是核心查询处理,仅循环与当前供应商文件相关的查询。 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
vba ms-access parameterized-query
1个回答
0
投票

您可以使用语法设置预定义查询的参数;

Set qdf = CurrentDB.QueryDefs(QueryName)
qdf.Parameters(ParameterName) = MyValue

要向查询添加参数,请在 sql 中的 SELECT 语句之前添加以下内容

PARAMETERS [ParameterOne] DataType, [ParameterTwo] DataType;
SELECT * FROM tblTest;
© www.soinside.com 2019 - 2024. All rights reserved.