今天做了一个采购订单的採番,“採番”是日语词,通俗的讲就是按自己定义的规则生成流水号 。下面分享一下产生流水号的步骤:
1. 系统中设定流水号
使用T-CodeSNRO来创建一个流水号标识对象,
输入ObjectZLC_001,然后单击创建。
然后输入Shorttext, Long text, Number length domain在写程序的时候应该会另外创建,这里测试就使用料号的Domain MATNR来做,其他的参数使用默认值就可以了,然后保存输入的资料。
系统提示创建成功,这里还需要维护一个子对象,单击“号码范围”。
单击“间隔”,维护具体的流水号规则。
然后保存 ,流水号设定完成,接下来就是程序中如何取得这些流水号了。
2. 程序中取得流水号
REPORT ZLC_NUMBER_RANGE.
DATA W_MATNR TYPE MATNR.
START-OF-SELECTION.
CALLFUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
OBJECT ='ZLC_001' "Ceate with SNUM
EXCEPTIONS
FOREIGN_LOCK =1
OBJECT_NOT_FOUND= 2
SYSTEM_FAILURE =3
OTHERS =4.
CALLFUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR ='00'
OBJECT ='ZLC_001'
IMPORTING
NUMBER =W_MATNR
EXCEPTIONS
INTERVAL_NOT_FOUND =1
NUMBER_RANGE_NOT_INTERN = 2
OBJECT_NOT_FOUND =3
QUANTITY_IS_0 =4
QUANTITY_IS_NOT_1 =5
INTERNAL_OVERFLOW =6
OTHERS =7.
CALLFUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
OBJECT= 'ZLC_001'.
IFSY-SUBRC <> 0.
MESSAGEID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITHSY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Tcode:SNUM定义对象,添加号码范围,使用 NUMBER_GET_NEXT获取号码。有时候会出现跳号现象,2个方法解决。
1.SNUM定义对象时,把缓存数设置为0.这个也可以用在SNRO里进行设置。一般这样就可以解决问题。如果还存在这种现象:
2. call function 'NUMBER_GET_NEXT'
exporting
nr_range_nr = '01'
object = 'ZTEST_NUM'
ignore_buffer = 'X'
importing
number = Num
把FUNCTION里的ignore_buffer = 'X'设置为X即可解决
if sy-subrc = 0.
concatenate sy-datum+4(4) Num into Num.
select single * from t100 into corresponding fields of t100 where sprsl = 'M'
and arbgb = sy-msgid and msgnr = sy-msgno.
if sy-subrc = 0.
move t100-text to text.
replace '&' with sy-msgv1 into text. condense text.
replace '&' with sy-msgv2 into text. condense text.
replace '&' with sy-msgv3 into text. condense text.
endif.
endif.
write:/'Number is:'.write: Num.
write:/'text is:'.write: text.
源文档 <http://hi.baidu.com/derrial/blog/item/177ed6361719e9c9a2cc2b27.html>