Ms access 在将当前记录正确保存到表中之前,如何防止在MS Access 2010中创建新记录 处境

Ms access 在将当前记录正确保存到表中之前,如何防止在MS Access 2010中创建新记录 处境,ms-access,save,record,autonumber,Ms Access,Save,Record,Autonumber,我已经创建了一个用于制作发票和类似文档的数据库。正如我们所知,这些单据必须逐次、单字地进行编号,一张发票(或其他单据)和以下单据中不得有任何缺失的编号 因此,我在表中添加了一个自动编号字段,即发票或其他文档的编号 正如我们所知,MS Access会在当前/新记录中插入/编辑某些内容时创建另一个新记录。因此,在用户开始编辑以前的新记录之后,不管发生什么,都会有一条新记录 因此,如果db用户开始编辑新发票(或任何其他单据),只是为了做练习或练习,而没有保存和打印的意愿,但在犯错误或遇到无法解决的问题

我已经创建了一个用于制作发票和类似文档的数据库。正如我们所知,这些单据必须逐次、单字地进行编号,一张发票(或其他单据)和以下单据中不得有任何缺失的编号

因此,我在表中添加了一个自动编号字段,即发票或其他文档的编号

正如我们所知,MS Access会在当前/新记录中插入/编辑某些内容时创建另一个新记录。因此,在用户开始编辑以前的新记录之后,不管发生什么,都会有一条新记录

因此,如果db用户开始编辑新发票(或任何其他单据),只是为了做练习或练习,而没有保存和打印的意愿,但在犯错误或遇到无法解决的问题时,使用Esc键退出记录,文档编号丢失,编号上的漏洞无法在下一个新记录中恢复,无论发生什么情况

要解决的问题 如何设置MS Access以创建新记录,而不是在用户刚刚编辑以前的新记录时,而是在用户保存该记录时?这样可以防止自动编号字段中缺少编号。 换句话说,如何仅在记录“正式保存”时而不是在开始编辑新记录时填充自动编号字段


提前感谢。

自动编号仅供内部使用(这意味着您是应用程序的开发者)。例如,当您加载word文档时,操作系统会发出一个内存段位置-您作为word的用户并不关心

自动编号也是如此。它们供开发人员创建表之间的关系。它们不能用于发票号码等

即使您移动到新记录,开始键入,该记录仍不会保存。然而,一个新的汽车号码将被发布。如果用户按ESC键,或编辑->取消以不保存记录,则自动编号将不会被保存-但现在您的自动编号存在差距。因此,如果用户决定不保存记录,但已开始键入该记录,则会发出自动编号(并用完)。但是,如果您不保存该记录,并且用户决定不添加(保存)该记录,那么您将发现一个缺口

因此,试图以这种方式使用自动编号是不现实的。对于Oracle、SQL server和绝大多数数据库系统,您也会发现同样的情况。最简单的一点是,这些数字是供开发人员创建和设置关系的。它们与发票号码等无关

自动编号用于关系。你想让客户说发票是零,这与你有或没有发票号码无关。为什么整个应用程序会因为没有愚蠢的发票号码而崩溃,而您的关系会停止工作?发票编号与某些内部自动编号有关。您可能需要发票号,但我还是使用了一些输入发票信息的系统,在发票被批准或实际发出之前,发票号在批准或发出之前是空白的。不管某些业务规则如何,即使需要发票号,也与您设置的自动编号和关系无关。这种关系可以使用发票号,也可以不使用发票号

答案是,您不能也不应该在Access中使用自动编号来表示外部含义。根本没有实际的方法来控制下一个数字,以及控制缺失的间隙。 更糟糕的是,这样的发票号码不太可能从1开始。许多公司采用这样一种系统,即发送给特定客户的每张发票都不会显示自上一张发票以来已开具的发票数量(这可以向客户提供有价值的信息)

如果您需要一些递增的发票号码? 然后,开发人员必须根据您的需求构建和设置一个系统

因此,我认为这个要求不仅仅是一个从1开始的数字,然后是2,然后是3等等。您非常希望在应用程序中能够设置下一个或开始的发票号

做这件事的方法和冰淇淋的味道一样多。然而,一种典型且常见的方法是设置一个小表

因此,创建一个名为tblnvoice的表

它将如下所示: TBLN语音 ID:自动编号PK-您希望所有表都使用其中一个。 NextInvoice:长整数。-这是您的下一张发票号码表

这张桌子只有一行。在上表中,只需在NextInvoice中输入您希望发票编号开始的下一个发票编号

现在,在表单的“更新前”事件中:

if isnull(me!InvoiceNumber) = True then
   ' about to save record - set the invoice number
    me!InvoiceNumber = GetNextInvoiceNum()
End if
您需要创建一个公共函数(放在标准代码模块中,而不是表单代码模块中。它可以如下所示:

Public Function NextInvoice() as long
  Dim myRST As Dao.Recordset
  set myRST = Currentdb.OpenRecordSet("tblNextInvoice")
  NextInovice = myRST!NextInvoiceNum
  myRST.Edit
     myRST!NextInvoiceNum = myRST!NextInoiceNum  + 1
  myRST.Update
  myRST.Close
End Function
所以,如果你想确保没有差距,可以设置开始,你想控制创建一个发票号码? 然后,作为开发人员,您必须设置、创建和设计发票号码系统。因为该系统是自定义的,所以您可以包括01152020-00012等格式类型(因此,此示例编号包含月份、日期+序列号。您甚至可以与会计人员召开设计和开发会议,讨论发票编号系统需要何种格式,甚至政府法规。这样,custom get next invoice就不必仅限于一个编号,您可以包括som。)e字符串值,并将该函数(和invoicenumber)更改为文本类型列,而不仅仅是数字类型的列

例如,我为volun运行了一些软件