当前位置: 首页 > news >正文

LOOP套LOOP,双LOOP优化,效率提升近30倍

文章目录

  • 代码
  • 运行结果

代码

*&---------------------------------------------------------------------*
*& 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_CNTDO 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."循环10DO 10 TIMES.LW_IDX2 = LW_IDX2 + 1."如果LW_IDX1P_FROMP_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            "按照KEY1KEY2 升序排列BY KEY1 ASCENDINGKEY2 ASCENDING.CASE ABAP_ON.*----------------------------------------------------WHEN  RB_1.WRITE: / '***** ***** *****' .WRITE: / '***** MODE 1 *****' .WRITE: / '***** ***** *****' ."使用LOOPLOOP,循环读取,如果是-Z开头的,那么就修改VALUE1VALUE2VALUE3的数值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: / '***** ***** *****' ."使用LOOPLOOP(优化过后的),循环读取,如果是-Z开头的,那么就修改VALUE1VALUE2VALUE3的数值"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' 的条件满足;"条件满足,则修改VALUE1VALUE2VALUE3的数值为 -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.

运行结果

在这里插入图片描述

http://www.dtcms.com/a/511390.html

相关文章:

  • iOS 混淆实战 多工具组合完成 IPA 混淆、加固与工程化落地(iOS混淆|IPA加固|无源码混淆|Ipa Guard|Swift Shield)
  • 计算机毕设java中学生心理健康管理系统 中学生心理健康管理的Java平台解决方案 Java技术驱动的中学心理健康管理系统研发
  • 模重复平方计算法
  • 温州网站制作套餐.net网站开发是什么对象开发
  • Tuning——CC调试(适用高通)
  • 【AI智能体开发】什么是LLM?如何在本地搭建属于自己的Ai智能体?
  • Leetcode+Java+图论+并查集
  • 网站代备案流程图越秀网站建设推广
  • 网站 app 公众号先做哪个网站建设实践
  • SpringBoot常用内置工具类使用示例
  • Qt和ffmpeg结合打造gb28181推流/支持udp和tcp被动以及tcp主动三种方式
  • 设计模式-工厂模式:解耦对象创建的设计艺术
  • UVa 1660 Cable TV Network
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 20--PO(POM) 设计模式和用例撰写
  • 网站建设年度计划申请了域名 网站怎么建设呢
  • 《黄雀》电视剧总结
  • 云计算与服务器概述
  • 【Java Web学习 | 第1篇】前端 - HTML
  • Jenkins流水线项目发布
  • 网站优化需要做什么烟台网站建设比较大的
  • CAN入侵检测系统IDS不行,用扩充白名单机制保证汽车功能安全需求
  • 微软Teams的Media bypass的介绍
  • 分布式一致性
  • 使用微软Agent Framework .NET构建智能代理应用
  • MOSHELL (10) : COLI 交互
  • 九江网站开发wordpress适合seo
  • 【JavaScript】some方法的详解与实战
  • 买机票便宜网站建设分站式二手车网站源码
  • windows配置hadoop环境
  • Java中的单例模式