相信SAPERP从业者,多多少少都遇到过编号的问题。如漏号,取重复编号导致SAPSQL_ARRAY_INSERT_DUPREC的ShortDump,取编号时出现Time Out,大的凭证编号创建时间反而在小凭证编号之前等。 面对需求复杂的全球各国客户,且根据各国审计法案,需求还在不断的变化更新当中,比如A国要求凭证编号必须按创建时间序列连续编号不得漏号;B国要求凭证编号不得漏号,但对创建时间没有要求;C国允许凭证漏号,但必须按时间序列升序编号等等。单独就这些需求来讲,没有足够开发经验的从业者就会说了,开发一个函数创建一个表,取一个号锁一次表,取完解锁。 事实上SAPERP最初也是这么干的,但是很快就会发现,在进行数据批量处理的时候,尤其是多个process去争取同一个表锁对象的锁/解锁资源的时候,会出现很大的处理效率问题。为了满足处理速度,必须引进Buffer这个概念,有了Exclusive Lock + BufferType(Main memory buffer/Local Buffer/Parallel Buffer) + Buffer Size + Commit/Rollback ,SAPERP系统也就可以满足各种稀奇古怪的客户需求了。 但是在很多的项目实施过程当中,并没有充分的去了解需求并且根据需求对系统进行Customizing。所以导致出结果和期待不一致的情况,以一个 Buffer Type= ParallelBuffer, Buffer Size = 1的RF_BELEG的例子,来说明一下大的凭证编号创建时间反而在小凭证编号之前的技术原因吧: 步骤1:
在函数NUMBER_GET_NEXT里面设定断点,通过事务代码FB50创建财务凭证,取号成功(编号=0200000014)后,不再运行后续的程序,模仿Rollback的工作后,系统未生成凭证,所取得的凭证编号0200000014暂存于表NRIVSHADOW中。
步骤2:
运行事务代码FB50,正常保存凭证,如凭证0200000017,保存时间为:18:06:54。
步骤3: 再次运行FB50,在函数NUMBER_GET_NEXT的Form SHADOW_NRIV中,将Instance模拟替代为“usciq4a_Q4A_09_22”后,进行取号工作,程序将自动取得上次暂存编号0200000014。继续运行后续的程序并生成凭证0200000014。
步骤4:查看新保存的凭证0200000014,保存时间为18:12:02,在凭证0200000017之后。
上述例子比较简单,但是在现实业务当中非常实用。 想要了解更多IT培训内容,关注东方瑞通官方微信号(easthome_1998)
|