Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 在ms access中使用表单编辑数据的最佳做法_Forms_Ms Access - Fatal编程技术网

Forms 在ms access中使用表单编辑数据的最佳做法

Forms 在ms access中使用表单编辑数据的最佳做法,forms,ms-access,Forms,Ms Access,因此,由于必要性,我开始学习访问,因为负责访问的人过去了,必须有人继续。 我注意到他创建的所有数据库中都有一个非常糟糕的行为(至少在IMO中是这样):每个表单都直接绑定到一个表或保存的查询。这样,如果用户打开一个表单,他必须完成他应该完成的所有步骤,因为如果他在中途关闭表单(或者计算机冻结,或者诸如此类的事情),实际数据将被破坏,因为它将完成一半。这常常会破坏流程链中的一切,导致无法执行子顺序步骤,并迫使我直接手动更正表中的数据 当我开始升级他的资料并开发我自己的资料时,我一直在努力学习只允许在

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

当我开始升级他的资料并开发我自己的资料时,我一直在努力学习只允许在表单中编辑数据的方法,这样就可以随时取消该过程或最终一次性保存所有更改

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

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

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


所以我想知道,你们——比我经验丰富得多——用什么方式来处理这种情况最好?使用内存中的ADO记录集真的是最好的解决方法吗?

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

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

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

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

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

  • 允许用户在绑定表单中创建新记录,但有一个“清理”例程,可以按计划调用,也可以根据用户操作调用

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

这样,如果用户打开表单,他必须完成所有步骤 他应该这样做,因为如果他中途关闭表单(或 计算机被冻结了,或者任何类似的情况),实际的数据将是 妥协,因为这将是半完整的

否,如果计算机冻结,则不会将任何数据保存到表中。如果使用断开连接的reocrdset和未绑定的表单,则情况相同

如果在具有验证代码的表单中使用“更新前”事件并执行简单的cancel=true,则不会保存表单数据,也不会更新表。同样,如果您使用了断开连接的记录集,并且用户关闭了表单,那么您必须测试数据——并且您可以选择是否写出数据——这种效果与使用绑定表单到表或断开连接的表单没有任何区别

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

不,您不需要执行上述操作。上述方法一无所获,只会增加开发时间,增加应用程序的成本。几乎在所有情况下,绑定表单都会比绑定到表的简单表单增加开发成本。所以最初的开发者有了正确的想法。您几乎可以在所有情况下控制基础表的更新,以实现所需的验证。表单仅在开发人员允许的情况下保存和写出数据

因此,如果在更新事件之前在表单中放置验证码,则绑定时访问表单不会或多或少地将不完整的数据写入表中。如果计算机冻结,半填的绑定表单或半填的未绑定表单(带有断开连接的reocrdset)都不会写入数据

这两种类型的表单都不会将数据写到表中,直到您的验证代码完成

Access不是为未绑定表单而设计的,像vb.net甚至VB6这样的工具都有一大堆很酷的向导和对未绑定表单的支持。在access中,我们没有这些向导。当您使用未绑定的表单时,会丢失大量表单事件。事实上,这两种情况都是最糟糕的,因为您失去了表单事件的使用,并且没有向导或对unbound的支持。即使是我们拥有的几个删除记录的事件也相当惊人

您失去了me.dirty、on insert、me.newReocrd、forms after update events(更新事件后的表单)的使用—您丢弃的功能列表
If me.Dirty = True then
   me.Dirty = False     ' this forces your verification code to run
End if