MS ACCESS:表单和子表单完全链接?或表单和未绑定的连续子表单?

问题描述

我正在尝试设计一个名为“主采购订单”的采购订单表单,其中包含一个名为 POContent 的连续子表单。为此,我使用了 2 个名为 tblMasterPO 和 tblPOsContent 的表。这是它的屏幕截图:

Screenshot

关键点是主采购订单表单是一个拆分视图,顶部是数据表视图,底部是文本框和组合框的组合。 “PO Content”子表单是Master PO表单下部的连续表单。

在我的公司,我们试图记录我们对采购订单所做的每一次更改以供将来分析,因此需要一个 PO 修订号。这个想法是每次我们对主 PO 或 PO 内容进行更改时,当用户单击“保存/更新 PO”按钮时,我将使用(大量)VBA 代码使用更新后的数据创建一个新记录.表单/子表单组合并不是真正调用它的最佳方式,因为它实际上应该是 2 个完全链接的表(如果 PO 内容发生变化,那么主 PO 也将使用新的 ID# 进行更新)。

我有多个问题要达到使此表单有效的目标:

  • 确保我可以自由切换到表单和子表单字段的最佳方法/实践是什么?例如,同时弄脏两个表?或者有一个未绑定的连续子表单?还是临时表?
  • 如果我使用未绑定的连续子表单,在向采购订单添加新项目时如何让用户添加行?例如,我希望用户单击数据表表单以查看 PO,然后将填充未绑定子表单中的 PO 内容项。但是,当用户单击“新建采购订单”按钮时,他将在任何主采购订单和采购订单内容字段中都没有数据,因此用户可以在表单和子表单中添加项目,最后通过单击“保存所有内容”保存/更新采购订单”按钮。

您有什么提示或想法可以使这项工作适用于访问吗?

我知道会有很多 VBA,但我很期待;我只是想从有经验的访问程序员那里找到解决方法/解决方案!

谢谢!

编辑 1:

基本上,在创建 PO 时,工作流程是首先添加一般信息,例如创建 PO 的人、日期、与什么项目相关等;这些转到“主采购订单”表。然后,您要实际向此采购订单添加项目,因此您有多行(例如,您需要 1x 包螺丝,然后是 2x 包螺母等)。完成采购订单后,您最终可以使用“保存/更新采购订单”按钮保存它,这会将所有内容保存在专用表中。

如果我开始向子表单添加项目,父表单确实会自动更新,但这是我在子表单中添加部件时尝试“暂停”的内容。 “最简单的”可能是将两个表结合起来,但是如果我必须为每个“PO 内容”行保存相同的一般信息(意味着每次我向采购订单添加一个项目,我会保存供应商、用户名、订购日期...);对于我订购的每个项目、每个修订版、每个采购订单,我的表格中都会有大约 100 多列!

设置标志或公共变量是我研究的内容,但我不确定如何在将项目添加到子表单时停止主表单的输入。

弄脏父文件也是我想到的;但这意味着在创建 PO 时我们将有 2 个“一般数据”实例,因为您将首先将项目添加到主 PO 字段中,然后移至 PO 内容子表单,该子表单将自动将主 PO 数据保存在一个 ID 下#.然后,当实际向子表单添加项目时,它们会重新污染父表单,为相同的数据创建另一个 ID#;

我们可以同时合并两个条目吗?某种 2 表完整链接,因为一个不存在没有另一个

解决方法

我不确定需要多少 VBA。 父表(父窗体)的保存在 Access 中是自动的。当您将焦点更改为子表单时,父表单记录将被保存(这种方式确实很好)。

对于子表单中的更改/修改,您需要更新父表单的采购订单号吗?

好吧,除非您对该行进行了更改,否则子表单中的 before change 事件不会触发。所以你可以去:

me.Parent.form!PONum = "some new number".

但是,不清楚您是只想对子表单中的多个更改进行一次更改,还是希望在一次给定的“多次”更改中执行此操作?

我敢打赌,即使您更改了多个子表单行,此新 PO 更新也只会发生一次。所以,这可能是一个挑战。在这种情况下,我可能会在子表单(公共变量 - 代码模块的开始)中设置一个表单级别标志。因此,一旦任何之前的更改事件触发,它就可以设置这个标志,表示一个或多个记录已被更改。因此,此时,那么我们需要一个“时间点”,在这个时间点我们更新父表单作为其中一行或几行被更改的结果。注意父表单可以查看,get/grab/test/看看子表单中的“标志”是否显示更改。那么,问题是用户在完成后如何“行动”?因为他们可能决定在该子表单中需要更多的更改 - 并做一些更多编辑。但是,如前所述,这仅意味着我们的子表单更改标志仍将显示为 true。

那么,关键问题就变成了在什么时间点以及我们如何决定它们完成?一旦我们确定了这一点(也许是关闭表单???),那么我们就有了一个时间点,我们知道子表单行(1 行或多行)已被更改。因此,当我们离开该记录或关闭表单时,我们需要在主表单中检查这个已更改的标志。

在这种情况下我会做的实际上是确保用于编辑的子记录会导致主记录变脏。这样无论用户如何离开当前的主记录,before change 事件都会触发,并且在那个时间点你可以检查子表单是否有更改(使用该标志)。因此,此时您可以更新新的采购订单编号,并将记录复制到更改历史记录中。 (应该只有几行 VBA - 2-3 个插入?

编辑: 好吧,当然紧迫的问题之一是如何完成整个事情,但没有必要保存它。好吧,使用绑定表单,我们节省了大量代码。但是,我们如何处理一些可能没有完成、没有必要完成、可能需要更多编辑的事情,然后我们就完成了?

好吧,毫无疑问,最终用户并不关心关系数据库理论,当他们看到表单时,他们只会想到“保存”。但是,当我们引入相关数据(例如子表单)时,访问并不是这样工作的。 但是,我们无法将主窗体(表)和子窗体(表)包装在一个事务概念中。您可以在其他系统中执行此操作,但话又说回来,他们使用的是断开连接的记录集,并且不会像我们在 Access 中那样在编写用于编辑的代码中节省大量成本。

例如,我有一个收集捐款的系统。问题在于,在输入数据时,您必须输入所有捐款。就像经典的 Quickbooks 屏幕一样,您可以输入 100 美元,但必须将该金额拆分为多个帐户。而且我不允许保存数据,除非拆分金额与主要记录捐赠金额相匹配。但是,既然我们没有 ahve 那个是表单 + 子表单的结果的“保存”?

好吧,我介绍了他们过去的所作所为! - (批量处理)。所以,我允许用户为一个事件输入许多 dontaitons。他们可以对每个金额的账户进行拆分。他们可以编辑,可以添加,可以改变主意——走开,去喝咖啡,然后回来再编辑一些。但我添加了一个 POST 作业按钮。所以,在他们输入数据后,1 次捐赠,也许 20 次,当他们点击发布完成他们的工作时,我然后检查拆分金额是否与捐赠金额匹配。如果他们不这样做,那么我不允许他们发帖。但是,该帖子不是一些大型计算机运行的帖子数据。它只是主要后期运行中的一个字段。因此,除非金额匹配,否则您无法发布。一旦他们发布了,我就不允许他们编辑或更改该数据。画面如下:

enter image description here

那么,在顶部?这就是事件(日期、时间、附加信息)。它还具有批处理运行和psoting状态。左边是人+捐赠金额,右边是给定金额的拆分。 (如果拆分的金额与捐赠金额相匹配,则总框会变为绿色。但我仍然允许他们继续工作 - 即使金额不匹配。但直到设置了发布标志?然后我不包括那个报告和系统中的数据。因此,发布不会移动记录或任何内容-但我只更改所有记录所属的一个批次标志。并且我将该发布的标志包含在提取该数据的 quiers 中-如果没有发布标志,那么在发布批处理运行之前,该 rocord 不被视为有效!一旦发布,他们就无法编辑该数据。

在你的情况下,你可以有一个编辑按钮。在他们点击编辑之前,您不允许对表单 + 子表单进行任何编辑。一旦他们这样做了,你就翻转允许编辑 = true,然后他们就可以自由编辑主 + 子表单。但只有他们有按钮“完成”编辑(这可能与编辑按钮相同 - 你隐藏一个显示另一个)。这样,您就有了一个工作周期,他们开始编辑,并且必须点击完成编辑。完成后。您甚至可以在他们离开或关闭表单时提示是否发布。