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

来源:互联网 发布:js获取数组前几个元素 编辑:程序博客网 时间:2024/06/07 21:07
 字符串不能整体做加法 但是我们可以模拟加法
字符集就是 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.
    DATATYPE ilen TYPE i.
    DATAs_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.


    DATAs1 TYPE strings2 TYPE string.
    DATAitablen TYPE i.
    itablen linesitab ).

    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 strlenserialitem ).
    DATA:zflag TYPE iTYPE izchar TYPE c.
    DATAzstring 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 stringstrmid TYPE stringstrend TYPE string.
      DATA:endchar TYPE c.
      DATA:point TYPE ip1 TYPE iTYPE 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*&---------------------------------------------------------------------*
原创粉丝点击