CORRESPONDING

结构赋值语句,CORRESPONDING语句允许控制组件映射关系

*---------------------------------------------------------------------*
* 在ABAP 7.40之前,主要通过 MOVE-CORRESPONDING 来传递结构化数据,
* 但需要保持结构内部组件名称一致,否则数据将不会被传递,
* 而使用 CORRESPONDING 后,该语句在保持同名组件自动进行数据传递的基础上,
* MAPPING 可以允许我们将不同名称的组件映射到一起,
* EXCEPT 可以规避掉我们不需要传值的一些字段
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_DATA,MATNR TYPE MARA-MATNR,MTART TYPE MARA-MTART,MATKL TYPE MARA-MATKL,TEXT1 TYPE CHAR50,END OF TY_DATA.TYPES: BEGIN OF LTY_TABLE,MATNR_C TYPE MARA-MATNR,MTART   TYPE MARA-MTART,MATKL   TYPE MARA-MATKL,TEXT1   TYPE CHAR50,END OF LTY_TABLE.DATA LT_DATA TYPE TABLE OF TY_DATA.
DATA LT_TABLE TYPE TABLE OF LTY_TABLE.LT_DATA = VALUE #( ( MATNR = 'Material-001'MTART = 'WATR'MATKL = '1020'TEXT1 = 'First Material' )( MATNR = 'Material-002'MTART = 'WATR'MATKL = '1030'TEXT1 = 'Second Material' ) ).LT_TABLE = CORRESPONDING #( LT_DATAMAPPING MATNR_C = MATNREXCEPT  MATKL ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA  ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).


*---------------------------------------------------------------------*
* 在 MAPPING 语句中,需要注意两边的字段类型,以免类型不兼容而导致程序 dump
* 使用DEEP处理深层结构数据,相当于MOVE CORRESPONDING [ EXPANDING NESTED TABLES ]
*---------------------------------------------------------------------*
TYPES: BEGIN OF LTY_PROD_MAT,MATNR TYPE MATNR,MTART TYPE MTART,MATKL TYPE MATKL,BISMT TYPE BISMT,END OF LTY_PROD_MAT.DATA: BEGIN OF LS_PROD_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_PROD_MATS.TYPES: BEGIN OF LTY_SALES_MAT,MATNR TYPE MATNR,BISMT TYPE BISMT,MTART TYPE MTART,MATKL TYPE MATKL,END OF LTY_SALES_MAT.DATA: BEGIN OF LS_SALES_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_SALES_MAT,END OF LS_SALES_MATS.SELECT MATNR MTART MATKL BISMT FROM MARAINTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALSUP TO 3 ROWS.LS_PROD_MATS = CORRESPONDING #( DEEP LS_SALES_MATS ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_SALES_MATS-T_MATERIALS ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

*---------------------------------------------------------------------*
*  使用BASE保留初始数据,为内表赋值时相当于
*  MOVE CORRESPONDING [ KEEPING TARGET LINES ],
*  为结构赋值时类似于VALUE [ BASE ]
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_DATA,MATNR TYPE MARA-MATNR,MTART TYPE MARA-MTART,MATKL TYPE MARA-MATKL,TEXT1 TYPE CHAR50,END OF TY_DATA.DATA LT_DATA TYPE TABLE OF TY_DATA.
DATA LT_TABLE TYPE TABLE OF TY_DATA.LT_DATA = VALUE #( ( MATNR = 'Material-001'MTART = 'WATR'MATKL = '1020'TEXT1 = 'First Material' )( MATNR = 'Material-002'MTART = 'WATR'MATKL = '1030'TEXT1 = 'Second Material' ) ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).LT_TABLE = VALUE #( ( MATNR = 'Material-001'MTART = 'FOOD' )( MATNR = 'Material-002'MTART = 'WATR') ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).LT_TABLE = CORRESPONDING #( BASE ( LT_TABLE ) LT_DATA EXCEPT MATKL ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_TABLE ).

*---------------------------------------------------------------------*
* CORRESPONDING中可以从两个内表中引入数据,FORM子句后的内表结构需要定义为排序表或哈希表
* 该语法不能与DEEP/BASE关键字同时使用,但是可以使用MAPPING/EXCEPT
* 如下例所示,以表1为基表,根据USING定义的关联条件去表2查找数据,如果查找到,
* 则将表2的该条数据复写到表1对应的记录上并返回,否则直接返回表1的数据
* MAPPING/EXCEPT作用于表2数据复写到表1对应记录的过程中,特定条件下可以用来实现读取数据
* 并更新内表的操作,但是需要定义非标准表,有一定的局限性
*---------------------------------------------------------------------*
TYPES:BEGIN OF LTY_DATA,INDEX TYPE CHAR4,TEXT1 TYPE CHAR10,TEXT2 TYPE CHAR10,END OF LTY_DATA.DATA: LT_TMP1 TYPE SORTED TABLE OF LTY_DATA WITH UNIQUE KEY INDEX,LT_TMP2 TYPE SORTED TABLE OF LTY_DATA WITH UNIQUE KEY INDEX,LT_DATA TYPE TABLE OF LTY_DATA.LT_TMP1 = VALUE #( ( INDEX = '0001' TEXT1 = 'X' )( INDEX = '0004' TEXT1 = 'X' )( INDEX = '0009' TEXT1 = 'X' )( INDEX = '0021' TEXT1 = 'X' ) ).LT_TMP2 = VALUE #( ( INDEX = '0001' TEXT2 = 'Y' )( INDEX = '0002' TEXT2 = 'Y' )( INDEX = '0003' TEXT2 = 'Y' )( INDEX = '0004' TEXT2 = 'Y' ) ).LT_DATA = CORRESPONDING #( LT_TMP1 FROM LT_TMP2 USING INDEX = INDEX )."from后表的数据传递给前表,按照using后条件操作”
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).LT_DATA = CORRESPONDING #( LT_TMP1 FROM LT_TMP2 USING INDEX = INDEX EXCEPT TEXT1 )."可以使用mapping和except”
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_DATA ).

MOVE-CORRESPONDING(DEEP)

在 ABAP 7.40 后,MOVE-CORRESPONDING语句针对深层结构赋值进行了扩展,并且允许保留结构在被赋值前的数据

*---------------------------------------------------------------------*
* 在深层结构中使用 MOVE-CORRESPONDING传递数据时,需要保持嵌套的深层次结构一致,
* 包括字段名以及顺序等,否则数据会错位
*---------------------------------------------------------------------*
TYPES: BEGIN OF LTY_PROD_MAT,MATNR TYPE MATNR,MTART TYPE MTART,MATKL TYPE MATKL,BISMT TYPE BISMT,END OF LTY_PROD_MAT.DATA: BEGIN OF LS_PROD_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_PROD_MATS.DATA: BEGIN OF LS_SALES_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_SALES_MATS.SELECT MATNR MTART MATKL BISMT FROM MARAINTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALSUP TO 3 ROWS.MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS.CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_SALES_MATS-T_MATERIALS ).
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

*---------------------------------------------------------------------*
* 使用 EXPANDING NESTED TABLES 避免因结构不一致而导致的数据异常,
* 对于深层结构,只有相同名称的字段被复制,且不需要它们顺序相同,
* 但是该语句只考虑第一级的深层次结构,不适用于更深层次的数据
*---------------------------------------------------------------------*
TYPES: BEGIN OF LTY_PROD_MAT,MATNR TYPE MATNR,MTART TYPE MTART,MATKL TYPE MATKL,BISMT TYPE BISMT,END OF LTY_PROD_MAT.DATA: BEGIN OF LS_PROD_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_PROD_MATS.DATA: BEGIN OF LS_SALES_MATS,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,SECTION     TYPE CHAR10,END OF LS_SALES_MATS.SELECT MATNR MTART MATKL BISMT FROM MARAINTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALSUP TO 3 ROWS.MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).MOVE-CORRESPONDING LS_SALES_MATS TO LS_PROD_MATS EXPANDING NESTED TABLES.
CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LS_PROD_MATS-T_MATERIALS  ).

*---------------------------------------------------------------------*
* 在使用 MOVE-CORRESPONDING 时,默认都会先清空目标结构的数据,
* 再将数据填充到结构里面,当我们需要保留目标结构原有的数据时,
* 可以使用 KEEPING TARGET LINES 语句,该语句适用于表结构赋值,
* 且不会修改原有的记录,仅添加需要填充的数据
*---------------------------------------------------------------------*
TYPES: BEGIN OF LTY_PROD_MAT,MATNR TYPE MATNR,MTART TYPE MTART,MATKL TYPE MATKL,BISMT TYPE BISMT,END OF LTY_PROD_MAT.DATA: BEGIN OF LS_PROD_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_PROD_MATS.DATA: BEGIN OF LS_SALES_MATS,SECTION     TYPE CHAR10,T_MATERIALS TYPE TABLE OF LTY_PROD_MAT,END OF LS_SALES_MATS.SELECT MATNR MTART MATKL BISMTFROM MARAINTO CORRESPONDING FIELDS OF TABLE LS_SALES_MATS-T_MATERIALSUP TO 4 ROWS.SELECT MATNR MTART MATKL BISMTFROM MARAINTO CORRESPONDING FIELDS OF TABLE LS_PROD_MATS-T_MATERIALSUP TO 1 ROWS.MOVE-CORRESPONDING LS_SALES_MATS-T_MATERIALS TO LS_PROD_MATS-T_MATERIALS KEEPING TARGET LINES.

REDUCE

REDUCE赋值语句一般用于需要循环处理的数据。
注意:和value赋值语句中的for类似,但是更加复杂,使用前注意理清楚逻辑,不建议使用。

*---------------------------------------------------------------------*
*  一般情况下,我们可以使用 REDUCE 来统计内表中特定条件的记录条数,
*  或是汇总/拼接内表的部分字段
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_DATA,MATNR TYPE MARA-MATNR,MTART TYPE MARA-MTART,MATKL TYPE MARA-MATKL,INT   TYPE INT8,END OF TY_DATA.
DATA LT_DATA TYPE TABLE OF TY_DATA.LT_DATA = VALUE #( ( MATNR = 'Material-001'MTART = 'WATR'MATKL = '1020'INT   = 10086 )( MATNR = 'Material-002'MTART = 'WATR'MATKL = '1030'INT   = 666 ) ).DATA(LV_LINES) = REDUCE #( INIT LV_RESULT = 0FOR LS_DATA IN LT_DATA WHERE ( MATKL = '1020' )NEXT LV_RESULT = LV_RESULT + 1 ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LV_LINES ).

*---------------------------------------------------------------------*
* REDUCE语句中可以使用UNTIL关键字,在使用时需要注意 NEXT 语句至少会被执行一次,
* 作用类似于DO循环,限制条件可以自行定义
*---------------------------------------------------------------------*
TYPES: BEGIN OF TY_DATA,MATNR TYPE MARA-MATNR,MTART TYPE MARA-MTART,MATKL TYPE MARA-MATKL,INT   TYPE INT8,END OF TY_DATA.
DATA LT_DATA TYPE TABLE OF TY_DATA.LT_DATA = VALUE #( ( MATNR = 'Material-001'MTART = 'WATR'MATKL = '1020'INT   = 10086 )( MATNR = 'Material-002'MTART = 'WATR'MATKL = '1030'INT   = 666 ) ).DATA(LV_COUNT) = REDUCE #( INIT LV_COMPT = 0FOR I = 1 UNTIL I > LINES( LT_DATA )NEXT LV_COMPT = LV_COMPT + VALUE #( LT_DATA[ I ]-INT OPTIONAL ) ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LV_COUNT ).

*---------------------------------------------------------------------*
*  REDUCE语句返回值为结构时,常用来汇总字段或作其他处理(例如取最大值/最小值/平均值等)
*---------------------------------------------------------------------*
TYPES:BEGIN OF LTY_RESULT,SUM   TYPE S_DISTANCE,COUNT TYPE I,MAX   TYPE S_DISTANCE,MIN   TYPE S_DISTANCE,END OF LTY_RESULT.
TYPES: LTY_TABLE TYPE TABLE OF LTY_RESULT WITH DEFAULT KEY.SELECT DISTANCE FROM SPFLI INTO TABLE @DATA(LT_TABLE) UP TO 5 ROWS WHERE DISTANCE > 0.DATA(LWA_RESULT) = REDUCE #( INIT LWA_TMP = VALUE LTY_RESULT( )FOR LWA_TABLE IN LT_TABLEINDEX INTO LV_INDEXNEXT LWA_TMP = VALUE #( BASE LWA_TMPSUM   = LWA_TMP-SUM + LWA_TABLE-DISTANCECOUNT = LWA_TMP-COUNT + 1MAX   = NMAX( VAL1 = LWA_TMP-MAX VAL2 = LWA_TABLE-DISTANCE )MIN   = COND #( WHEN LV_INDEX = 1 THEN LWA_TABLE-DISTANCEELSE NMIN( VAL1 = LWA_TMP-MIN VAL2 = LWA_TABLE-DISTANCE ) ) ) ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LWA_RESULT ).

*---------------------------------------------------------------------*
* REDUCE语句返回值为内表时,常用来汇总内表记录,可适用于深层嵌套的内表
*---------------------------------------------------------------------*
TYPES:BEGIN OF LTY_FIELD,ROW TYPE I,COL TYPE I,END OF LTY_FIELD.TYPES:LTY_FIELD_TAB TYPE TABLE OF LTY_FIELD WITH DEFAULT KEY.TYPES:BEGIN OF LTY_DATA,CHECK TYPE CHAR1,FIELD TYPE LTY_FIELD_TAB,END OF LTY_DATA.DATA: LT_DATA TYPE TABLE OF LTY_DATA.LT_DATA[] = VALUE #( ( CHECK = ABAP_TRUEFIELD = VALUE #( ( ROW = 1 COL = 1 )( ROW = 1 COL = 3 )( ROW = 1 COL = 5 ) ) )( CHECK = ABAP_FALSEFIELD = VALUE #( ( ROW = 2 COL = 1 )( ROW = 2 COL = 2 )( ROW = 2 COL = 3 ) ) )( CHECK = ABAP_TRUEFIELD = VALUE #( ( ROW = 3 COL = 2 )( ROW = 3 COL = 4 )( ROW = 3 COL = 6 ) ) ) ).DATA(LT_FIELDS) = REDUCE #( INIT LT_TEMP = VALUE LTY_FIELD_TAB( )FOR LS_DATA IN LT_DATAWHERE ( CHECK = ABAP_TRUE )NEXT LT_TEMP = VALUE #( BASE LT_TEMPFOR LS_FIELD IN LS_DATA-FIELD( LS_FIELD ) ) ).CALL METHOD CL_DEMO_OUTPUT=>DISPLAY( LT_FIELDS ).

ABAP--新语法--New Keyword in ABAP--第四天--CORRESPONDING MOVE-CORRESPONDING(DEEP) REDUCE相关推荐

  1. abap新语法(一)

    DATA 赋值动态声明变量 通过赋值的方式来动态声明变量,系统会根据所赋的值来确定变量类型 其中,字符类型会参照数据长度来指定 DATA(gv_str) = 'hello seele'. " ...

  2. ABAP 新语法简述

    新语法 1select 后的所有字段之间必须用逗号分割 2.gt_out 要加 @ 3.且所有屏幕算选择条件必须用@

  3. 一些我工作中经常使用的ABAP新语法和函数,关键字,可以提高工作效率

    (1) 直接批量生成数据到ABAP内表里: 2017-05-14 7:17PM in Xun's house, Wiesloch INSERT demo_join1 FROM TABLE @( VAL ...

  4. ABAP 新语法 LOOP AT Group 和 REDUCE 分组循环

    *LOOP AT itab result [cond] GROUP BY key ( key1 = dobj1 key2 = dobj2 - * [gs = GROUP SIZE] [gi = GRO ...

  5. 用新语法写更简洁的ABAP代码

    相比其他语言,ABAP可能有很多特有的长处,但简洁从来就不是它的优点之一. 不像其他语言通过Library提供常用功能,ABAP大量使用内置声明(Built-In Statement) 来完善自身,这 ...

  6. 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?

    Jerry在之前的文章多次提过,SAP Cloud Platform ABAP编程环境上的ABAP语法,只是广大SAP顾问们在On-Premises环境上使用的ABAP的一个子集.换句话说,On-Pr ...

  7. ABAP的语法高亮是如何在浏览器里显示的

    这篇文章的原文我发表在SAP官方社区上:https://blogs.sap.com/2018/03/09/how-abap-syntax-highlight-is-implemented-in-web ...

  8. ABAP基本语法(一)附带思维导图学习材料等

    学习本章节最好是有自己的sap账号和密码,可以完整的登录,进行语法的测试,纸上谈兵不可取,多多练习敲代码才能加深自己的印象和理解. 首先建立自己的第一个abap程序 首先我们需要登录sap进入的首页面 ...

  9. SAP ABAP 基础语法随笔

    SAP ABAP 基础笔记随笔 基础 1.move-corresponding 2.IF终止循环 3.CONSTANTS 4.LOOP AT 5.CLEAR & REFRESH 6.获取sel ...

  10. ABAP 新特性 - COND SWITCH 操作符

    在新语法中,可以使用COND.SWITCH来根据逻辑表达式或情况的不同确定指定变量的结果. 语法格式: ...COND dtype | # ( WHEN log_exp1 THEN result1 [ ...

最新文章

  1. 车路协同让城市更智慧
  2. 垃圾回收器机制(一):对象存活及强,弱等各种引用辨析
  3. 11月11日:一个人的情人节
  4. html title属性无效_【学习教程】使用JavaScript删除CSS属性
  5. LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合
  6. c语言冒泡排序的两种实现方式,c语言中冒泡排序的实现原理是什么?
  7. Unlocker-最好的顽固文件删除工具使用说明
  8. 计算机本地连接无internet访问权限,Win7本地连接IPV4无访问权限怎么解决?
  9. 数字签名和数字证书的区别与联系
  10. DAS、NAS、SAN、ISCSI的区别
  11. 【python 新浪微博爬虫】python 爬取新浪微博热门话题
  12. 机器学习SVM之SMO方法α,ω和b迭代公式的推导过程
  13. 手工制作使用WinXShell的PE(不是直接生成) #1
  14. 解决aria2下载磁力链接或bt文件时没有速度或速度为0
  15. 麒麟操作系统学习(安装)
  16. 嵌入式系统自动化测试工具
  17. webERP开源系统安装配置
  18. iOS开发之模仿qq通讯录
  19. 面试百问:如何测试App性能?
  20. 区块链笔记 - 《区块链技术核心概念与原理讲解》

热门文章

  1. 计算机个人市场调查实验报告,市场调查实验报告(一).doc
  2. NYOJ-求和求到手软(抖机灵题)
  3. SQL SERVER对象名无效/执行成功但有错误(初学者易犯错误)
  4. flowable审批流+集成springboot
  5. 这样的跳槽理由,会遭HR嫌弃!
  6. justinmind夜话:数据母板系列视频教程之原型设计二十一条军规
  7. 为什么有斯坦福计算机科学博士学位的你找不到工作?
  8. APP推广重点渠道解析及我这些年踩过的坑
  9. Android端百度地图API使用详解
  10. Pytorch Image Models (timm)