首页 > 解决方案 > 在插入数据库表时找出哪些行是重复的?

问题描述

我有以下情况:

数据库表,我们ZDBX用主键来调用它:

MATNR, LIFNR, ZART

在报告中我有内部表lt_table TYPE TABLE OF ZDBX

DELETE ADJACENT DUPLICATES FROM lt_table 
   COMPARING matnr lifnr zart fact_code.

DELETE FROM ZDBX.
INSERT ZDBX FROM TABLE lt_table.

INSERT语句将导致短转储,因为内部表中有行具有相同的主键,但不同的fact_code.

现在,我知道显而易见的解决方案是只比较DELETE ADJACENT DUPLICATES语句中的主键,但这在我的情况下不起作用,因为用户想要决定哪些fact_code将被删除。

现在,我的解决方案是将本地表(就在之前INSERT)导出到 excel 中并找到重复项并询问用户fact_code他想要哪个。

我可以找出(通过系统变量或 in ST22)INSERT 在哪一行崩溃?(所以我不必做所有的excel工作)

我理想的解决方案是将 INSERT 放入 aTRY-CATCH中,找到重复的行,然后将带有重复数据的消息写入 Job-Log。

可能吗 ?

(另外,将列设置fact_code为主键也不是用户认同的解决方案)

标签: abap

解决方案


您可以使用 FOR ALL ENTRIES 指令来查找现有项目。

  SELECT *
    FROM ZDBX
    INTO TABLE lt_dublicates
    FOR ALL ENTRIES IN lt_table
    WHERE MATNR EQ lt_table-MATNR
      AND LIFNR EQ lt_table-LIFNR 
      AND ZART  EQ lt_table-ZART.

我更喜欢创建 ABAP 报告来列出和选择不需要的记录。您可以添加复选框列以标记行并通过主键自动取消标记相同的其他记录。


推荐阅读