在当前记录正确保存到 table 之前,如何防止在 MS Access 2010 中创建新记录

How do I prevent creating a new record in MS Access 2010 before the current record is correctly saved into the table

情况

我已经创建了一个数据库来制作发票和类似文件。正如我们所知,这些文件必须逐步和单一地编号,一张发票(或其他文件)和以下的任何数字都不能遗漏。

出于这个原因,我在 table 中添加了一个自动编号字段,即发票或其他文档的编号。

正如我们所知,MS Access 会在将某些内容插入/编辑到 current/new 记录的那一刻创建另一个新记录。所以无论如何都会有一条新记录,就在用户开始编辑以前的新记录之后。

因此,如果数据库用户只是为了练习或练习而开始编辑新发票(或任何其他文档)而没有保存和打印它的意愿,而是在他犯错时使用 Esc 键退出记录或遇到无法解决的问题,文档编号丢失,编号漏洞仍然无法在下一个新记录中恢复。

要解决的问题

如何设置 MS Access 在用户 保存 时创建新记录,而不是在刚刚编辑以前的新记录时创建新记录?这样可以防止自动编号字段中缺少编号。 换句话说,如何仅在记录为 "officially saved" 时而不是在我开始编辑新记录时填充自动编号字段?

提前致谢。

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

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

即使您移至新记录并开始输入,该记录仍未保存。但是,将发布一个新的汽车编号。如果用户按下 ESC 键,或编辑->un 不保存记录,那么自动编号将不会被保存 - 但现在您在自动编号中有一个缺口。因此,如果用户决定不保存记录,但已开始输入该记录,则会发出(并用完)自动编号​​。但是,如果您不保存该记录,并且用户决定不添加(保存)该记录,那么您会发现一个间隙。

因此,尝试以这种方式使用自动编号是不切实际的。您会发现 Oracle、SQL 服务器和绝大多数数据库系统也是如此。简单的底线是这样的数字供您开发人员创建和设置关系。他们与发票号码等事情的关系为零

自动编号用于关系。事实上,你想让客户说发票是零,与你有或没有发票号码这一事实无关。为什么整个应用程序崩溃并且您的关系停止工作,因为您没有一些愚蠢的发票号码?发票编号有零零与一些内部自动编号有关。您可能需要发票号码,但我又一次使用了一些输入发票信息的系统,直到发票被批准或实际发送之前,发票号码是空白的,直到它被批准或发送出去。不管一些业务规则如何,即使需要发票编号,它也与您设置的自动编号和关系无关。无论是否有发票编号,此类关系都适用。

答案是您不能也不应该在 Access 中将自动编号用于外部含义。根本没有实际的方法来控制下一个数字和控制丢失的间隙。 更糟糕的是,这样的发票编号不太可能从 1 开始。许多公司采用一种系统,在该系统中,发送给给定客户的每张发票都不会透露,例如自上一张发票以来开出了多少张发票(这可能会泄露对您的客户有价值的信息)。

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

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

有多少种口味的冰淇淋,就有多少种方法可以做到这一点。但是,一种典型且常见的方法是设置一个小的 table.

因此创建一个名为 tblNextInvoice 的 table。

它看起来像这样: tblNextInvoice ID:autonumber PK - 所有 table 都需要其中一个。 NextInvoice:长整型。 - 这是您的下一个发票编号 table。

这个 table 将有一行。在上面 table 中,只需在 NextInvoice 中输入您希望发票编号开始的下一个发票编号。

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

if isnull(me!InvoiceNumber) = True then
   ' about to save record - set the invoice number
    me!InvoiceNumber = GetNextInvoiceNum()
End if

并且您需要创建一个 public 函数(放置在标准代码模块中 - 而不是表单代码模块中。它可以如下所示:

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 类型的格式(所以这个样本编号有月份,日期 + 序列号。你甚至可能与你的会计人员就什么样的格式进行设计和开发会议您的发票编号系统需要格式甚至政府法规。因此,自定义获取下一张发票不必仅限于数字 - 您可以包含一些字符串值,并将该函数(和发票编号)更改为文本类型列而不仅仅是数字类型的列。

例如,我有一些软件 运行 用于志愿者团体和一些教会团体 - 因为他们的 non-profit 地位,现在有一些关于格式的政府规定开具的发票。这尤其适用于发出收据编号的情况。

签发收据时,收据不仅必须显示新的收据编号,还必须显示签发的收据是收据 XXXX 的替代品,必须为 clarly marked(这是为了防止有人要求第二张捐款收据,并提交两次以进行双重减税。所以,现在你甚至不允许两次向捐赠者开具相同编号的收据!(他们必须显示一个新号码,以及它正在替换的号码。

因此,不管这些问题如何,在几乎所有业务系统中,开发人员都需要完全控制如何重新发布这些数字 - 你不能让这个问题成为偶然,你也不能离开这个也可以发给自动编号。这种类型的数字用于业务规则和业务操作——它们与使用自动编号在数据库中建立某些关系无关——并且关系是 100% 独立于业务事物的概念,如发票编号或收据编号等。

Sql 如果您中止插入操作或出现错误,服务器不会增加任何内容。 在 ms access 中,这是不正确的。自动增量总是增量,这很烦人!

在sql服务器中,如果您开始写入新记录并中止它,则身份增量不会增加。如果您写入新记录并导致插入的数据类型错误,情况也是如此。

在 sql 中,如果您有一个相关的外部主键并且您尝试关联错误的 ID 导致错误,则服务器自动增量确实会增加。