你们能够关注个人公众号,公众号里的排版更好,阅读更温馨。html
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自带了,判断一个内表中,是否存在某个记录的函数的话,那第二层循环就能够省去,则上述函数执行效率也会成倍提高了。测试
如下转自华亭博客:感谢华亭的分享:code
函数模块:CTVB_COMPARE_TABLES
这个函数模块比较两个内表,将被删除、增长和修改的内表行分别分组输出。
输入参数:
TABLE_OLD:旧表
TABLE_NEW:新表
KEY_LENGTH:键长度,指定内表中的前若干个字节(在 Unicode 系统中为字符,所以指定长度内不能存在数值类型的字段)为主键,作为内表行是否为增长的判断条件。
IF_SORTED:排序标记,若是已排序,在比较时能够提升效率。
输出参数:
TABLE_DEL:被删除的行
TABLE_ADD:被增长的行
TABLE_MOD:被修改的行
NO_CHANGES:表没有被修改的标记,若是这个标记为 “X”,就没必要去读前面三个内表了。htm