【问题标题】:MS Access - open a form taking a field value from a previous formMS Access - 打开一个从前一个表单中获取字段值的表单
【发布时间】:2010-10-17 22:21:35
【问题描述】:

我在 MS Access 数据库中有一个表格,其中列出了为新电线咨询过的所有土地所有者。在每一行的末尾有一个按钮,可以打开另一个表单,显示所有咨询、报价等的详细信息。

我正在尝试在MS Access中使用vb获取contactID并自动将其放入详细信息表单中的字段中,以便自动弹出土地所有者的咨询详细信息。我根本不是一个 vb 程序员(我有一个 comp sci 学位,主要是 Java,我目前是一名 GIS 分析师,但它是一家小公司,所以我被要求让一个 Access 数据库工作)。

我想说 [detailsForm]![contactID] = [landownerlist]![ID] 以 vb 和 access 会满意的方式。然后我可以看看我是否走在正确的轨道上以及它是否真的有效!我上面的内容实际上不起作用。它不会编译。

来自卡利亚娜

【问题讨论】:

    标签: database ms-access vba


    【解决方案1】:

    如果你想打开一个新记录的表单并在那里设置 ID,你可以使用 Openargs,Openform 的一个参数:

    DoCmd.OpenForm "FormName",,,,acFormAdd,,Me.ID
    

    打开的表单还需要一些代码:

    If Me.Openargs<>vbNullstring Then
       Me.Id = Me.Openargs
    End If
    

    也可以找到:

    Forms!LandownersList.Recordset.FindFirst "ID=" & Me.ID
    

    或填写一个值:

    Forms!LandownersList!Id = Me.ID
    

    在从调用表单打开的表单上。

    【讨论】:

      【解决方案2】:

      您可能需要查看这些按钮背后的代码。如果您使用的是 docmd.openform,您可以在打开下一个表单时将第四个设置设置为 where 子句。

      DoCmd.OpenForm "OpenFormName", acNormal, , "[contactID] = " _
          & [detailsForm]![contactID] , acFormEdit, acWindowNormal
      

      这假定联系人 ID 是数字并且不需要任何引号。

      【讨论】:

        【解决方案3】:

        正如其他人所提到的,使用开放参数是普遍接受的解决方案。这只是属于“为您启迪”的类别:) 使用开放参数的问题之一是,除非您小心使用 cmets,否则很容易忘记它们的含义。你通过的不止一个吗?哪个是哪个?我是怎么在这里做的?我是怎么做到的等等。为了我自己的钱,我标准化了这个(如下),所以我总是可以毫无畏惧地传递多个论点,而且当我一年后审查我的代码时,我仍然可以看到没有什么是什么一个巨大的麻烦:

        Option Explicit
        
        'Example use: DoCmd.OpenForm "Example", OpenArgs:="Some Filter|True"
        
        Public Enum eForm1Args
            eFilter = 0
            eIsSpecial = 1
        End Enum
        
        Private m_strArgs() As String
        
        Public Property Get Args(ByVal eForm1Args As eForm1Args) As String
            Args = m_strArgs(eForm1Args)
        End Property
        
        Private Sub Form_Open(Cancel As Integer)
            m_strArgs = Split(Nz(Me.OpenArgs, vbNullString), "|")
            If LenB(Me.Args(eFilter)) Then Me.Filter = Me.Args(eFilter)
        End Sub
        
        Private Sub Command1_Click()
            If LCase$(Me.Args(eIsSpecial)) = "true" Then
                'Do something special
            End If
        End Sub
        

        【讨论】:

        • 谢谢。我刚用过。
        • 或不使用 Open Args 打开另一个表单,就像它是一个类一样 创建一个名为 GlobalVars 的模块,其中包括以下行: Public Form_ProviderFileContents1 as Form_ProviderFileContents1 然后在要打开另一个表单的代码中使用: Set GlobalVars .Form_ProviderFileContents1 = New Form_ProviderFileContents1 ' 随意修改刚刚打开的表单。 With Form_ProviderFileContents1 .Visible = True .Controls("ProviderID") = Me.ProviderID End With 或者在被调用的表单上使用方法/预操作
        【解决方案4】:

        正如之前发布的那样,OpenArgs 非常适合这一点。我学到的一个技巧是,如果需要将多个参数作为分隔字符串(例如逗号)很容易传递,然后目标表单可以使用 Split() 函数访问这些值:

        StringArrayVariable()= Split(me.OpenArgs,",")
        Me.textbox= StringArrayVariable(0)
        Me.textbox1= StringArrayVariable(1)
        

        等等

        这是空气代码,请查看 Split() 的帮助文件。

        也可以在 OpenArgs 中传递对象,它需要一些手动内存指针操作,而且我手头没有代码,但我确信 Google 搜索会找到一些示例。但是,这种技术可能会导致一些随机崩溃。被警告!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-04
          • 2019-02-16
          • 2014-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多