内表操作是ABAP开发人员几乎在每个ABAP程序里都会遇到的。

看一个例子:有两个行结构不一样的内表,每个内表的行结构有三列,除了name这一列名字一致外,其他两列的名称都不同,下图用红色和蓝色标注出来。

如果要把内表developer_list里的两位开发人员Jerry和Tom的信息按照下图的映射关系拷贝到内表presale_list里:

常规做法当然是用一个LOOP循环,引入两个临时变量,先把内表1逐行赋给临时变量1,再把临时变量1逐列赋给临时变量2.

在ABAP 750版本里,提供了一个辅助类cl_abap_corresponding,能以声明式编程的方式完成这个内表复制任务。

通过工具类的create方法,第二行和第三行指定要进行复制操作的源和目标内表,第四到六行告诉工具类内表复制的列字段映射规则。之后第8行调用execute方法完成复制操作。

大家更喜欢哪一种方式?这个例子虽然简单,但包含了一个编程领域的基础知识点:命令式编程(Imperative Programming)和声明式编程(Declarative Programming)。

第一种使用LOOP循环的解法是典型的命令式编程的例子,我们定义了两个临时变量,通过循环体内的三条赋值指令,命令代码去执行以完成内表拷贝。第二种解法, 作为应用开发人员,我们只是向工具类做出声明,我们想对哪两个内表根据什么样的映射逻辑进行拷贝。至于工作类如何执行,应用开发人员不操心,这就是声明式编程。

当然,即便是声明式编程,工具类的代码也总得有人实现。双击execute方法,发现是ABAP内核态的C语言实现的。

对于SAP客户和partners来说,无法看到这个ab_kmMvcdExecute内核方法的源代码,详情参考Jerry的文章:聊聊C语言和ABAP

大家可以试着自己用ABAP来模拟实现一个自己的CL_ABAP_CORRESPONDING. 这里Jerry提供一份Java版本的实现。

Java里万物皆对象,所以我们分别定义Developer和Presale类:

创建两个Java list来模拟ABAP里的内表:

然后我的目的是,把第一个list里,Jerry和Tom这两位开发者的name, focusLanguage和salary字段分别赋给第二个list对应实例的name, focusArea和salaryPlusBonus字段,模拟一个公司内部转岗的操作。

同ABAP使用工具类的方式一样,我声明了两条映射规则,分别是第二行的mapping实例1,将focusLanguage字段直接赋给focusArea字段,以及第5行的mapping实例2,将salary字段的值乘以2,再赋给salaryPlusBonus字段。最后调用execute方法完成赋值。为了便于ABAP开发人员同之前的ABAP内表拷贝的例子进行比对,这里虽然是Java代码,但是CL_MAPPING和CL_JAVA_CORRESPONDING这两个类,我仍然用的是ABAP的命名规范,而非Java的驼峰式命名。

CL_JAVA_CORRESPONDING的实现如下:execute调用map, map调用mapEach,提取用户指定的映射规则里的字段名,使用Java反射机制完成操作。

完整代码位于Jerry的github上:

再来看Jerry用JavaScript如何实现这个工具类的。先看在JavaScript里消费工具类的代码,仍然是声明式编程熟悉的味道:

因为function是JavaScript世界里的一等公民,所以JavaScript的实现版本,能写出更原汁原味函数式编程的解法出来:

如果要拷贝JavaScript版本的工具类CL_JS_CORRESPONDING的实现代码,可以从Jerry这篇博客里获得:

CL_ABAP_CORRESPONDING, CL_JAVA_CORRESPONDING and CL_JS_CORRESPONDING

希望这个简单的例子,能让大家感受到命令式编程和声明式编程的差异,感谢阅读。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现的更多相关文章

  1. 【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 取两个内表的交 ...

  2. [SAP ABAP开发技术总结]内表操作

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. ABAP基础篇1 内表

    内表类型 abap 内表类型有三种: 标准表(一般ABAP程序中用的最多就是这种表) 系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码.表的键值不唯一,且没有按照表键自动 ...

  4. ABAP语法篇2 内表操作语法

    VALUE MOVE-CORRESPONDING CORRESPOING FOR REDUCE GROUP BY FILTER VALUE语法: 结构赋值 ... VALUE dtype | #(  ...

  5. ABAP中不修改内表参照的结构,给内表/结构体增加字段

    Situation: DATA:       itab  TYPE STANDARD TABLE OF zsrsodtla_stru1,      wa_itab TYPE zsrsodtla_str ...

  6. cpu内核态与用户态

    1.操作系统需要两种CPU状态 内核态(Kernel Mode):运行操作系统程序,操作硬件 用户态(User Mode):运行用户程序 2.指令划分 特权指令:只能由操作系统使用.用户程序不能使用的 ...

  7. ABAP 内表 详解

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. 一种用单片机AD采样方式来检测交流市电电压的方法

    下面介绍一种用单片机AD采样的方式检测市电电压的方法  要检测交流市电的电压,通常有两种方法 一.通过频繁的采样后再求平均值来获得实际电压值 二.通过采样交流市电的峰值,再通过算法得出实际电压值 这里 ...

  9. Linux用户态与内核态通信的几种方式

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Linux 用 ...

随机推荐

  1. OSS利用ossutil64上传文件

     ossutil64下载地址: http://gosspublic.alicdn.com/ossutil/1.6.0/ossutil64?spm=a2c4g.11186623.2.12.3638159 ...

  2. 爬虫中采集动态HTML介绍

    JavaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言.它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏. 我们可以在网 ...

  3. CentOS7优化打开文件句柄数,修改MariaDB允许最大连接数、允许最大插入数据库的数据大小。

    修改服务器配置:vim /etc/systemd/system.conf查找并修改下列两行的值:DefaultLimitNOFILE=1024000DefaultLimitNPROC=1024000 ...

  4. java多线程(三)线程的安全问题

    1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...

  5. python 使用 elasticsearch 常用方法(索引)

    #记录管理索引等方法 from elasticsearch import Elasticsearch es = Elasticsearch(['xx.xx.xx.xx:9200']) #获取文档内容r ...

  6. python初级(302) 6 对象(五)

    一.复习 1.什么是多态 2.什么是继承 二.继承:向父母学习 在面向对象编程中,类可以从其他类继承属性和方法.这样就有了类的整个家族,这个家族中的每个类共享相同的属性和方法.这样一来,每次向家族增加 ...

  7. kerberos相关

    1.kerberos认证覆盖问题 先显示指定KRB5CCNAME存储的路径 export KRB5CCNAME=/tmp/krb5cc_xxx kinit -kt /home/xxx.keytab x ...

  8. 在idea中打开maven项目pom.xml未识别

    在idea中打开maven项目pom.xml没有识别出来,导致idea不能自动下载依赖包, 解决办法是选中pom.xml文件,右键-" add as maven project"

  9. shell基础知识之 stdin,stdout,stderr和文件描述符

    stdin,stdout,stderr stdin=0 stdout=1 stderr=2 使用tee来传递内容,把stdout 作为stdin 传到下个命令 root@172-18-21-195:/ ...

  10. vSphere SDK for Java - 为虚拟机添加磁盘

    示例代码: import com.vmware.vim25.*; import com.vmware.vim25.mo.*; import org.springframework.stereotype ...