【问题标题】:Best practices for editing data using forms in ms-access在 ms-access 中使用表单编辑数据的最佳实践
【发布时间】:2017-01-07 11:00:45
【问题描述】:

因此,由于需要,我开始学习访问权限,因为负责它的人已经过去了,有人不得不继续下去。 我注意到他创建的所有数据库中的一个非常糟糕的(至少是 IMO)行为:每个表单都直接绑定到一个表或保存的查询。这样,如果用户打开一个表单,他必须完成他应该做的所有步骤,因为如果他关闭表单中间过程(或计算机冻结,或类似的),实际数据将被泄露因为它会完成一半。这通常会破坏流程链中的所有内容,导致无法执行后续步骤,并迫使我直接在表中手动更正数据。

当我开始升级他的东西并开发自己的东西时,我一直在尝试学习允许仅在表单中编辑数据的方法,从而可以随时取消该过程或将更改全部保存在最后一次。

如果版本很简单,我发现我可以创建一个记录集,将相关数据复制到表单中未绑定的字段,最后,如果用户选择,将数据从表单字段复制回记录集.

其他时候需要更复杂的解决方案,因为我需要以连续形式一次编辑多条数据,“保存”它们,运行更多代码,也许添加字段来保存源自该处理的信息等等.然后我学会了使用临时表,但不喜欢它,因为它往往会使数据库膨胀。我什至在代码执行期间继续创建临时数据库,这些临时数据库将托管临时表并最终被销毁,但这增加了太多不必要的复杂性。

现在我使用断开连接的 ADO 记录集来保存临时数据和字段。它有效,但有其局限性。

所以我想知道,你们——比我更有经验的人——处理这种情况的最佳方法是什么?在内存中使用 ADO 记录集真的是最好的方法吗?

【问题讨论】:

  • Access的强大之处在于绑定形式。要仅保存经过验证的(完整)数据,请创建一个验证函数,并在更新前,将 Cancel 设置为 True,如果验证失败。随意选择未绑定的表单,但随后使用 Access 以外的其他工具,例如 Visual Studio 和 WinForms。
  • 我开发了一个数据库来管理我们的用户群以及他们对我们其他数据库的使用权限。那里有一个表格来管理所选用户的权限。在其中,所有相关权限都已加载,管理员可以根据需要删除、创建或编辑现有权限。所有这些都发生在临时表中,因此如果用户关闭表单而不保存,则不会发生任何变化。你能告诉我你会如何使用绑定到“真实”表的表单来处理这个问题?
  • 您可以将更新包装在事务中。然后,如果表单在没有提交的情况下关闭,则回滚更改。
  • 我会根据您的建议做一些研究,谢谢。

标签: forms ms-access


【解决方案1】:

我认为您将表单所做的两件事混合在一起,但要求完全不同。编辑现有记录(绑定表格非常适合)并创建新记录(使用直接绑定表格可能导致创建不完整的记录)。处理它的方法取决于很多事情,但主要取决于新记录需要多少数据才能被视为“完整”。

我通常会做以下事情之一:

  • 创建一个未绑定的弹出模式表单,用于添加仅存在必要字段的新记录。完成后,它会将新记录加载到主窗体中以供进一步编辑。

  • 使用上述方法,只是表单不是弹出式表单,而是主表单页脚或页眉中的一组未绑定字段。

  • 让用户创建新记录,但在表单的 OnClose(和/或其他适合您的情况)事件上绑定验证,如果未验证则删除半填充的记录。

  • 让用户在绑定表单中创建新记录,但有一个按计划或基于用户操作调用的“清理”例程。

最终,如果您的业务流程需要在每次添加新记录时手动添加/编辑大部分字段或编辑,您最好使用未绑定的表格。

【讨论】:

    【解决方案2】:

    这样,如果用户打开一个表单,他必须完成所有步骤 他应该这样做,因为如果他关闭表单中间过程(或 计算机死机或类似情况),实际数据将是 妥协,因为它会完成一半

    不,如果计算机死机,则不会将任何数据保存到表中。如果您使用断开连接的 reocrdset 和未绑定的表单,情况也是如此。

    如果您在具有一些验证码的表单中使用更新前事件并执行简单的取消 = true,则不会保存表单数据,也不会更新表格。同样,如果您使用断开连接的记录集并且用户关闭了表单,您必须测试数据——同样您可以选择写出数据或不写出数据——这种效果与使用绑定表单和表格或断开连接的表单。

    如果版本很简单,我发现我可以创建一个 记录集,将相关数据复制到表单中的未绑定字段,并在 最后,如果用户选择,将表单字段中的数据复制回来 到记录集。

    不,您不需要执行上述操作。以上没有任何效果,只会增加额外的开发时间并增加应用程序的成本。在几乎所有情况下,与绑定到表格的简单表单相比,绑定表单都会增加开发成本。所以最初的开发者有正确的想法。您可以在几乎所有情况下控制基础表的更新以实现所需的验证。只有在开发人员允许的情况下,表单才会保存和写入数据。

    因此,如果您在更新事件之前在表单中放置验证码,则绑定时访问表单不会或多或少地将不完整的数据写入表中。如果计算机死机,则半填充的绑定表单或未连接的 reocrdset 的半填充未绑定表单 BOTH 将不会写入其数据。

    在您的验证码完成之前,两种类型的表单都不会将数据写入表格。

    Access 不是为未绑定的表单而设计的,像 vb.net 甚至 VB6 这样的工具都有一大堆很酷的向导和对未绑定表单的支持。在访问中,我们没有那些向导。当您使用联合国绑定表单时,您会丢失大量表单事件。实际上,您得到了两全其美的结果,因为您失去了对表单事件的使用,并且没有向导或对 un-bound 的支持。即使只是我们拥有的几个删除记录事件也相当惊人。

    您在更新事件后失去了对 me.dirty、on-insert、me.newReocrd 和表单的使用 - 您丢弃并失去的功能列表非常庞大。如果你想要一个按钮来将数据写入表格(例如表单上的保存按钮),那么就去吧:

    If me.Dirty = True then
       me.Dirty = False     ' this forces your verification code to run
    End if
    

    在少数用例中,入站表单会让您受益,但它们会在开发时间方面花费您相当多的成本。

    【讨论】:

    • 感谢您提供所有这些信息。我会调查这一切。正如我所说,我一边工作一边学习,看看别人做了什么。我最终认为绑定表单是“坏的”,因为正如我现在开始意识到的那样,他根本没有实现任何验证方法......想象一个表单,其中有很多字段绑定到一个表。用户开始填写字段,当他从一个移动到另一个时,前一个得到更新,并且在没有任何验证的情况下,“保存”到表中。如果他在中途关闭表格,信息就会丢失,可能会破坏流程链的其余部分。
    • 所以我一直在努力理解你所说的......我开始理解表单 .Dirty 的工作原理,并且我在表单 .BeforeUpdate 上进行了一些进度设置 cancel = true满足条件时的事件。它可以丢弃单个记录的所有字段中的任何更改,但是当我使用连续表单尝试它时,它仅适用于当前焦点记录,我无法“撤消”对先前记录所做的更改。我仍然不明白如何“包装”自打开表单以来对所有记录所做的更改,并在使用“取消”按钮关闭表单时“撤消”它们。
    • 表单一次只能编辑一条记录。因此,不要将任何常规表单(一次编辑一条记录)或 AGAIN 一次编辑一条记录但显示多条记录的连续表单混淆。您显示多条记录或允许在仅显示一条记录的表单中导航“许多”记录这一事实在验证该记录方面没有任何改变。这种设置的例外是当这样的数据“集”属于某个父表单或父记录时。这是一个不同的问题,有几种方法可以解决这些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多