字符串不能整体做加法 但是我们可以模拟加法
字符集就是 0 1 2 3 4 5 6 7 8 9 A B C D E F G …… Z (按顺序排列)
你可以认为这是一个35进制的数字
然后在最后1位+1 如果不是Z 就得到后一位数字
(比如 2 + 1 = 3,9 + 1 = A ,X + 1 = Y,Y + 1 = Z 我相信你们要求的相邻也是这样的顺序)
如果最后一位是Z , 那+1就等于 0了, 往前1位加一 (做进位)
规则也是这样的,把进位做完了以后,这个字符串的+1操作就结束了。
字符集就是 0 1 2 3 4 5 6 7 8 9 A B C D E F G …… Z (按顺序排列)
你可以认为这是一个35进制的数字
然后在最后1位+1 如果不是Z 就得到后一位数字
(比如 2 + 1 = 3,9 + 1 = A ,X + 1 = Y,Y + 1 = Z 我相信你们要求的相邻也是这样的顺序)
如果最后一位是Z , 那+1就等于 0了, 往前1位加一 (做进位)
规则也是这样的,把进位做完了以后,这个字符串的+1操作就结束了。
*&---------------------------------------------------------------------*
*& Report ZIAN01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zian01 .
TYPE-POOLS :slis .
PERFORM getdata .
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata .
DATA : BEGIN OF line ,
sernr LIKE objk -sernr ,
END OF line .
DATA :itab LIKE TABLE OF line WITH HEADER LINE .
line -sernr = '12348' .
APPEND line TO itab .
line -sernr = '12350' .
APPEND line TO itab .
line -sernr = '12351' .
APPEND line TO itab .
line -sernr = '12352' .
APPEND line TO itab .
line -sernr = '12356' .
APPEND line TO itab .
line -sernr = '12357' .
APPEND line TO itab .
line -sernr = '12358' .
APPEND line TO itab .
line -sernr = '12360' .
APPEND line TO itab .
line -sernr = '12361' .
APPEND line TO itab .
DATA :s_sernr TYPE string .
DATA :n1 TYPE i .
n1 = 0 .
*& Report ZIAN01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zian01 .
TYPE-POOLS :slis .
PERFORM getdata .
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata .
DATA : BEGIN OF line ,
sernr LIKE objk -sernr ,
END OF line .
DATA :itab LIKE TABLE OF line WITH HEADER LINE .
line -sernr = '12348' .
APPEND line TO itab .
line -sernr = '12350' .
APPEND line TO itab .
line -sernr = '12351' .
APPEND line TO itab .
line -sernr = '12352' .
APPEND line TO itab .
line -sernr = '12356' .
APPEND line TO itab .
line -sernr = '12357' .
APPEND line TO itab .
line -sernr = '12358' .
APPEND line TO itab .
line -sernr = '12360' .
APPEND line TO itab .
line -sernr = '12361' .
APPEND line TO itab .
DATA :s_sernr TYPE string .
DATA :n1 TYPE i .
n1 = 0 .
sort itab by sernr.
LOOP AT itab .
DATA : i TYPE i , len TYPE i .
DATA : s_forward TYPE i .
i = 1 .
len = 0 .
s_forward = 1 .
DATA :serialitem TYPE string .
DATA :nextserial TYPE string .
DATA :flag TYPE i .
flag = 0 .
serialitem = itab -sernr .
DATA : s1 TYPE string , s2 TYPE string .
DATA : itablen TYPE i .
itablen = lines ( itab ) .
IF itablen = 1 .
s_sernr = serialitem . "只有一条序列号
ENDIF .
IF itablen > 1 . "有多个序列号
IF n1 = 1 AND serialitem = nextserial . "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
s1 = s2 .
ENDIF .
IF n1 = 1 AND serialitem <> nextserial . "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
s1 = serialitem .
CONCATENATE s_sernr s2 INTO s_sernr .
ENDIF .
IF n1 > 1 AND serialitem <> nextserial AND n1 <> itablen - 1 . "循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr .
s1 = serialitem .
ENDIF .
IF n1 = itablen - 1 AND serialitem = nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
s2 = serialitem .
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr .
ENDIF .
IF n1 = itablen - 1 AND serialitem <> nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
CONCATENATE s_sernr ',' s1 '-' s2 ',' serialitem INTO s_sernr .
ENDIF .
ENDIF .
"判断字符串是不是全是‘Z'',如果全是'Z'进位1
len = strlen ( serialitem ) .
DATA :zflag TYPE i , t TYPE i , zchar TYPE c .
DATA : zstring TYPE string .
zstring = '' .
zflag = 0 .
t = 0 .
WHILE t < len .
zchar = serialitem+t ( 1 ) .
CONCATENATE zstring 'Z' INTO zstring .
t = t + 1 .
ENDWHILE .
IF zstring = serialitem . "如果字符串是全'Z',则进位1,后补0
t = 0 .
zstring = '1' .
WHILE t < len .
CONCATENATE zstring '0' INTO zstring .
t = t + 1 .
ENDWHILE .
nextserial = zstring .
ENDIF .
WHILE i <= len AND s_forward = 1 .
DATA :strstart TYPE string , strmid TYPE string , strend TYPE string .
DATA :endchar TYPE c .
DATA :point TYPE i , p1 TYPE i , n TYPE i .
point = len - i .
p1 = point + 1 .
n = i - 1 .
endchar = serialitem+point ( 1 ) .
IF endchar <> 'Z' . "如果字符不为’Z‘’
s_forward = 0 . "s_forward为0则不进行while循环了
strstart = serialitem+0 (point ) .
IF flag = 0 . "flag为0表示不需要进位加 1
strend = serialitem+p1 (n ) .
CASE endchar .
WHEN '0' .
CONCATENATE strstart '1' strend INTO nextserial .
WHEN '1' .
CONCATENATE strstart '2' strend INTO nextserial .
WHEN '2' .
CONCATENATE strstart '3' strend INTO nextserial .
WHEN '3' .
CONCATENATE strstart '4' strend INTO nextserial .
WHEN '4' .
CONCATENATE strstart '5' strend INTO nextserial .
WHEN '5' .
CONCATENATE strstart '6' strend INTO nextserial .
WHEN '6' .
CONCATENATE strstart '7' strend INTO nextserial .
WHEN '7' .
CONCATENATE strstart '8' strend INTO nextserial .
WHEN '8' .
CONCATENATE strstart '9' strend INTO nextserial .
WHEN '9' .
CONCATENATE strstart 'A' strend INTO nextserial .
WHEN 'A' .
CONCATENATE strstart 'B' strend INTO nextserial .
WHEN 'B' .
CONCATENATE strstart 'C' strend INTO nextserial .
WHEN 'C' .
CONCATENATE strstart 'D' strend INTO nextserial .
WHEN 'D' .
CONCATENATE strstart 'E' strend INTO nextserial .
WHEN 'E' .
CONCATENATE strstart 'F' strend INTO nextserial .
WHEN 'F' .
CONCATENATE strstart 'G' strend INTO nextserial .
WHEN 'G' .
CONCATENATE strstart 'H' strend INTO nextserial .
WHEN 'H' .
CONCATENATE strstart 'I' strend INTO nextserial .
WHEN 'I' .
CONCATENATE strstart 'J' strend INTO nextserial .
WHEN 'J' .
CONCATENATE strstart 'K' strend INTO nextserial .
WHEN 'K' .
CONCATENATE strstart 'L' strend INTO nextserial .
WHEN 'L' .
CONCATENATE strstart 'M' strend INTO nextserial .
WHEN 'M' .
CONCATENATE strstart 'N' strend INTO nextserial .
WHEN 'N' .
CONCATENATE strstart 'O' strend INTO nextserial .
WHEN 'O' .
CONCATENATE strstart 'P' strend INTO nextserial .
WHEN 'P' .
CONCATENATE strstart 'Q' strend INTO nextserial .
WHEN 'Q' .
CONCATENATE strstart 'R' strend INTO nextserial .
WHEN 'R' .
CONCATENATE strstart 'S' strend INTO nextserial .
WHEN 'S' .
CONCATENATE strstart 'T' strend INTO nextserial .
WHEN 'T' .
CONCATENATE strstart 'U' strend INTO nextserial .
WHEN 'U' .
CONCATENATE strstart 'V' strend INTO nextserial .
WHEN 'V' .
CONCATENATE strstart 'W' strend INTO nextserial .
WHEN 'W' .
CONCATENATE strstart 'X' strend INTO nextserial .
WHEN 'X' .
CONCATENATE strstart 'Y' strend INTO nextserial .
WHEN 'Y' .
CONCATENATE strstart 'Z' strend INTO nextserial .
ENDCASE .
ELSE . "flag为 1 需要进位加 1 ,如123Z 进位变为1240
DATA : m TYPE i .
m = 0 .
WHILE m < i - 1 .
CONCATENATE strend '0' INTO strend .
m = m + 1 .
ENDWHILE .
CASE endchar .
WHEN '0' .
CONCATENATE strstart '1' strend INTO nextserial .
WHEN '1' .
CONCATENATE strstart '2' strend INTO nextserial .
WHEN '2' .
CONCATENATE strstart '3' strend INTO nextserial .
WHEN '3' .
CONCATENATE strstart '4' strend INTO nextserial .
WHEN '4' .
CONCATENATE strstart '5' strend INTO nextserial .
WHEN '5' .
CONCATENATE strstart '6' strend INTO nextserial .
WHEN '6' .
CONCATENATE strstart '7' strend INTO nextserial .
WHEN '7' .
CONCATENATE strstart '8' strend INTO nextserial .
WHEN '8' .
CONCATENATE strstart '9' strend INTO nextserial .
WHEN '9' .
CONCATENATE strstart 'A' strend INTO nextserial .
WHEN 'A' .
CONCATENATE strstart 'B' strend INTO nextserial .
WHEN 'B' .
CONCATENATE strstart 'C' strend INTO nextserial .
WHEN 'C' .
CONCATENATE strstart 'D' strend INTO nextserial .
WHEN 'D' .
CONCATENATE strstart 'E' strend INTO nextserial .
WHEN 'E' .
CONCATENATE strstart 'F' strend INTO nextserial .
WHEN 'F' .
CONCATENATE strstart 'G' strend INTO nextserial .
WHEN 'G' .
CONCATENATE strstart 'H' strend INTO nextserial .
WHEN 'H' .
CONCATENATE strstart 'I' strend INTO nextserial .
WHEN 'I' .
CONCATENATE strstart 'J' strend INTO nextserial .
WHEN 'J' .
CONCATENATE strstart 'K' strend INTO nextserial .
WHEN 'K' .
CONCATENATE strstart 'L' strend INTO nextserial .
WHEN 'L' .
CONCATENATE strstart 'M' strend INTO nextserial .
WHEN 'M' .
CONCATENATE strstart 'N' strend INTO nextserial .
WHEN 'N' .
CONCATENATE strstart 'O' strend INTO nextserial .
WHEN 'O' .
CONCATENATE strstart 'P' strend INTO nextserial .
WHEN 'P' .
CONCATENATE strstart 'Q' strend INTO nextserial .
WHEN 'Q' .
CONCATENATE strstart 'R' strend INTO nextserial .
WHEN 'R' .
CONCATENATE strstart 'S' strend INTO nextserial .
WHEN 'S' .
CONCATENATE strstart 'T' strend INTO nextserial .
WHEN 'T' .
CONCATENATE strstart 'U' strend INTO nextserial .
WHEN 'U' .
CONCATENATE strstart 'V' strend INTO nextserial .
WHEN 'V' .
CONCATENATE strstart 'W' strend INTO nextserial .
WHEN 'W' .
CONCATENATE strstart 'X' strend INTO nextserial .
WHEN 'X' .
CONCATENATE strstart 'Y' strend INTO nextserial .
WHEN 'Y' .
CONCATENATE strstart 'Z' strend INTO nextserial .
ENDCASE .
ENDIF .
ELSE .
s_forward = 1 . "有 'Z''字符需要查找前一个字符
flag = 1 .
ENDIF .
i = i + 1 .
ENDWHILE .
s2 = serialitem .
n1 = n1 + 1 .
ENDLOOP .
SHIFT s_sernr LEFT DELETING LEADING ',' .
WRITE : 's_sernr' ,s_sernr .
ENDFORM . "getdata*&---------------------------------------------------------------------*
LOOP AT itab .
DATA : i TYPE i , len TYPE i .
DATA : s_forward TYPE i .
i = 1 .
len = 0 .
s_forward = 1 .
DATA :serialitem TYPE string .
DATA :nextserial TYPE string .
DATA :flag TYPE i .
flag = 0 .
serialitem = itab -sernr .
DATA : s1 TYPE string , s2 TYPE string .
DATA : itablen TYPE i .
itablen = lines ( itab ) .
IF itablen = 1 .
s_sernr = serialitem . "只有一条序列号
ENDIF .
IF itablen > 1 . "有多个序列号
IF n1 = 1 AND serialitem = nextserial . "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
s1 = s2 .
ENDIF .
IF n1 = 1 AND serialitem <> nextserial . "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
s1 = serialitem .
CONCATENATE s_sernr s2 INTO s_sernr .
ENDIF .
IF n1 > 1 AND serialitem <> nextserial AND n1 <> itablen - 1 . "循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr .
s1 = serialitem .
ENDIF .
IF n1 = itablen - 1 AND serialitem = nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
s2 = serialitem .
CONCATENATE s_sernr ',' s1 '-' s2 INTO s_sernr .
ENDIF .
IF n1 = itablen - 1 AND serialitem <> nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
CONCATENATE s_sernr ',' s1 '-' s2 ',' serialitem INTO s_sernr .
ENDIF .
ENDIF .
"判断字符串是不是全是‘Z'',如果全是'Z'进位1
len = strlen ( serialitem ) .
DATA :zflag TYPE i , t TYPE i , zchar TYPE c .
DATA : zstring TYPE string .
zstring = '' .
zflag = 0 .
t = 0 .
WHILE t < len .
zchar = serialitem+t ( 1 ) .
CONCATENATE zstring 'Z' INTO zstring .
t = t + 1 .
ENDWHILE .
IF zstring = serialitem . "如果字符串是全'Z',则进位1,后补0
t = 0 .
zstring = '1' .
WHILE t < len .
CONCATENATE zstring '0' INTO zstring .
t = t + 1 .
ENDWHILE .
nextserial = zstring .
ENDIF .
WHILE i <= len AND s_forward = 1 .
DATA :strstart TYPE string , strmid TYPE string , strend TYPE string .
DATA :endchar TYPE c .
DATA :point TYPE i , p1 TYPE i , n TYPE i .
point = len - i .
p1 = point + 1 .
n = i - 1 .
endchar = serialitem+point ( 1 ) .
IF endchar <> 'Z' . "如果字符不为’Z‘’
s_forward = 0 . "s_forward为0则不进行while循环了
strstart = serialitem+0 (point ) .
IF flag = 0 . "flag为0表示不需要进位加 1
strend = serialitem+p1 (n ) .
CASE endchar .
WHEN '0' .
CONCATENATE strstart '1' strend INTO nextserial .
WHEN '1' .
CONCATENATE strstart '2' strend INTO nextserial .
WHEN '2' .
CONCATENATE strstart '3' strend INTO nextserial .
WHEN '3' .
CONCATENATE strstart '4' strend INTO nextserial .
WHEN '4' .
CONCATENATE strstart '5' strend INTO nextserial .
WHEN '5' .
CONCATENATE strstart '6' strend INTO nextserial .
WHEN '6' .
CONCATENATE strstart '7' strend INTO nextserial .
WHEN '7' .
CONCATENATE strstart '8' strend INTO nextserial .
WHEN '8' .
CONCATENATE strstart '9' strend INTO nextserial .
WHEN '9' .
CONCATENATE strstart 'A' strend INTO nextserial .
WHEN 'A' .
CONCATENATE strstart 'B' strend INTO nextserial .
WHEN 'B' .
CONCATENATE strstart 'C' strend INTO nextserial .
WHEN 'C' .
CONCATENATE strstart 'D' strend INTO nextserial .
WHEN 'D' .
CONCATENATE strstart 'E' strend INTO nextserial .
WHEN 'E' .
CONCATENATE strstart 'F' strend INTO nextserial .
WHEN 'F' .
CONCATENATE strstart 'G' strend INTO nextserial .
WHEN 'G' .
CONCATENATE strstart 'H' strend INTO nextserial .
WHEN 'H' .
CONCATENATE strstart 'I' strend INTO nextserial .
WHEN 'I' .
CONCATENATE strstart 'J' strend INTO nextserial .
WHEN 'J' .
CONCATENATE strstart 'K' strend INTO nextserial .
WHEN 'K' .
CONCATENATE strstart 'L' strend INTO nextserial .
WHEN 'L' .
CONCATENATE strstart 'M' strend INTO nextserial .
WHEN 'M' .
CONCATENATE strstart 'N' strend INTO nextserial .
WHEN 'N' .
CONCATENATE strstart 'O' strend INTO nextserial .
WHEN 'O' .
CONCATENATE strstart 'P' strend INTO nextserial .
WHEN 'P' .
CONCATENATE strstart 'Q' strend INTO nextserial .
WHEN 'Q' .
CONCATENATE strstart 'R' strend INTO nextserial .
WHEN 'R' .
CONCATENATE strstart 'S' strend INTO nextserial .
WHEN 'S' .
CONCATENATE strstart 'T' strend INTO nextserial .
WHEN 'T' .
CONCATENATE strstart 'U' strend INTO nextserial .
WHEN 'U' .
CONCATENATE strstart 'V' strend INTO nextserial .
WHEN 'V' .
CONCATENATE strstart 'W' strend INTO nextserial .
WHEN 'W' .
CONCATENATE strstart 'X' strend INTO nextserial .
WHEN 'X' .
CONCATENATE strstart 'Y' strend INTO nextserial .
WHEN 'Y' .
CONCATENATE strstart 'Z' strend INTO nextserial .
ENDCASE .
ELSE . "flag为 1 需要进位加 1 ,如123Z 进位变为1240
DATA : m TYPE i .
m = 0 .
WHILE m < i - 1 .
CONCATENATE strend '0' INTO strend .
m = m + 1 .
ENDWHILE .
CASE endchar .
WHEN '0' .
CONCATENATE strstart '1' strend INTO nextserial .
WHEN '1' .
CONCATENATE strstart '2' strend INTO nextserial .
WHEN '2' .
CONCATENATE strstart '3' strend INTO nextserial .
WHEN '3' .
CONCATENATE strstart '4' strend INTO nextserial .
WHEN '4' .
CONCATENATE strstart '5' strend INTO nextserial .
WHEN '5' .
CONCATENATE strstart '6' strend INTO nextserial .
WHEN '6' .
CONCATENATE strstart '7' strend INTO nextserial .
WHEN '7' .
CONCATENATE strstart '8' strend INTO nextserial .
WHEN '8' .
CONCATENATE strstart '9' strend INTO nextserial .
WHEN '9' .
CONCATENATE strstart 'A' strend INTO nextserial .
WHEN 'A' .
CONCATENATE strstart 'B' strend INTO nextserial .
WHEN 'B' .
CONCATENATE strstart 'C' strend INTO nextserial .
WHEN 'C' .
CONCATENATE strstart 'D' strend INTO nextserial .
WHEN 'D' .
CONCATENATE strstart 'E' strend INTO nextserial .
WHEN 'E' .
CONCATENATE strstart 'F' strend INTO nextserial .
WHEN 'F' .
CONCATENATE strstart 'G' strend INTO nextserial .
WHEN 'G' .
CONCATENATE strstart 'H' strend INTO nextserial .
WHEN 'H' .
CONCATENATE strstart 'I' strend INTO nextserial .
WHEN 'I' .
CONCATENATE strstart 'J' strend INTO nextserial .
WHEN 'J' .
CONCATENATE strstart 'K' strend INTO nextserial .
WHEN 'K' .
CONCATENATE strstart 'L' strend INTO nextserial .
WHEN 'L' .
CONCATENATE strstart 'M' strend INTO nextserial .
WHEN 'M' .
CONCATENATE strstart 'N' strend INTO nextserial .
WHEN 'N' .
CONCATENATE strstart 'O' strend INTO nextserial .
WHEN 'O' .
CONCATENATE strstart 'P' strend INTO nextserial .
WHEN 'P' .
CONCATENATE strstart 'Q' strend INTO nextserial .
WHEN 'Q' .
CONCATENATE strstart 'R' strend INTO nextserial .
WHEN 'R' .
CONCATENATE strstart 'S' strend INTO nextserial .
WHEN 'S' .
CONCATENATE strstart 'T' strend INTO nextserial .
WHEN 'T' .
CONCATENATE strstart 'U' strend INTO nextserial .
WHEN 'U' .
CONCATENATE strstart 'V' strend INTO nextserial .
WHEN 'V' .
CONCATENATE strstart 'W' strend INTO nextserial .
WHEN 'W' .
CONCATENATE strstart 'X' strend INTO nextserial .
WHEN 'X' .
CONCATENATE strstart 'Y' strend INTO nextserial .
WHEN 'Y' .
CONCATENATE strstart 'Z' strend INTO nextserial .
ENDCASE .
ENDIF .
ELSE .
s_forward = 1 . "有 'Z''字符需要查找前一个字符
flag = 1 .
ENDIF .
i = i + 1 .
ENDWHILE .
s2 = serialitem .
n1 = n1 + 1 .
ENDLOOP .
SHIFT s_sernr LEFT DELETING LEADING ',' .
WRITE : 's_sernr' ,s_sernr .
ENDFORM . "getdata*&---------------------------------------------------------------------*