zoukankan      html  css  js  c++  java
  • 【ABAP系列】SAP ABAP 取两个内表的交集 比较两个内表的不同

    公众号:matinal
    本文作者: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”,就不必去读前面三个内表了。

  • 相关阅读:
    从运维域看 Serverless 真的就是万能银弹吗?
    C#技术漫谈之垃圾回收机制(GC)(转)
    题解 hdu4624 Endless Spin
    JS递归删除所有子元素【原】
    Asp.Net 生成验证图片
    mouseover显示层mouseout隐藏层,并且在鼠标放上层时显示层【原】
    C# yield关键字的使用
    MS SQL SERVER中的临时表
    猫 老鼠 人的编程题
    面试题:接口和抽象类的区别 【转】
  • 原文地址:https://www.cnblogs.com/SAPmatinal/p/11176482.html
Copyright © 2011-2022 走看看