首页 > 解决方案 > MS Access 一个表单以选择表值并用于填充其他表单上的多个字段?

问题描述

我有一个名为 GL_Account 和 IM_Productline 的表 IM_Productline 表有各种字段,需要用字段 GL_Account.AccountKey 中的值填充(即 IM_ProductLine.InventoryAcctkey 和 IM_ProductLine.CostOfGoodsSoldAcctKey)

为了填充 IM_ProductLine 表,我制作了一个包含所有字段的“产品线维护”表单。为了填充字段 IM_ProductLine.InventoryAcctkey,我在字段后面放置了一个(放大镜)按钮,代码如下:

Private Sub CMD_Select_GL_Account_Click()
Me.Refresh
If IsNull(Select_ProductType) Then
'do nothing
Else
    Forms![Product Line Maintenance].InventoryAcctkey = Me.SelectGLAccountKey.Column(0)
    Forms![Product Line Maintenance].Refresh
End If
    DoCmd.Close
    
End Sub

因此,该按钮会打开一个名为“Select GL Account”的表单,其中包含一个组合框,可以选择 GL_Account.AccountKey、GL_Account.Account、GL_Account.AccountDesc FROM GL_Account;当单击 OK 按钮时,它将 GL_Account.AccountKey 中的值写入 IM_ProductLine.InventoryAcctkey,关闭“选择 GL 帐户”表单,然后刷新“产品线维护”表单,以便用户可以看到帐号和描述。

这一切都很好,但这是我的问题:

现在,与其为我需要填充的每个帐户字段创建一个新表格(即“选择库存 GL 帐户”选择“已售商品成本 GL 帐户”等),我更愿意使用“选择 GL 帐户”表格来选择和填充 11 个不同的帐户字段。因此,在“产品线维护”表单上的每个 xxxAcctkeyfield 后面是一个(放大镜)按钮,单击该按钮时会弹出“选择 GL 帐户”表单,单击“确定”时会将选定的 AccountKey 写入表单“产品”上的正确字段线路维护”?

我非常感谢任何人努力理解我试图解释的内容并为我指明正确的方向。

标签: vbaformsms-accesspopulate

解决方案


好的,有一个问题是所有 11 个字段都不需要“复制”,因为您有一个关系数据库(您只会在当前报告中存储该选择的行 PK ID。(所谓的 FK(外键)值)。那样的话,假设你想改变选择?那么你可以弹出那个表单 - 搜索 + 选择包含所有信息的一条记录,然后在返回时只存储一个值。

因此,我会对上述内容提出一些想法 - 您想利用关系数据库功能。因此,您不需要“复制”所有这些数据。这与创建发票没什么不同。我可以创建新发票,但所有地址信息,以及这张发票所属的客户?好吧,那是一列具有指向客户的 FK 值。一旦我选择了一个客户,那么客户姓名+地址的显示就可以说是一个子表格或类似的表格 - 但不需要“复制”该信息。这也意味着使用接近零的代码,您可以在客户之间移动发票!!!- (只需将一个 fk 列更改为新的/不同的客户 ID (PK) 值。

现在,回到手头的问题?

你当然可以弹出一个表单,让用户选择、输入、挑选和做任何事情。然后你可以让调用代码抓取+从该表单中挑选出值。

你这样做的方式?它涉及一个不太广为人知的技巧。

调用表单的代码可以简单地将该表单作为对话表单打开。这将暂停调用代码,用户执行任何操作,完成后调用代码将继续。调用代码不仅会继续,而且它可以从弹出的表单中获取/抓取/拉取/获取任何值,而无需使用全局变量。

因此,该方法是:

dim strF    as string
strF = "frmPopAskInfo"
docmd.OpenForm strF,,,,,,acDialog

' above code waits for user input
if application.AllForms(strF).IsLoaded = true then
   ' user did not cancel, get values from form
   me!AccountNo = forms(strf)!AccountNumber
   etc. etc. etc.
   docmd.Close acForm,strF
end if

现在唯一的其他问题?好吧,弹出窗口上的“确定”按钮不会关闭表单,它的作用是设置可见 = False。这将使表单退出对话模式。

me.Visible = False

因此,如果用户点击取消按钮(关闭表单)或点击右上方的 X(关闭表单),那么当您的调用代码继续时,表单将不会被加载。但是,如果他们点击 OK 按钮,那么您不会关闭表单,而只需设置 visbile = false。这允许调用代码继续,您可以自由地从该表单获取/获取/获取值,然后一旦完成,您关闭表单。

因此,该弹出窗口中的表单关闭=用户取消了该表单。

那么,弹出式表单,甚至是模态表单?他们不会停止 VBA 调用代码,但 acDialog 表单会!

因此,您可以放置​​ 2 或 5 个弹出此表单的小按钮,用户可以选择/选择/选择/输入值。当他们点击确定时,您的调用代码将继续,您可以自由地从该表单中提取值。因此,虽然所有 3-4 个按钮都可能会弹出该表单,但表单的每个单独按钮启动都可以有代码跟随并更新放置在旁边的弹出按钮的给定控件。


推荐阅读