【发布时间】:2015-06-25 19:51:51
【问题描述】:
我有一个表单,用户从组合框中选择供应商的名称,其目录文件将被导入。然后,组合框选择驱动查询以创建一个单记录记录集 (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 (parm1) 查询2(parm1、parm4、parm8、parm11) 查询 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
【问题讨论】:
-
因此,一旦您确定要为特定供应商运行哪些查询,您必须为这些查询所需的任何参数提供值。当前供应商的参数值在
rsProfile记录集中可用,对吗?如何将一个rsProfile值与查询参数匹配? -
你的结论是正确的。你的问题也是非常正确的问题。我希望将 DLookup 编码到需要参数的每个字段的存储查询中,从而消除具有参数的必要性。经过进一步思考,如果我只有一个参数来标识唯一的 vendorID,那么 DLookups 可能会起作用,而不管查询中需要的配置文件变量的实际数量是多少?
-
因此,如果您的查询包含
DLookup表达式作为查询参数的替代品,则修改后的查询将包含不超过一个实际参数(对于供应商)。那么你就不需要rsProfile记录集了。剩下的挑战是确定供应商查询集中的每个查询是否需要您为供应商参数提供一个值。这一切都正确吗? (我担心我会迷失在这里的细节。) -
您已经完全掌握了这个想法。我认为您建议 rsProfile 记录集是多余且不必要的是正确的。我尝试将其用作查找源没有成功,但 Access 不喜欢它。如果我为查找源引用一个实际的表(tblVendorProfile)......它可能不会那么犹豫。
-
我认为任何一种方式都可以。决定哪种方法对您(和您的同事?)来说似乎更容易......最初更容易创建,然后更容易理解/扩展/故障排除/维护。
标签: vba ms-access parameterized-query