1. 系统中设定流水号;使用T-Code:SNRO来创建一个流
输入Object:ZLC_001,然后单击创建。
然后输入Shorttext, Long text, Number length domain在写程序的时候应该会另外创建,这里测试就使用料号的Domain MATNR来做,其他的参数使用默认值就可以了,然后保存输入的资料。
系统提示创建成功,这里还需要维护一个子对象,单击“号码范围”。
单击“间隔”,维护具体的流水号规则。
然后保存 ,流水号设定完成,接下来就是程序中如何取得这些流水号了。
2、NUMBER_GET_NEXT 获取编号 遇到关于按年度编号的问题
最近给财务做了一个平台,在系统创建一些特殊类型的合同,需要生成合同编号:财务要求 合同类型+公司代码 +年+三位流水号,
eg:CP6008-2017001
SNRO
子对象数据元素就是: 公司代码 不多解释
勾选 截至年份标志 :表示 按照年份 重新获取编号(从范围的最小值重新开始)
勾选 无滚动:表示 所有编号用完 不会重新回到最小值开始,不勾选反之表示重新从最小号开始编号
好 ,那么问题来了 今年是2017年,如果我只是维护2016年的编号范围 NUMBER_GET_NEXT 报错, 如果我直接维护2018年的编号范围,NUMBER_GET_NEXT 获取成功,输入参数明明是2017年,却在2018年获取了编号
以下是测试过程:
NUMBER_GET_NEXT: 按年编号 需要传入 toyear 参数
我在维护一下18年的编号范围:
成功了 (被坑在这这个问题上,2017年的没有维护 ,理论上是不是应该提醒一下啊 SAP同学?)
没办法自己解决:
在执行 NUMBER_GET_NEXT 前 检查一下 是否维护了当前年度的编号范围。数据库表为NRIV
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
OBJECT = ''
EXCEPTIONS
FOREIGN_LOCK = 1
OBJECT_NOT_FOUND = 2
SYSTEM_FAILURE = 3
OTHERS = 4
.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = '00'
OBJECT =
SUBOBJECT = P_BUKCG
TOYEAR = SY_DATUM+0(4)
IGNORE_BUFFER = 'X'
IMPORTING
NUMBER = P_HTNUM
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
.
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
OBJECT = ''
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS = 2
.