首页 文章

如何在Microsoft Access中通过VBA设置INSERT SQL查询的参数值?

提问于
浏览
5

我是Access的新手,我来自C#,SQL Server和.Net . 有一个项目来了我的方式,我必须完成一些部分 .

该场景可以描述为:

  • 带有子表单的Access表单

  • 作为上述子表单的数据源的Access查询,带有两个参数,显示为: Parametername1 String(255),Parametername2 String(255) .

  • VBA代码模块

我的计划是在我的VBA代码模块中的过程中设置上述查询参数的值 . 我相信这应该刷新我的子表单,因为查询是子表单的数据源 .

问题是我不知道如何实施这个计划 .

我想使用查询,因为我不想使用内联SQL搞乱我的VBA代码 .

我正在使用Access 2010 .

4 回答

  • 0

    我有这个问题,我想使用相同的'存储'更新查询,但是从两种不同的形式执行它,所以想在运行时将参数传递给查询 . 这就是我发现的(在另一个论坛中),它完全符合我的要求:

    With CurrentDb.QueryDefs("qry_YourQuery")
       .Parameters("yourParam") = yourVBAvar
       .Execute
    End With
    
  • 6

    子表单的重点是它由记录源和链接子字段和主字段控制 . 我们说表单是Company,子表单是Employees,子表单的记录源可能是:

    SELECT EmployeeID, CompanyID, Position, Etc FROM Employees
    

    链接子字段和主字段将是CompanyID . 当您浏览主表单时,仅显示与当前公司相关的那些记录 . 我们假设您只想显示处于技术位置的员工,您可以在运行时更改记录源:

    SELECT EmployeeID, CompanyID, Position, Etc FROM Employees
    WHERE Position = "Technical"
    

    或者,如果这始终是表单上的过滤器,请将组合框添加到主表单中,并将其用作第二个链接主字段,这样您就可以:

    Link Master Fields:  CompanyID; cboPosition
    Link Child Fields :  CompanyID; Position
    

    最后,您只需从主窗体设置过滤器属性:

    Me.Employees_subform.Form.Filter = "Position=""Tecnical"""
    Me.Employees_subform.Form.FilterOn = True
    

    如果这不是您的想法,请在您的问题中添加一些注释 .

    EDIT

    您可以通过引用表单上的控件为查询提供参数:

    SELECT EmployeeID, CompanyID, Position, Etc FROM Employees
    WHERE Position = Forms!MyMainForm!cboPosition
    

    您可以完全更改查询的SQL并且可以使用ADO,但是,更改SQL类似于设置记录源,因为SQL在代码中已更改,并且使用ADO通常不是表单的最佳选择 .

    你不能做的是改变一个参数,让它“坚持”一个表格或子表格 .

    例如:

    DoCmd.SetParameter "@SomeID", "1"
    ' This works
    DoCmd.OpenQuery ("Queryx")
    
    ' This will give a prompt for @SomeID and then run
    Me.SomeSubform.Form.RecordSource = "Queryx"
    
  • 2

    您可以在表单的记录源查询中创建一个函数并使用该函数(而不是常规参数) .

    Public Function PositionParam(Optional ByVal P1 As Variant) As Variant
        Static varP As Variant
    
        If Not IsMissing(P1) Then
            If IsNull(P1) Then
                varP = Null
            Else
                varP = CStr(P1)
            End If
        ElseIf VarType(varP) = vbEmpty Then
            varP = Null
        End If
        PositionParam = varP
    End Function
    

    记录源查询:

    SELECT y.id_fld, y.another_fld, y.position_fld
    FROM YourTable AS y
    WHERE
           y.position_fld = PositionParam()
        OR PositionParam() Is Null
    ORDER BY y.id_fld, y.another_fld;
    

    稍后,如果要在子窗体中显示不同的行集,请更改分配给 PositionParam()Requery 子窗体的值 .

    PositionParam "technician"
    Forms("YourForm").Requery
    
  • 1

    子表单绑定到查询,该查询根本不应包含任何参数 .

    您当然可以将子表单的SQL存储在查询中,这样就可以消除内联的sql,然后转而编写WHACKS代码来解决这个问题根本就没有意义吗?

    如上所述,子表单重新编码的过滤和显示是自动的,如果您从控件设置子主链接和子设置,则无代码 . 你可能在这里不需要任何代码 .

    但是,如果由于某些真正的原因您需要编写代码或想要更多的计费时间,那么您可以使用此代码:

    Dim strSql     As String
    
    strSql = Split(CurrentDb.QueryDefs("name of query").SQL, ";")(0)
    
    strSql = strSql & "where Field1 = " & "'your p1 value'" & _
                      " and Field2 = " & "' your p2 value'"
    
    Me.custChild.Form.RecordSource = strSql
    

    因此,您不需要sql中的任何参数,只需使用子表单所基于的CURRENT和SAME查询 . 此外,如果您添加参数,那么您正在对查询中的2个值进行硬编码,然后查询不能用于其他代码和任务,除非您提供2个SAME硬编码参数(因此这在其他地方使用该查询时几乎没有任何灵活性)有不同的选择) .

    因此,请将参数保留在查询之外,并将相同的金钱和时间以及可计费小时数保留下来 .

    按上述方式提取查询SQL并向SQL添加条件是一件简单的事情 . 但是,如果要将数据插入子表单,则可以直接使用子表单数据源和reocrdset . 例如:

    Dim rst     As DAO.Recordset
    
      Set rst = Me.custChild.Form.RecordsetClone
    
      rst.AddNew
      rst!SomeField = "some valjue"
      rst!SomeField2 = "some value"
      rst.Update
    
      Me.custChild.Requery
    

相关问题