09-12-2014 6:49 PM
I have a requirement add 1 to the line no. whenever I add a record to the table. I have to search the table for the highest line number saved and add 1 to it. The trick is that when I get to 99, the next line number should be A1, and then A2 until A9. When I get to A9 I should go to B1, etc. until Z9.
How can I accomplish this?
09-12-2014 7:59 PM
Hi
Perhaps something like this can help you:
DATA: BEGIN OF ITAB OCCURS 0,
KEY(2) TYPE C,
END OF ITAB.
DATA: NUM_CHECK TYPE I.
DATA: NUM2(2) TYPE N.
DATA: NUM(1) TYPE N.
DATA: OFFSET TYPE I.
PARAMETERS: P_TIMES TYPE I.
DO P_TIMES TIMES.
SORT ITAB BY KEY DESCENDING.
READ TABLE ITAB INDEX 1.
IF SY-SUBRC <> 0.
ITAB-KEY = '01'.
ELSE.
IF ITAB-KEY CO '0123456789'.
MOVE ITAB-KEY TO NUM_CHECK.
IF NUM_CHECK < 99.
NUM_CHECK = NUM_CHECK + 1.
MOVE NUM_CHECK TO NUM2.
MOVE NUM2 TO ITAB-KEY.
ELSE.
ITAB-KEY = 'A1'.
ENDIF.
ELSE.
MOVE ITAB-KEY+1 TO NUM.
IF NUM < 9.
NUM = NUM + 1.
ITAB-KEY+1(1) = NUM.
ELSE.
OFFSET = OFFSET + 1.
ITAB-KEY(1) = SY-ABCDE+OFFSET(1).
ITAB-KEY+1(1) = '1'.
ENDIF.
ENDIF.
ENDIF.
APPEND ITAB.
ENDDO.
SORT ITAB BY KEY.
LOOP AT ITAB.
WRITE: / ITAB-KEY.
ENDLOOP.
Max
09-12-2014 7:59 PM
Hi
Perhaps something like this can help you:
DATA: BEGIN OF ITAB OCCURS 0,
KEY(2) TYPE C,
END OF ITAB.
DATA: NUM_CHECK TYPE I.
DATA: NUM2(2) TYPE N.
DATA: NUM(1) TYPE N.
DATA: OFFSET TYPE I.
PARAMETERS: P_TIMES TYPE I.
DO P_TIMES TIMES.
SORT ITAB BY KEY DESCENDING.
READ TABLE ITAB INDEX 1.
IF SY-SUBRC <> 0.
ITAB-KEY = '01'.
ELSE.
IF ITAB-KEY CO '0123456789'.
MOVE ITAB-KEY TO NUM_CHECK.
IF NUM_CHECK < 99.
NUM_CHECK = NUM_CHECK + 1.
MOVE NUM_CHECK TO NUM2.
MOVE NUM2 TO ITAB-KEY.
ELSE.
ITAB-KEY = 'A1'.
ENDIF.
ELSE.
MOVE ITAB-KEY+1 TO NUM.
IF NUM < 9.
NUM = NUM + 1.
ITAB-KEY+1(1) = NUM.
ELSE.
OFFSET = OFFSET + 1.
ITAB-KEY(1) = SY-ABCDE+OFFSET(1).
ITAB-KEY+1(1) = '1'.
ENDIF.
ENDIF.
ENDIF.
APPEND ITAB.
ENDDO.
SORT ITAB BY KEY.
LOOP AT ITAB.
WRITE: / ITAB-KEY.
ENDLOOP.
Max
09-12-2014 9:48 PM
I marked it as correct as I ran it and gave the output I wanted, but what if it wasn't from A1-A9 and instead it was from A1 to AZ?
09-13-2014 11:09 AM
The logic is the same, but it needs to check the second char:
DATA: BEGIN OF ITAB OCCURS 0,
KEY(2) TYPE C,
END OF ITAB.
PARAMETERS: P_TIMES TYPE I.
DO P_TIMES TIMES.
SORT ITAB BY KEY DESCENDING.
READ TABLE ITAB INDEX 1.
IF SY-SUBRC <> 0.
ITAB-KEY = '01'.
ELSE.
IF ITAB-KEY CO '0123456789'.
PERFORM NUM_CHECK USING ITAB-KEY 99.
ELSE.
IF ITAB-KEY+1(1) CO '0123456789'.
PERFORM NUM_CHECK USING ITAB-KEY+1(1) 9.
ELSE.
IF ITAB-KEY+1(1) <> 'Z'.
PERFORM CHECK_ABC USING ITAB-KEY+1(1) SPACE.
ELSE.
PERFORM CHECK_ABC USING ITAB-KEY(1) 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
APPEND ITAB.
ENDDO.
SORT ITAB BY KEY.
LOOP AT ITAB.
WRITE: / ITAB-KEY.
ENDLOOP.
FORM NUM_CHECK USING P_IN P_MAX TYPE I.
DATA: NUM(2) TYPE N.
DATA: NUM_CHECK TYPE I.
MOVE P_IN TO NUM_CHECK.
IF NUM_CHECK < P_MAX.
NUM_CHECK = NUM_CHECK + 1.
MOVE NUM_CHECK TO NUM.
CASE P_MAX.
WHEN 9. MOVE NUM+1 TO ITAB-KEY+1.
WHEN 99. MOVE NUM TO ITAB-KEY.
ENDCASE.
ELSE.
CASE P_MAX.
WHEN 9. ITAB-KEY+1(1) = 'A'.
WHEN 99. ITAB-KEY = 'A1'.
ENDCASE.
ENDIF.
ENDFORM.
FORM CHECK_ABC USING P_IN
P_START.
DATA: OFFSET TYPE I.
FIND P_IN IN SY-ABCDE MATCH OFFSET OFFSET.
OFFSET = OFFSET + 1.
P_IN = SY-ABCDE+OFFSET(1).
CHECK P_START = 'X'.
ITAB-KEY+1(1) = 1.
ENDFORM.