Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从VBA运行参数化查询。来自记录集的参数_Vba_Ms Access_Parameterized Query - Fatal编程技术网

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

如何从VBA运行参数化查询。来自记录集的参数,vba,ms-access,parameterized-query,Vba,Ms Access,Parameterized Query,我有一个表单,用户从组合框中选择供应商的名称,其目录文件将被导入。然后,组合框选择驱动一个查询,以创建一个单记录记录集(rsProfile),其中包含从所有供应商配置文件表中查询的多个配置文件变量。然后在一系列不同的查询中使用这些变量,以将供应商独特的结构化文件重新格式化、转换和规范化为可导入系统的标准化格式 我很沮丧,因为我不知道如何构建存储的查询,这些查询将使用从概要文件记录集自动填充的一个或多个参数 这是我的rsProfile获取代码。它起作用了。请注意,intVdrProfileID是一

我有一个表单,用户从组合框中选择供应商的名称,其目录文件将被导入。然后,组合框选择驱动一个查询,以创建一个单记录记录集(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中工作,但我不能让任何东西与存储查询一起工作。我愿意接受其他建议

存储查询“QP00060C\U DirectImportTape”:

增编: 让我调整一下这个问题,使它更复杂一点。我有一个大约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) 查询5()-不需要参数

这是核心查询处理,它只循环与当前供应商文件相关的查询rssubscribp是包含此过滤查询列表的记录集(从主表查询)

' 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

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

Set qdf = CurrentDB.QueryDefs(QueryName)
qdf.Parameters(ParameterName) = MyValue
要向查询中添加参数,请在sql语句中的SELECT语句之前添加以下内容

PARAMETERS [ParameterOne] DataType, [ParameterTwo] DataType;
SELECT * FROM tblTest;

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

Set qdf = CurrentDB.QueryDefs(QueryName)
qdf.Parameters(ParameterName) = MyValue
要向查询中添加参数,请在sql语句中的SELECT语句之前添加以下内容

PARAMETERS [ParameterOne] DataType, [ParameterTwo] DataType;
SELECT * FROM tblTest;

我在帖子中添加了一些其他函数条件。当我不知道调用了哪个查询,并且使用的参数的标识和数量取决于特定的查询时,我必须考虑如何使用它。代码停在以下行:“qdf.parameters(Parm1)=intVdrProfileID”。我得到“此集合中未找到的项目”。我使用了与查询中相同的参数名称。我尝试过“Dim Parm1 as Integer”和“as Parameter”都会导致相同的错误。还尝试了不使用“Dim”语句,得到了“variable not defined”。不知道该怎么做才能修复。帮助?好的,修复了这个问题,但现在需要解决这个问题:“错误:参数太少。应为(1)”。这是代码。在“execute”语句上停止。Dim Parm1作为长集qdf=db.QueryDefs(!QueryName)qdf.Parameters(Parm1)=intVdrProfileID MsgBox(!QueryName)&“(“&qdf.Parameters(Parm1)&”)db.Execute!QueryName,DbFailonerror我在帖子中添加了一些其他函数条件。当我不知道调用的是哪个查询,并且使用的参数的标识和数量取决于特定的查询时,我必须考虑如何使用它。代码停在以下行:“qdf.parameters(Parm1)=intVdrProfileID”。我得到“此集合中未找到的项目”。我使用了与查询中相同的参数名称。我尝试过“Dim Parm1 as Integer”和“as Parameter”都会导致相同的错误。还尝试了不使用“Dim”语句,得到了“variable not defined”。不知道该怎么做才能修复。帮助?好的,修复了这个问题,但现在需要解决这个问题:“错误:参数太少。应为(1)”。这是代码。在“execute”语句上停止。Dim Parm1作为长集qdf=db.QueryDefs(!QueryName)qdf.Parameters(Parm1)=intVdrProfileID MsgBox(!QueryName)&“(“&qdf.Parameters(Parm1)&”)db.Execute!QueryName,dbFailOnErrorSo一旦确定要为特定供应商运行哪些查询,就必须为这些查询所需的任何参数提供值。当前供应商的参数值可在
rsProfile
记录集中找到,对吗?如何将一个
rsProfile
值与查询参数匹配?您的结论是正确的。你的问题也很对。我希望将DLookup编码到需要参数的每个字段的存储查询中,从而消除使用参数的必要性。经过进一步思考,如果我只有一个参数来标识唯一的vendorID,那么不管查询中需要的配置文件变量的实际数量如何,DLookups都可能工作?因此如果您的查询包括
DLookups
表达式作为查询参数的替代,修改后的查询将只包含一个实际参数(针对供应商)。这样就不需要
rsProfile
记录集了。剩下的挑战是确定供应商查询集中的每个查询是否需要您为供应商参数提供一个值。对吗?(我担心我会迷失在这里的细节中。)你已经掌握了这一点