在ABAP中,存在着一条法则:名字不一定代表实际规则(具体可看最近的相关讨论)。
但是如你们所知的,存在着一个很好的例外: 所有涉及到使用CORRESPONDING为结构赋值的关键字的语法形式(偶然地)有着相同的名字..
- 在ABAP 7.40之前,主要有用MOVE-CORRESPONDING来复制结构组件、Open SQL的SELECT的CORRESPONDING附加字段,以及某些过时的计算语句等。
- 在ABAP 7.40中,MOVE-CORRESPONDING可以用于操纵带有结构的内表。并且7.40引入了一个新的构造器操作符CORRESPONDING,它允许显式地将结构的组件映射到不同名字的组件上。
还缺了点什么?答案是动态的映射!这个特性在ABAP 7.50中得到了引入。
新的系统类 CL_ABAP_CORRESPONDING 允许你适用动态指定的映射规则为结构或内表的组件赋值。
映射规则需要创建在一个映射表中,然后传递给映射对象。
例子如下:
DATA(mapper) = cl_abap_corresponding=>create( source = struct1 destination = struct2 mapping = VALUE cl_abap_corresponding=>mapping_table( ( level = 0 kind = cl_abap_corresponding=>mapping_component srcname = ‘…’ dstname = ‘…’ ) ( level = 0 kind = cl_abap_corresponding=>mapping_component srcname = ‘…’ dstname = ‘…’ ) ( level = 0 kind = cl_abap_corresponding=>mapping_component srcname = ‘…’ dstname = ‘…’ ) ) ).
这是个简单的例子,所有组件都在第0层,并且所有组件都得到了映射 (kind = cl_abap_coresponding=>mapping_component)。复杂点的形式会涉及到嵌套结构和排除项。通过srcname和dstname,组件名可以动态地指定。表的建立和CORRESPODING操作符的mapping子句类似。
创建映射对象后,你需要做的就是按如下方式执行赋值:
mapper->execute( EXPORTING source = struct1 CHANGING destination = struct2 ).
你可以一次又一次地为拥有相同类型的结构或者内表来进行这样的操作。
没别的了。更多细节请看:
CL_ABAP_CORRESPONDING – System Class.
远景
到目前为止,只有CORRESPONDING操作符的基本形式被反映到了CL_ABAP_CORRESPONDING里面。而适用lookup table的变体还在实现中..