在开发中经常会遇到生成编号的需求(如接口报文ID,自建表数据主键等);为此,SAP提供了自动编号工具,能根用户需求设定并自动生成一组唯一的编号。
1.进入事务代码SNRO,创建一个编号范围对象。
编号长度域:表示生成出来的编号是什么数据类型
%警告:表示已产生的编号达到此百分比时给出警告
截至年份标志:表示按照年份重新获取编号(从范围的最小值重新开始)
无滚动:表示所有编号用完不会重新回到最小值开始,不勾选则表示重新从最小号开始编号
编号范围事务:可以指定一个事务码,通过执行此事务码可以进入该编号对象的维护页面
缓冲:主内存缓冲是指系统为了提高性能而预先取出一些编号放在应用服务器上,当程序取用编号时直接从应用服务器获取,而无需再读取数据库了。通常,如果对号码的连续性要求不高的情况下可以使用这种方式,而如果是财务凭证等要求连续的编号,为了防止跳号,则应该把主内存缓冲关闭,设置为无缓冲。
点击间隔编辑。
维护编码范围的起始编号和截止编号即可。
在程序中通过函数 NUMBER_GET_NEXT 来获取编号对象所生成的流水码,每次调用都会产生一个新的编号
DATA: nextno TYPE char10.
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' "锁定要要维护的号码范围对象及其组和间隔
EXPORTING
object = 'ZWEIGH_RUN' "事务代码snro 先创建一个流水号(char10)
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 3
OTHERS = 4.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01' "编码范围间隔的序号
object = 'ZWEIGH_RUN' "编码范围对象的名称
IMPORTING
number = nextno. "最后获得的流水号
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE' "解锁已维护的号码范围对象
EXPORTING
object = 'ZWEIGH_RUN'
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
同时,可根据业务要求按时间维度重置流水号。
SELECT SINGLE ztyayno,zbarcode,zcdate INTO @DATA(ls_zcdate) FROM ztbc_003 WHERE zcdate = @sy-datum.
IF sy-subrc <> 0.
"按天重置流水号
CALL FUNCTION 'NUMBER_RANGE_INTERVAL_INIT'
EXPORTING
object = 'ZWEIGH_RUN'
* SUBOBJECT = ' '
* INTERVALS =
client = sy-mandt
* COMMIT =
EXCEPTIONS
no_interval_found = 1
object_not_found = 2
OTHERS = 3.
ENDIF.