在任何财物系统中,财务凭证编号的连续性都十分重要. 如果出现断号,跳号的问题,需要向审计部门提供详细的原因. 这种问题也经常会发生在SAP的系统中. 本篇文章向您简单介绍SAP系统中财务凭证编号的分配实现原理, 如何避免出现跳号,以及出现跳号后如何应对.

  • 实现机制

SAP系统中,每一个财务凭证都分配了一个凭证类型, 例如, DZ. 针对每个凭证类型,您需要指定一个凭证编号区间,例如: 010000000 – 019999999. 当系统生成新的财务凭证的时候,会首先取得这个凭证编号区间的最后一个数字,然后加1作为新的凭证编号, 这个编号区间的最后一个号码也被更新成这个最新的编号, 并在有新的凭证产生的时候使用.

凭证编号区间对应的主要数据库表是NRIV. 每次生成新的凭证的时候,这个表都会被锁定,然后在最新编号取得并更新后解锁. 如果在您的系统中有大量的凭证生成工作在并行操作,会造成这个表的死锁.很多客户提交过这种问题为了解决这个问题, SAP引入了buffer的概念, SAP系统中有几种不同类型的buffer:

    • Main
      memory
    • Local Buffering
    • Local buffering with work process ID
    • Parallel buffering
    • Parallel buffering with pseudo ascending document number assignment

每种buffer都有自己的优点和缺点,具体的介绍您可以参照note 504875.  通过设置buffer,可以有效地避免数据库死锁的问题,但是并不是所有的buffer都可以用在财务凭证我们推荐最后一种Parallel buffering with pseudo ascending document number assignment. 您可以参照note 1398444来激活这个buffer.

  • 为什么会出现跳号呢?

               1. Update termination这是最容易造成跳号的原因. sap系统中, 生成财务凭证并更新数据库的操作是放在一个update task中异步进行的举个例子, 您现在要生成一个凭证类型是DZ的财务凭证, 编号区间为010000000 – 019999999.  那么系统会执行下列主要步骤去生成一个财务凭证:

    • 准备各种数据例如,文档日期,行项目.
    • 取得这个凭证编号区间最后一个号码例如0190000000, 然后加一作为新的凭证编号0190000001. 这时,这个凭证编号区间的最后一个号码也变成了0190000001.
    • 系统把所有的数据放到一个update task里面去执行真正的数据库更新. 这一步是异步进行的. 也就是说即使对应的数据还没有被真正更新到数据库中, 系统这时候也认为凭证0190000001已经生成了,并抛出信息提示客户.

通常情况下,update task里面的数据会及时正确地被更新到数据库, 客户也能及时地使FB03查找到这个凭证但是一旦有任何错误发生, update termination 就会产生. 这个财务凭证并没有真正的生成, 但是这个凭证编号0190000001已经被使用了, 这就产生了跳号.

              2. 使用了不恰当的buffer:  Main buffer.  有些客户激活了main buffer. 这种情况下,系统会把一部分凭证编号放入到内存,例如0190000000 – 0190000100.  当生成凭证的时候, 系统会直接在main memory里面取出最后编号。但是如果系统出现异常, 例如宕机, main memory里面的数据就会丢失,系统再启动以后,这部分号码就不能再使用了. 这也造成了跳号.

                 3. 不恰当的commit work

SAP系统中, update task中的所有数据库操作会在执行了commit work这个语句后才真正执行. 如果您在您的user-exit, substitution 或者其他接口程序中提前执行了commit work,会造成数据库操作的不一致性,从而导致某些表没有被更新,最终导致跳号.

  • 如何避免跳号

    1. 请定期执行SM13去检查是否有update termination产生, 检查具体的错误并解决.然后可以再次执行这个update进行数据的更新.
    2. 设置合理的buffer.
    3. 禁止在您的任何程序中执行commit work.

  • 出现跳号后如何处理

SAP提供了程序RFVBER00 RFBNUM00N来查找由于update termination引起的跳号, 并生成一个报表, 您可以出示给您的审计部门因为系统中的update termination只能保存一段时间(参数‘rdisp/vbdelete’ 控制),所以请定期执行这些程序进行检查一面丢失数据。

很抱歉得是, 由于不恰当的buffercommit work引起的跳号是没有办法查找到原因的.

希望这个篇文章能对您的工作有所帮助.

谢谢

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply