代码
*&---------------------------------------------------------------------*
*& Report YP0002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT YP0002 LINE-SIZE 500.TYPES :BEGIN OF TYPP_S_HEAD ,KEY1 TYPE CHAR15,VALUE1 TYPE CHAR15,END OF TYPP_S_HEAD .TYPES : TYPP_T_HEAD TYPE STANDARD TABLE OF TYPP_S_HEAD .TYPES :BEGIN OF TYPP_S_DATA ,KEY1 TYPE CHAR15,KEY2 TYPE CHAR15,VALUE1 TYPE CHAR15,VALUE2 TYPE CHAR15,VALUE3 TYPE CHAR15,END OF TYPP_S_DATA .TYPES : TYPP_T_DATA TYPE STANDARD TABLE OF TYPP_S_DATA .*----------------------------------------------------
*----------------------------------------------------
*----------------------------------------------------
PARAMETERS P_CNT TYPE I DEFAULT '10000' OBLIGATORY.PARAMETERS P_FROM TYPE I OBLIGATORY.
PARAMETERS P_TO TYPE I OBLIGATORY.PARAMETERS RB_1 RADIOBUTTON GROUP R1.
PARAMETERS RB_2 RADIOBUTTON GROUP R1.*----------------------------------------------------
*----------------------------------------------------
*----------------------------------------------------
INITIALIZATION.P_FROM = P_CNT * '0.90' .P_TO = P_FROM + 1 .*----------------------------------------------------
*----------------------------------------------------
*----------------------------------------------------
AT SELECTION-SCREEN.P_FROM = P_CNT * '0.90' .P_TO = P_FROM + 1 .*----------------------------------------------------
*----------------------------------------------------
*----------------------------------------------------
START-OF-SELECTION .CHECK P_CNT > 0.IF P_CNT > 20000.MESSAGE S000(ZMSG001) WITH '不可以执行' DISPLAY LIKE 'E'.LEAVE TO LIST-PROCESSING.ENDIF.DATA LS_HEAD TYPE TYPP_S_HEAD.DATA LT_HEAD TYPE TYPP_T_HEAD.DATA LS_DATA TYPE TYPP_S_DATA.DATA LT_DATA TYPE TYPP_T_DATA.DATA LW_IDX1 TYPE NUMC09 VALUE '0'.DATA LW_IDX2 TYPE NUMC09 VALUE '0'.DATA LW_IDX_READ TYPE I.FIELD-SYMBOLS <LFS_DATA> TYPE TYPP_S_DATA.*----------------------------------------------------"循环P_CNT次DO P_CNT TIMES.LW_IDX1 = LW_IDX1 + 1.LS_HEAD-KEY1 = 'K' && LW_IDX1 .LS_HEAD-VALUE1 = 'V' && LW_IDX1 .APPEND LS_HEAD TO LT_HEAD.CLEAR LW_IDX2."循环10次DO 10 TIMES.LW_IDX2 = LW_IDX2 + 1."如果LW_IDX1在P_FROM 和 P_TO之间IF LW_IDX1 BETWEEN P_FROM AND P_TO .LS_DATA-KEY1 = LS_HEAD-KEY1.LS_DATA-KEY2 = '-Z' && LW_IDX2 .LS_DATA-VALUE1 = '-V' && LW_IDX2 .LS_DATA-VALUE2 = '-V' && LW_IDX2 .LS_DATA-VALUE3 = '-V' && LW_IDX2 .ELSE.LS_DATA-KEY1 = LS_HEAD-KEY1 .LS_DATA-KEY2 = '-P' && LW_IDX2 .LS_DATA-VALUE1 = '-A' && LW_IDX2 .LS_DATA-VALUE2 = '-B' && LW_IDX2 .LS_DATA-VALUE3 = '-C' && LW_IDX2 .ENDIF.APPEND LS_DATA TO LT_DATA.ENDDO.ENDDO.*----------------------------------------------------CHECK LT_HEAD IS NOT INITIAL.CHECK LT_DATA IS NOT INITIAL.*----------------------------------------------------GET TIME FIELD DATA(LW_TIME_S).
*----------------------------------------------------SORT LT_HEAD "按照KEY1升序排列BY KEY1 ASCENDING.SORT LT_DATA "按照KEY1和KEY2 升序排列BY KEY1 ASCENDINGKEY2 ASCENDING.CASE ABAP_ON.*----------------------------------------------------WHEN RB_1.WRITE: / '***** ***** *****' .WRITE: / '***** MODE 1 *****' .WRITE: / '***** ***** *****' ."使用LOOP套LOOP,循环读取,如果是-Z开头的,那么就修改VALUE1,VALUE2,VALUE3的数值LOOP AT LT_HEAD INTO LS_HEAD. "循环headLOOP AT LT_DATA INTO LS_DATA WHERE KEY1 = LS_HEAD-KEY1. "循环data,使用键值key1读取IF LS_DATA-KEY2+(2) = '-Z' .LS_DATA-VALUE1 = '-TEST'.LS_DATA-VALUE2 = '-TEST'.LS_DATA-VALUE3 = '-TEST'.MODIFY LT_DATA FROM LS_DATA .WRITE: / LS_DATA .ELSE.EXIT.ENDIF.ENDLOOP.ENDLOOP.*----------------------------------------------------WHEN RB_2.WRITE: / '***** ***** *****' .WRITE: / '***** MODE 2 *****' .WRITE: / '***** ***** *****' ."使用LOOP套LOOP(优化过后的),循环读取,如果是-Z开头的,那么就修改VALUE1,VALUE2,VALUE3的数值"1、循环headLOOP AT LT_HEAD INTO LS_HEAD."2、先读取data,使用键值key1读取" 并且使用二分法读取,节省一半时间,但是要非常注意,LT_DATA必须按照读取的关键字字段升序排列,否则读取不成功READ TABLE LT_DATATRANSPORTING NO FIELDS BINARY SEARCHWITH KEY KEY1 = LS_HEAD-KEY1 ."3、如果读取不成功,说明此时的key1不存在,无需继续执行第二个loop,跳出此次循环,进入下一次循环IF SY-SUBRC <> 0.CONTINUE.ENDIF."4、如果读取成功,会进入到这里,将当前读取到的索引放到LW_IDX_READ字段" SY-TABIX是用来记录循环的次数或者索引的,并且的话,sy-tabix只能在loop和read table的时候生效LW_IDX_READ = SY-TABIX."5、进入第二个循环,从读取成功的索引开始读取数据LOOP AT LT_DATA ASSIGNING <LFS_DATA> FROM LW_IDX_READ. "FROM:从FROM 后面指定的行号开始读,"6、如果当前循环DATA得到的<LFS_DATA>-KEY1 和 当前的head-KEY1相等并且 <LFS_DATA>的KEY2+(2) = ’-Z' 的条件满足;"条件满足,则修改VALUE1,VALUE2,VALUE3的数值为 -TEST2"KEY2+(2)也就是KEY2的前两位 = '-Z'IF <LFS_DATA>-KEY1 = LS_HEAD-KEY1 AND<LFS_DATA>-KEY2+(2) = '-Z' .<LFS_DATA>-VALUE1 = '-TEST2'.<LFS_DATA>-VALUE2 = '-TEST2'.<LFS_DATA>-VALUE3 = '-TEST2'.WRITE: / <LFS_DATA> ."7、如果条件不满足,说明当前循环到的数据已经不是我们需要的数据了,直接退出当前的循环ELSE.EXIT.ENDIF.ENDLOOP.ENDLOOP.WHEN OTHERS.ENDCASE.*----------------------------------------------------GET TIME FIELD DATA(LW_TIME_E).
*----------------------------------------------------DATA LW_COST TYPE I.LW_COST = LW_TIME_E - LW_TIME_S.WRITE: / '***** START TIME :' , LW_TIME_S.WRITE: / '***** END TIME :' , LW_TIME_E.WRITE: / '***** COST TIME :' , LW_COST.
运行结果
