代码之家  ›  专栏  ›  技术社区  ›  jim

vba-访问值集合

  •  0
  • jim  · 技术社区  · 15 年前

    我有两张准入表。frm_main和frm_sub,根据主窗体的选择有条件地显示数据。我需要为frm_sub中显示的项目编写一个select all函数。在vba中,有没有一种方法可以获取frm_sub中当前显示的ID列表?

    例如,如果我这样做

    me.controls("Svc_Tag_Dim_Tag_Num").value
    

    我得到frm_sub中一行的值,有没有方法得到所有值?

    也许我可以换个方式问。我有一个显示为列表视图的表单,在VBA中,有没有方法从特定列中获取所有值?

    2 回复  |  直到 15 年前
        1
  •  1
  •   David-W-Fenton    15 年前

    另一个选项是编写一个函数,将子窗体显示的记录集的pk连接起来。假设您的主窗体是公司,子窗体列出员工。子窗体控件的LinkMasterFields和LinkChildFields属性将为CompanyID(公司表的pk,员工表的fk)。

    因此,要获取与父级位于特定公司记录上时在子窗体中显示的相同记录集,请执行以下操作:

      Dim db As DAO.Database
      Dim strSQL As String
      Dim rst As DAO.Recordset
      Dim strEmployeeIDList As String 
    
      Set db = CurrentDB
      strSQL = "SELECT Employees.* FROM Employees WHERE CompanyID="
      strSQL = strSQL & Me!CompanyID & ";"
      Set rs = db.OpenRecordset(strSQL)
      If rs.RecordCount > 0 Then
         With rs
           .MoveFirst
           Do Until .EOF
             strEmployeeIDList = strEmployeeIDList & ", " & !CompanyID
             .MoveNext
           Loop
         End With
         strEmployeeIDList = Mid(strEmployeeIDList, 3)
      End If
      rs.Close
      Set rs = Nothing
      Set db = Nothing
    

    现在,为什么要这样做而不是浏览已经打开的记录集(即子窗体的recordsetclone)?我不知道——只是在某些情况下,您可能不希望查找绑定到特定的窗体/子窗体。您可以通过使连接的函数接受一个记录集,并将一个如上所述声明的记录集传递给它,或者将它传递给子窗体的recordsetclone来解决这个问题。在这种情况下,您可以以任何方式使用串联函数,而不必绑定到窗体/子窗体。

        2
  •  1
  •   user25095    15 年前

    如果我理解您的问题,您应该能够使用列(x)访问控件中的ID值,其中x表示控件的行源列,从0开始。例如,如果ID在0列中,宽度为0。它将被隐藏在视图中,但VBA可以将其“视为”Me.Controls.[“svc_tag_dim_tag_num”]列(0)。

    要直接从表单的类模块外部获取子表单的记录源,可以创建如下函数:

    Public Function test_get_sub_form_record_set() As String 
        Dim dbs As Database
        Dim rst As Recordset
        Dim xcat As String
        Set dbs = CurrentDb()
        Set rst = [Forms]![Your Main Form Name]![Your Sub-form Name].[Form].RecordsetClone
        If rst.RecordCount > 0 Then
            rst.MoveFirst
            xcat = rst!ID
            rst.MoveNext
            Do While Not rst.EOF
                xcat = xcat & ", " & rst!ID
            Loop
        Else
            xcat = ""
        End If
        test_get_sub_form_record_set = xcat
        rst.Close
        Set dbs = Nothing
    End Function
    

    这将包含在一个单独的模块中,当被调用时,将返回一个连接的、逗号分隔的ID列表。