公众号:SAP Technical
本文作者:matinal
 

前言部分

大家可以关注我的公众号,公众号里的排版更好,阅读更舒适。

正文部分

SAP自带的函数:
CTVB_COMPARE_TABLES和BKK_COMPARE_TABLES;
似乎可以比较两个内表,得出第二个内表不同于第一个内表的部分(新增/删除了那些部分)

但是,具体的使用,还请有经验的朋友不吝赐教啊!
因为,我在测试数据时,发现这两个函数的效果不那么简单。
如果上述函数确实可以,提取两个内表不同部分,则我可以据此做两次比较,得到两个内表的交集。
所以,我先用另外一种方式解决了-自己写了一个提取两个内表交集的函数,供大家检阅:

*"  IMPORTING
*"     VALUE(ITAB1) TYPE  INDEX TABLE
*"     VALUE(ITAB2) TYPE  INDEX TABLE
*"  EXPORTING
*"     VALUE(ITABSAME) TYPE  INDEX TABLE
*"----------------------------------------------------------------------

field-symbols:
    <S1>,
    <S2>.
  data:
    L1 type i,
    L2  type i.

assign local copy of initial line of:
         ITAB1 to <S1>,
         ITAB2 to <S2>.
  describe: table ITAB1 lines L1,
            table ITAB2 lines L2.

"对记录行数少的内表,执行第一层循环;
"在第二层循环中,找到对应记录,即可追加到结果内表;
"同时退出第二层循环,继续执行第一层循环的下一行
IF L1 <= L2.
  LOOP AT ITAB1 INTO <S1>.
    LOOP AT ITAB2 INTO <S2>.
      IF <S1> EQ <S2>.
        APPEND <S1> TO ITABSAME.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ELSE.
  LOOP AT ITAB2 INTO <S2>.
    LOOP AT ITAB1 INTO <S1>.
      IF <S1> EQ <S2>.
        APPEND <S2> TO ITABSAME.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDIF.
ENDFUNCTION.

另一个问题,想请教大家,在上面代码里,第二层循环是为了找出,第一层循环的当前记录,在第二个内表里是否存在;

所以,如果ABAP自带了,判断一个内表中,是否存在某个记录的函数的话,那第二层循环就可以省去,则上述函数执行效率也会成倍提升了。

以下转自华亭博客:感谢华亭的分享:

函数模块:CTVB_COMPARE_TABLES
这个函数模块比较两个内表,将被删除、增加和修改的内表行分别分组输出。

输入参数:
TABLE_OLD:旧表
TABLE_NEW:新表
KEY_LENGTH:键长度,指定内表中的前若干个字节(在 Unicode 系统中为字符,因此指定长度内不能存在数值类型的字段)为主键,做为内表行是否为增加的判断条件。
IF_SORTED:排序标记,如果已排序,在比较时可以提高效率。

输出参数:
TABLE_DEL:被删除的行
TABLE_ADD:被增加的行
TABLE_MOD:被修改的行
NO_CHANGES:表没有被修改的标记,如果这个标记为 “X”,就不必去读前面三个内表了。

【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同的更多相关文章

  1. 【ABAP系列】ABAP CL_ABAP_CONV_IN_CE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]ABAP CL_ABAP_CON ...

  2. 【ABAP系列】SAP ABAP模块-取整操作中CEIL和FLOOR用法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-取整操作中 ...

  3. 【ABAP系列】SAP 使用特殊的技术更新数据库(ABAP)

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 使用特殊的技术更新数据库 ...

  4. 【ABAP系列】SAP ABAP 资产类BAPI过账 BAPI_ACC_DOCUMENT_POST

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 资产类BAPI ...

  5. 【ABAP系列】SAP ABAP DYNP_VALUES_UPDATE 更新屏幕字段的函数及用法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP DYNP_VA ...

  6. 【ABAP系列】SAP ABAP MRKO增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP MRKO增强 ...

  7. 【ABAP系列】SAP ABAP 实现FTP的文件上传与下载

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 实现FTP的文 ...

  8. 【ABAP系列】SAP 生产订单完工确认(CO11N) BAPI : BAPI_PRODORDCONF_CREATE_TT

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 生产订单完工确认(CO1 ...

  9. 【ABAP系列】SAP 获取工单和工序的状态

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 获取工单和工序的状态   ...

随机推荐

  1. DedeCms织梦发布文章时输入Tag标签逗号自动变成英文标点的方法

    把TAG标签的间隔号由空格改为英文的逗号,这样使得经常原创文章的站长朋友非常不方便,因为我们输入汉字时总是喜欢使用全角的逗号,那么有没有办法使用 js脚本把输入的中文逗号变成英文逗号呢?当然是可以的! ...

  2. Codeforces 976 正方格蛇形走位 二维偏序包含区间 度数图构造 贪心心火牧最大dmg

    A #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { i ...

  3. jmeter之HTTP信息管理器、正则表达式联合使用(获取登录session

    如图所示,信息管理头的信息为请求头信息,如图所示 注意事项:1)body date里面的参数要是要注意英文编写条件下,可以通过https://www.json.cn/在线的json格式刷格式 2)注意 ...

  4. easygui _1

    GUI---图形用户界面 什么是GUI? GUI是Graphical  User   Interface(图形用户界面)的缩写.在GUI中,并不是键入文本和返回值,用户可以看到文本框,窗口,按钮等图形 ...

  5. Jenkins自动打包并部署(以java -jar形势运行)

    1.打包 与平常maven项目打包一致,不再赘述 2.杀死原有进程 通过 pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' ` 获取当前 ...

  6. python2---输出1--100之间的偶数

    #!/usr/bin/env python方法1:num = 1while num <= 100: if num % 2 == 0: print(num) num += 1方法2: #!/usr ...

  7. C/C++中的转义字符

    在C语言中有三种转义字符,它们是:一般转义字符.八进制转义字符和十六进制转义字符. 1.一般转义字符 这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符.常用的一般转义字符为: \a \n \ ...

  8. sh_02_判断年龄改进版

    sh_02_判断年龄改进版 # 输入用户年龄 age = int(input("请输入年龄:")) # 判断是否满 18 岁 (>=) if age >= 18: # ...

  9. socket编程相关阐述

    一.socket初识 ①服务端 import socket server = socket.socket() server.bind(('127.0.0.1', 8080)) server.liste ...

  10. (67)c++后台开发

    还记得自己在学校的时候,一直都比较注重的是:编程语言+数据结构与算法.没错,对于一个在校的计算机专业的学生,这是很重要的方面.但是,这往往不够,或许是因为毕业前一直没有进入企业实习,以至于自己在毕业之 ...