字符串加法(判断序列号是否连续)

 字符串不能整体做加法 但是我们可以模拟加法
字符集就是 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 .
sort itab by sernr.
   LOOP  AT itab .
     DATA TYPE  i len  TYPE  i .
     DATA s_forward  TYPE  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  AND serialitem  nextserial .   "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号相等
        s1  s2 .
       ENDIF .
       IF n1  AND serialitem <> nextserial .   "循环到第二个数据并且这个数据和前第一个数据算出来的下一个序列号不相等
        s1  serialitem .
         CONCATENATE s_sernr s2   INTO s_sernr .
       ENDIF .
       IF n1 >  AND serialitem <> nextserial  AND n1 <> itablen  1 "循环到第二个序列号后面的序列号,并且当前序列号和上个序列号算出来的下个序列号不等并且不是最后一个序列号
         CONCATENATE s_sernr  ','  s1  '-' s2  INTO s_sernr .
        s1  serialitem .
       ENDIF .
       IF n1  itablen  AND serialitem  nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号相等
        s2  serialitem .
         CONCATENATE s_sernr  ',' s1  '-' s2  INTO s_sernr .
       ENDIF .
       IF n1  itablen  AND serialitem <> nextserial . "如果是最后一个序列号并且最后一个序列号和倒数第二个序列号算出来的下一个序列号不相等
         CONCATENATE s_sernr  ',' s1  '-' s2  ',' serialitem  INTO s_sernr .
       ENDIF .
     ENDIF .

     "判断字符串是不是全是‘Z'',如果全是'Z'进位1
    len  strlen serialitem  ) .
     DATA :zflag  TYPE  i 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   <= 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 TYPE  i .
      point  len  i .
      p1  point +  1 .
      n  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 : TYPE  i .
           0 .
           WHILE  1 .
             CONCATENATE strend  '0'  INTO strend .
             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  1 .
     ENDWHILE .
    s2  serialitem .
    n1  n1 +  1 .
   ENDLOOP .

   SHIFT s_sernr  LEFT DELETING  LEADING  ',' .
   WRITE : 's_sernr'  ,s_sernr .
ENDFORM .                     "getdata*&---------------------------------------------------------------------*
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值