在SAP ERP系统开发过程中,经常会遇到需要将大量数据从数据库表中提取,储存在内表中,供进一步处理之用。而在这个内表中,有时候存在大量重复的记录,若要从中得到唯一记录,有以下三种方法:
方法一: 内部表循环赋值,使用COLLECT语句追加记录
方法二: 内部表循环赋值,使用AT NEW和APPEND语句追加记录
方法三: 整个内部表赋值,使用DELETE ADJACENT DUPLICATES语句删除重复记录
以上三种方法,在内表记录数不多的情况下,对系统运行影响不大,但若遇到内表记录数众多,则不同方法对系统运行性能将产生一定影响,以下是一个测试程序,测试结果,方法三是系统运行效率最高的。
REPORT y_test_temp1 .
DATA: t1 TYPE i,
t2 TYPE i,
times TYPE i.
TABLES: marc.
DATA: BEGIN OF it_marc OCCURS 0,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
END OF it_marc.
DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
END OF it_mara.
SELECT matnr werks
INTO TABLE it_marc
FROM marc
WHERE werks = '1005'.
DO 10 TIMES. "运行10次看平均结果
REFRESH it_mara.
* 方法一
GET RUN TIME FIELD t1.
LOOP AT it_marc.“在内表中循环通过collect语句得到不重复记录
CLEAR it_mara.
it_mara-matnr = it_marc-matnr.
COLLECT it_mara.
ENDLOOP.
GET RUN TIME FIELD t2.
times = t2 - t1.
WRITE: AT /1 times.
* 方法二
SORT it_marc BY matnr."按物料排序
GET RUN TIME FIELD t1.
LOOP AT it_marc.
AT NEW matnr. ”当新的物料出现时得到此记录
CLEAR it_mara.
it_mara-matnr = it_marc-matnr.
APPEND it_mara.
ENDAT.
ENDLOOP.
GET RUN TIME FIELD t2.
times = t2 - t1.
WRITE: times.
* 方法三:
it_mara[] = it_marc[].
GET RUN TIME FIELD t1.
DELETE ADJACENT DUPLICATES
FROM it_mara COMPARING matnr.“在内表中删除重复记录
GET RUN TIME FIELD t2.
times = t2 - t1.
WRITE: times.
NEW-LINE.
ENDDO.
标签:matnr,mara,marc,t2,t1,ABAP,内表中,重复记录,times
From: https://blog.csdn.net/reagon2008/article/details/139627863