首页 > 解决方案 > MS ACCESS:表格和子表格完全链接?还是表格和未绑定的连续子表格?

问题描述

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

截屏

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

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

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

您有什么提示或想法可以使这项工作在访问中发挥作用吗?

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

谢谢!

编辑1:

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

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

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

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

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

标签: sqlformsms-accessunboundcontinuous-forms

解决方案


我不确定需要多少 VBA。父表(父窗体)的保存在 Access 中是自动的。在您将焦点更改为子表单的那一刻,父表单记录被保存(并且它真的很好,它以这种方式工作)。

至于子表格中的更改/修改,您需要更新父母表格的订单号吗?

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

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

但是,不清楚您是否只想对子表单中的多个更改进行一次更改,或者您想在一次给定的情况下对“许多”更改执行此操作?

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

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

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

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

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

例如,我有一个募捐系统。问题是在数据输入期间,您必须输入所有捐赠。就像经典的快速书屏幕一样,您会输入 100 美元,但随后必须将该金额分成多个帐户。而且我不允许保存数据,除非拆分金额与主要记录捐赠金额相匹配。但是,既然我们没有“保存”,那就是表单+子表单的结果?

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

在此处输入图像描述

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

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


推荐阅读