首页 > 其他分享 >ABAP READ内表新老语法对比

ABAP READ内表新老语法对比

时间:2023-03-27 18:55:23浏览次数:52  
标签:gs 内表新 acd READ lt lv ABAP rbukrs -----------------------------

1、读取内表行新语法

740新语法中,对标READ,提出了新的语法,如下:

1.1、根据字段值查找

"-----------------------------@斌将军-----------------------------
"老语法
READ TABLE lt_acd INTO ls_acd WITH KEY rbukrs = gs_acd-rbukrs.
IF sy-subrc EQ 0.

ENDIF.

"新语法
ls_acd = lt_acd[ rbukrs = gs_acd-rbukrs ].
"-----------------------------@斌将军-----------------------------

1.2、按索引查找

"-----------------------------@斌将军-----------------------------
"老语法
READ TABLE lt_acd INTO ls_acd INDEX 1.
IF sy-subrc EQ 0.

ENDIF.

"新语法
ls_acd = lt_acd[ 1 ].
"-----------------------------@斌将军-----------------------------

1.3、判断记录是否存在

"-----------------------------@斌将军-----------------------------
"老语法
READ TABLE lt_acd WITH KEY rbukrs = gs_acd-rbukrs TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.

ENDIF.

"新语法
IF LINE_EXISTS( lt_acd[ rbukrs = gs_acd-rbukrs ] ).
    
ENDIF.
"-----------------------------@斌将军-----------------------------

 1.4、获取行索引

"-----------------------------@斌将军-----------------------------
"老语法
READ TABLE lt_acd WITH KEY rbukrs = gs_acd-rbukrs TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
WRITE:SY-TABIX.
ENDIF.

"新语法
LV_INDEX = LINE_INDEX( lt_acd[ rbukrs = gs_acd-rbukrs ] ).
"-----------------------------@斌将军-----------------------------

需要特别注意的是,新语法必须用TRY CATCH,或在查询前,用LINE_EXISTS()判断是否存在,否则将会导致DUMP

TRY .
    ls_acd = lt_acd[ rbukrs = '333' ].
CATCH cx_sy_itab_line_not_found .
    MESSAGE '未找到数据' TYPE 'E' .
ENDTRY.

"或

IF line_exists( lt_acd[ rbukrs = '333' ] ).
  ls_acd = lt_acd[ rbukrs = '333' ].
ELSE.
  MESSAGE '未找到数据' TYPE 'E' .
ENDIF.

2.效率对比

由于老语法可以使用二分法查找,因此在效率上将会有差异。

现编写一个实例,循环2万条数据GT_ACD,并循环查询有14万条数据的LT_ACD中对应的值。下边测试各种情况下的查询速度

2.1、新语法

"-----------------------------@斌将军-----------------------------
"1.测试新语法------------------------------------
GET TIME STAMP FIELD lv_current1.
CLEAR:lv_index.
LOOP AT gt_acd INTO gs_acd.
  lv_index = lv_index + 1.
  TRY .
      ls_acd = lt_acd[ rbukrs = gs_acd-rbukrs gjahr = gs_acd-gjahr  belnr = gs_acd-belnr docln = gs_acd-docln ].
    CATCH cx_sy_itab_line_not_found .
      MESSAGE '未找到数据' TYPE 'E' .
  ENDTRY.
ENDLOOP.
GET TIME STAMP FIELD lv_current2.
"-----------------------------@斌将军-----------------------------

结果:

2.2、老语法READ

"-----------------------------@斌将军-----------------------------
"2.测试老语法------------------------------------
GET TIME STAMP FIELD lv_current1.
CLEAR:lv_index.
LOOP AT gt_acd INTO gs_acd.
  lv_index = lv_index + 1.
  READ TABLE lt_acd INTO ls_acd WITH KEY rbukrs = gs_acd-rbukrs
                                          gjahr = gs_acd-gjahr
                                          belnr = gs_acd-belnr
                                          docln = gs_acd-docln.
  IF sy-subrc EQ 0.

  ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_current2.
"-----------------------------@斌将军-----------------------------

结果:

2.3、老语法READ二分查找

"-----------------------------@斌将军-----------------------------
GET TIME STAMP FIELD lv_current1.
CLEAR:lv_index.
SORT lt_acd BY rbukrs gjahr belnr docln.
LOOP AT gt_acd INTO gs_acd.

  READ TABLE lt_acd INTO ls_acd WITH KEY rbukrs = gs_acd-rbukrs
                                          gjahr = gs_acd-gjahr
                                          belnr = gs_acd-belnr
                                          docln = gs_acd-docln BINARY SEARCH.
  IF sy-subrc EQ 0.
    lv_index = lv_index + 1.
  ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_current2.
"-----------------------------@斌将军-----------------------------

结果:< 1S

 2.4、新语法+排序表

"-----------------------------@斌将军-----------------------------
"4.测试新语法+排序表------------------------------------
lt_acd_sort = lt_acd.
GET TIME STAMP FIELD lv_current1.
CLEAR:lv_index.
LOOP AT gt_acd INTO gs_acd.
  lv_index = lv_index + 1.
  TRY .
      ls_acd = lt_acd_sort[ rbukrs = gs_acd-rbukrs gjahr = gs_acd-gjahr  belnr = gs_acd-belnr docln = gs_acd-docln ].
    CATCH cx_sy_itab_line_not_found .
      MESSAGE '未找到数据' TYPE 'E' .
  ENDTRY.
ENDLOOP.
GET TIME STAMP FIELD lv_current2.
"-----------------------------@斌将军-----------------------------

结果:< 1S

综上所述:不使用二分查找,则新老语法都很慢。使用二分查找或新语法搭配排序表,则速度都有非常明显的提升

 

    此页面的语言为英语   翻译为中文(简体)        
  • 中文(简体)
  • 中文(繁体)
  • 丹麦语
  • 乌克兰语
  • 乌尔都语
  • 亚美尼亚语
  • 俄语
  • 保加利亚语
  • 克罗地亚语
  • 冰岛语
  • 加泰罗尼亚语
  • 匈牙利语
  • 卡纳达语
  • 印地语
  • 印尼语
  • 古吉拉特语
  • 哈萨克语
  • 土耳其语
  • 威尔士语
  • 孟加拉语
  • 尼泊尔语
  • 布尔语(南非荷兰语)
  • 希伯来语
  • 希腊语
  • 库尔德语
  • 德语
  • 意大利语
  • 拉脱维亚语
  • 挪威语
  • 捷克语
  • 斯洛伐克语
  • 斯洛文尼亚语
  • 旁遮普语
  • 日语
  • 普什图语
  • 毛利语
  • 法语
  • 波兰语
  • 波斯语
  • 泰卢固语
  • 泰米尔语
  • 泰语
  • 海地克里奥尔语
  • 爱沙尼亚语
  • 瑞典语
  • 立陶宛语
  • 缅甸语
  • 罗马尼亚语
  • 老挝语
  • 芬兰语
  • 英语
  • 荷兰语
  • 萨摩亚语
  • 葡萄牙语
  • 西班牙语
  • 越南语
  • 阿塞拜疆语
  • 阿姆哈拉语
  • 阿尔巴尼亚语
  • 阿拉伯语
  • 韩语
  • 马尔加什语
  • 马拉地语
  • 马拉雅拉姆语
  • 马来语
  • 马耳他语
  • 高棉语
 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:gs,内表新,acd,READ,lt,lv,ABAP,rbukrs,-----------------------------
From: https://www.cnblogs.com/BinGeneral/p/17262525.html

相关文章

  • 【线程池】使用ThreadLocal请务必remove
    背景:在一次扫描中被提示:Field[SESSION_CONTEXT]oftypeThreadLocalmustcallremove()methodatleastonetimes.(line34)嗯?啥子情况?搜索了一下,发现:ThreadLo......
  • Thread 类 PowerMockito 模拟 Thread.sleep 抛出中断异常的场景
     想要在单元测试时,模拟Thread.sleep()时抛出中断异常的行为,但是仅使用PowerMockito.mockStatic(Thread.class)是不够的,上代码:要测试的方法getResult:publicclassWeek......
  • python-threading
    python-threading目录python-threadingthreadingThread创建线程Thread方法属性守护线程线程锁Lockthreading.Lockthreading.RLock事件对象EventConditionTimerimportthr......
  • Qt源码阅读(二) moveToThread
    Qt源码分析之moveToThread这一次,我们来看Qt中关于将一个QObject对象移动至一个线程的函数moveToThread目录Qt源码分析之moveToThreadQt使用线程的基本方法源码分析一些......
  • chatGPT帮忙解决一个百度不到答案的IReadOnlyCollection`1未定义或导入的问题
    一个c#老项目,不知道是因为什么时候批量替换了csproj的内容,还是因为我升级了vs每个升级版导致的。目前VisualStudioCommunity2022(64位)-Preview版本17.5.0Preview5.0......
  • Java ThreadLocal
    ThreadLocal的功能在Java多线程并发环境中非常实用,其作用是提供线程本地变量,例如用户ID、会话ID等与当前线程密切关联的信息。那么它在实际业务场景中可以怎么使用呢?让我们......
  • L11U6-01 Talking about a book you've read
    谈论故事使用类似表达引入故事:I'vejustfinishedreadingareallygoodbook. 我刚刚看完了一本很不错的书。It'saboutElizabeth,anhonest,lively,wittygirl. ......
  • linux部署tomcat,tomcat无法启动一直卡在starting ZkClient event thread的解决办法
    近期迁移服务到新的服务器,启动tomcat后,去网页访问时,发现无法访问,只能去看tomcat日志,发现日志里面一直卡在startingZkClienteventthread然后又去ps-ef|greptomcat......
  • RT-Thread BSP qemu-virt64-aarch64 挂载 ext4文件系统
    前言经常简单的配置,在RT-ThreadBSPqemu-virt64-aarch64上可以支持fat文件系统,但是如何支持ext4文件系统呢?经过验证,也是配置使能ext4就可以支持ext4软件包当前RT......
  • RT-Thread BSP qemu-virt64-aarch64 文件系统
    前言前面大体上搭建了RT-ThreadBSPqemu-virt64-aarch64的交叉编译环境,运行后发现,文件系统没有挂载上,感觉是没有mkfs。通过RT-Thread官方的文档,找到了解决方法创建独立......