MS Access - 打开一个表单,从前一个表单中获取字段值

时间:2009-04-06 22:16:01

标签: database ms-access vba

我在MS Access数据库中有一个表格,其中列出了为新电力线路咨询的所有土地所有者。在每一行的末尾是一个按钮,打开另一个表格,显示所有咨询,提供等的详细信息。

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

我想说 [detailsForm]![contactID] = [土地所有者]![ID] 在vb和访问将满意的方式。然后我可以看看我是否在正确的轨道上,如果它真的有效!我上面的内容实际上并不起作用。它不会编译。

来自Kaliana

4 个答案:

答案 0 :(得分:7)

如果您希望打开一个表单到新记录并在那里设置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
从调用表单打开的表单上的

答案 1 :(得分:3)

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

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

这假设联系人ID是数字,不需要任何引号。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

使用open args是普遍接受的解决方案,正如其他人所暗示的那样。这只属于“For you edification”的类别:)使用open args的一个问题是,除非你小心你的评论,否则很容易忘记它们应该是什么意思。你经过不止一个人吗?哪个是哪个?我怎么在这里做的?我是怎么在那里做的等等。对于我自己的钱,我标准化了这个(下面)所以我总是可以毫无畏惧地传递多个参数,当我从现在起一年后查看我的代码时,我仍然可以看到什么是没有的一个巨大的麻烦:

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