
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”,就不必去读前面三个内表了。