0

I need to check if there are duplicated records in the address tables.

The customers are stored in the following tables:

KNA1 Master data with address, global view

KNB1 Master data for company code

We were filling into the field KNB1-ALTKN the previous number.

Now the idea is to find all duplicated records with this number, but there are only duplicated records if the KUNNR is different. Because the same customer can be in several company codes (BUKRS), there are for sure more than one entry with the same ALTKN.

So the condition here is: different KUNNR with the same ALTKN means duplicated record.

Can someone please help me do this?

4

3 回答 3

1

我知道这是一个老问题,但有一个更简单的解决方案,可以用一个纯 SQL 查询来表达......假设它有效(看到一些 SQL 功能在 ABAP Open SQL 中失败)......

无论如何,要获得您的过滤条件,您需要做的就是按用于查找重复项(在本例中为ALTKN, BUKRS)的键进行分组,并且只选择count ( * )(组中的记录数)高于 1 的组。

接下来使用您的过滤条件来获得您需要的实际结果。

这是一个完整的查询,可以解决这种特殊情况下的问题:

Select kunnr from kna1 as outer_kna1
where exists (
   "what you select here doesn't matter
   Select 1 from kna1 inner join knb1 on kna1~kunnr = knb1~kunnr 
   where kna1~kunnr = outer_kna1~kunnr
   group by ALTKN, BUKRS "Keys, by which duplicates are searched for
   having count( * ) > 1 "Condition to only select duplicates (in this case, record count in a group is more than 1)
)
into table @lt_duplicate_account_data. 

lt_kunnrs_of_duplicate_accounts将包含 customer kunnrs,但如果您也需要ALTKNand BUKRS,只需在主查询中添加一个联接并在子查询中添加相应的条件。

Select kunnr, altkn, bukrs from kna1 as outer_kna1 
   inner join outer_knb1 on outer_kna1~kunnr = outer_knb1~kunnr "added join
   where exists (
      "what you select here doesn't matter
      Select kna1~kunnr from kna1 inner join knb1 on kna1~kunnr = knb1~kunnr 
      where kna1~kunnr = outer_kna1~kunnr
      and altkn = outer_knb1~altkn and bukrs = outer_knb1~bukrs "added conditions
      group by ALTKN, BUKRS "Keys, by which duplicates are searched for
      having count( * ) > 1 "Condition to only select duplicates (in this case, record count in a group is more than 1)
   )
into table @lt_duplicate_account_data.
于 2018-05-16T13:00:16.857 回答
0

我想,在这种情况下,您应该创建一个选择屏幕,它可以将 BUKRS 的选择选项作为选择参数。

并且您需要一种类型,例如 tty_mytype 的类型。kunnr 类型 kunnr,kunnr2 类型 kunnr,altkn 类型 altkn。tty_mytype 结束。

然后你可以在 KNA1 上使用全表扫描进入 tty_my 类型的散列表类型散列表。

使用整个表扫描将所有表连接到散列表中,只需从 KNA1 中选择 KUNNR,从 KNB1 中选择 ALTKN。而已。使用外连接。

然后你必须对结果进行排序,最好的事情是按 ALTKN 和 KUNNR,我想。然后你需要另一个相同类型的缓冲表。您必须遍历第一个散列表并“收集”所有具有相同 ALTKN 的合适 kunnrs 到缓冲区表中。具有第二个 KUNNR 字段的第二个缓冲区表可以保存带有 ALTKN 的 FIRST KUNNR,第二个 kunnr 字段可以保存实际的循环,其中当前 KUNNR ne "former kunnr" BUT ALTKN eq "former ALTKN"。

循环期间您始终可以将实际的 KUNNR/ALTKN 与最后一个进行比较。不要忘记检查第一个循环和最后一个循环。

这个有帮助吗 ?

于 2013-08-05T11:36:51.523 回答
0

查找所有重复记录将通过此代码完成。它在所有 ALTKN 中查找公司代码并检查重复项:

DATA: BEGIN OF duplicate,
  kunnr TYPE knb1-kunnr,
  bukrs TYPE knb1-bukrs,
  altkn TYPE knb1-altkn,
END OF duplicate.
DATA: duplicates LIKE TABLE OF duplicate.

DATA: BEGIN OF altkn_rec,
  altkn TYPE knb1-altkn,
  kunnr TYPE knb1-kunnr,
  bukrs TYPE knb1-bukrs,
END OF altkn_rec.
DATA: altkn_recs LIKE TABLE OF altkn_rec.

DATA: g_bukrs TYPE bukrs,
      previous_record_line TYPE i,
      o_alv TYPE REF TO cl_salv_table.

SELECT bukrs FROM t001 INTO g_bukrs.

  "Get all reference numbers for company code
  SELECT altkn kunnr bukrs
    FROM knb1
    INTO TABLE altkn_recs
    WHERE bukrs = g_bukrs
    ORDER BY altkn.

  "loop over all customer reference numbers, look for duplicates
  LOOP AT altkn_recs INTO altkn_rec.
    AT NEW altkn.
      "Check if more than one line has been read since last record.
      IF ( sy-tabix - previous_record_line ) > 1.
        "Duplicate Found
        READ TABLE altkn_recs INDEX previous_record_line
          INTO altkn_rec.
        MOVE-CORRESPONDING altkn_rec TO duplicate.
        APPEND duplicate TO duplicates.
      ENDIF.

      previous_record_line = sy-tabix.
    ENDAT.
  ENDLOOP.

ENDSELECT.

IF duplicates IS NOT INITIAL.
  cl_salv_table=>factory( IMPORTING r_salv_table = o_alv
                          CHANGING  t_table      = duplicates ).
  o_alv->display( ).
ELSE.
  WRITE 'No Duplicates Found'.
ENDIF.
于 2013-08-15T20:11:22.460 回答