1.TCODE:SNRO, 进入如图所示界面
2.
短文本和长文本用来说明这个编号范围对象, 输入任意描述即可.
子对象数据元素我们这里不填. 这里需要说明一下, 所谓子对象, 多数指一个组织结构, 比如公司代码, 销售组织, 工厂等, 这样编号就在对应的每个组织下面独立编号, 最典型的例子是财务凭证, 每个公司代码下的财务凭证都是独立编号的 (其对应的数据表 BKPF, 也必定把公司代码做为一个键字段). 而我们这个调度单对应于销售订单, 销售订单没有按照组织级别分别编号, 因此相应的调度单也就不需要了. 到期年标记是指编号按年度归零, 每当开始一个新年度时, 相应的编号也需要从头开始, 比如财务凭证和物料凭证都是这样 (比如表 BKPF 和 MKPF, 都把年度做为一个键字段) , 而我们的调度单不需要对应年度, 因此这里也不打勾.
编号长度域就填创建的域, 但是一定要先激活. 指定这个编号范围对象 YLBPP001 的长度, 我们定义域长度为 10, 因此这个编号范围对象生成的编号长度也是 10 位. 无滚动是指如果编号达到最大, 是否自动从头开始, 勾上就不从头开始, 而在获取编号的时候提示出错. 我们这里应该打勾.
编号范围处理, 属于翻译问题, 实际就是编号范围的事务码, 如果指定这个事务码, 就可以不需要通过 SNUM 或者 SNRO 的主屏幕然后输入编号范围对象的名字来维护这个编号范围, 而可以输入事务码直接进入它的号码范围维护屏幕.
警告百分比是指如果编号使用到一定比例, 就发出系统警告, 提示管理人员增大范围或者进行历史数据归档, 避免编号全部用完后影响正常业务, 这里我们填写 95, 就是 95% 的时候提示.
主内存缓冲是指系统为了提高性能而预先取出一些编号放在应用服务器上, 当程序取用编号时直接从应用服务器获取, 而无需再读取数据库了. 通常, 如果对号码的连续性要求不高的情况下可以使用这种方式, 而如果是财务凭证等要求连续的编号, 则应该把主内存缓冲关闭.
3. 程序读取:
- CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
- EXPORTING
object = 'YLBPP001' " 这个就是流水号对象
- EXCEPTIONS
- foreign_lock = 1
- object_not_found = 2
- system_failure = 3
- OTHERS = 4.
- IF sy-subrc EQ 0.
- CALL FUNCTION 'NUMBER_GET_NEXT'
- EXPORTING
nr_range_nr = '1' " 这个就是维护的间隔号
object = 'YLBPP001' " 这个就是流水号对象
- * QUANTITY = '1'
- * SUBOBJECT = ' '
- * TOYEAR = '0000'
- * IGNORE_BUFFER = ' '
- IMPORTING
number = wa_data-zz_code " 获得的流水号
- * QUANTITY =
- * RETURNCODE =
- EXCEPTIONS
- interval_not_found = 1
- number_range_not_intern = 2
- object_not_found = 3
- quantity_is_0 = 4
- quantity_is_not_1 = 5
- interval_overflow = 6
- buffer_overflow = 7
- OTHERS = 8.
- IF sy-subrc <> 0.
- * Implement suitable error handling here
- ENDIF.
* * *** 将号码累加
- CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
- EXPORTING
- object = 'YLBPP001'
- EXCEPTIONS
- object_not_found = 1
- OTHERS = 2.
很容易理解, 首先判断是否有这个 number range, 如果存在的话, 就获得下个序号,
最后一个函数估计是释放这个全局变量的内存 (资源).'YLBPP001'就是我们创建的 number range. 如此就可以像会计凭证编号那样每次都可以自动生成流水号了!
流水号可以在自建表中用作主键.
来源: https://www.cnblogs.com/libo2019/p/10733362.html