首页 > 解决方案 > 在具有要加载的宏(空白)的表单中加载现有记录作为新记录

问题描述

场景:Microsoft Access 2016 中的空白表单(我们称之为表单 B),其中包含一个宏,导致表单在加载时为空白(新记录);但是,我还想实现一个按钮,该按钮会导致在不同表单(表单 A)上选择的记录加载到表单 B。

逻辑是表单 A 填充有从列表框中选择的记录。用户无法修改此记录,因为它出现在表格 A 上(控件已锁定);但是,包含记录列表的列表框是从动态搜索查询中填充的。如果用户没有找到合适的记录,用户点击一个按钮来打开表单 B,它允许用户输入一个新的记录。输入该记录后,用户现在可以使用搜索框查找新输入的记录。

如果用户选择了一条记录并注意到由于数据不正确需要编辑该记录,我想实现一个按钮,用户可以单击该按钮将Form A中的记录加载到Form B中进行编辑。

我不知道如何在 VBA 中以编程方式执行此操作,但伪代码看起来像这样:

私人子

单击edit_record_button后,将表单B设置为不加载“转到新记录”

使用表格 A 中的当前记录加载表格 B

结束子

请在下面查看我的代码:我认为 '#' 正在破坏代码(错误的属性设计):

Private Sub Command438_Click()
If Me.Dirty = True Then Me.Dirty = False
DoCmd.OpenForm "Add Escort",,,WhereCondition:="Credential # = " & Me!Credential #
End Sub

标签: vbams-access

解决方案


这样做的方法是删除将表单跳转到新记录的代码和部分,一切都很好,并准备好输入新的记录。

您使用决斗的想法和目标(添加相同的表单,或编辑现有的)当然是有道理的 - 您希望在此处对表单进行决斗。

你这样做的方式?现在,要以添加模式打开表单,请执行以下操作:

 docmd.OpenForm "frmCustomers",,,,acFormAdd

所以这将以添加模式启动表单 - 在一个新的空白记录上。

但是,要编辑现有的,比如提示用户输入客户编号

 dim strCustNo    as string
 strCustNo = Inputbox("Enter customer number")
 docmd.OpenForm "frmCustomers",,,"ID = " & strCustNo

因此,这会将表单打开到一个给定的客户编号。

或者,您可以打开表单来编辑所有记录,如下所示:

docmd.OpenForm "frmCustomers"

因此,诀窍是删除将表单跳转到新空白记录的代码和内容,然后在打开/启动您控制的表单的代码中,如果您编辑所有记录、以添加模式打开,甚至跳转到并编辑一个记录。

我还建议您在其他表的属性表中将表单循环属性设置为当前记录 - 因为如果您在表单上的最后一个控件/字段上并点击选项卡,您最终可以跳转到一个新的空白记录,并在大多数情况下你不想要这个。

你甚至可以关闭表单的允许添加属性,上面在添加模式下打开将只允许添加一条记录——这通常是一个不错的 UI 选择来折腾一个表单,让用户添加一条记录,然后他们关闭窗体。无论如何,这里的主要技巧和想法是,通过选择如何打开表单,然后您可以控制是添加记录还是编辑记录 - 加载时您不需要或在表单中有特殊代码始终跳转到新的空白记录(因此删除该代码/部分)并使用 openFrom 命令的功能控制此操作。

编辑

有人指出,上面的“ID”示例很差。是的,它是/是一些空气代码,在大多数情况下甚至会避免使用输入框。

如果您要说这样的详细信息表格:

在此处输入图像描述

甚至是显示单个记录的表单?

然后要将表单启动到一条记录,您将使用以下命令:

if  me.Dirty = true then me.Dirty = false   ' optional if editing can occur

docmd.Openfrom  "frmDetailsEdit",,,"ID = " & ME!ID

推荐阅读