Abap 如何检查表KNA1和KNB1中的重复地址?

Abap 如何检查表KNA1和KNB1中的重复地址?,abap,sap-erp,Abap,Sap Erp,我需要检查地址表中是否有重复记录 客户存储在下表中: KNA1带地址的主数据,全局视图 KNB1公司代码的主数据 我们正在填写前一个编号的字段KNB1-ALTKN 现在的想法是找到具有此编号的所有重复记录,但只有当KUNNR不同时才有重复记录。由于同一客户可能存在多个公司代码(BUKRS),因此肯定有多个条目具有相同的ALTKN 因此这里的条件是:不同的KUNNR与相同的ALTKN表示重复记录 有人能帮我做这个吗?我想,在这种情况下,您应该创建一个选择屏幕,它可以将BUKR的选择选项作为选择参数

我需要检查地址表中是否有重复记录

客户存储在下表中:

KNA1
带地址的主数据,全局视图

KNB1
公司代码的主数据

我们正在填写前一个编号的字段
KNB1-ALTKN

现在的想法是找到具有此编号的所有重复记录,但只有当
KUNNR
不同时才有重复记录。由于同一客户可能存在多个公司代码(
BUKRS
),因此肯定有多个条目具有相同的
ALTKN

因此这里的条件是:不同的
KUNNR
与相同的
ALTKN
表示重复记录


有人能帮我做这个吗?

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

您需要一个类似types begin的tty_mytype类型。 KUNR型KUNR, kunnr2型kunnr, altkn型altkn。 tty_mytype的结尾

然后,您可以使用KNA1上的完整表扫描进入哈希表类型tty_my类型的哈希表

使用整个表扫描将所有表连接到哈希表中,只需从KNA1中选择KUNNR,从KNB1中选择ALTKN。就这样。 使用外部连接

然后你将不得不对结果进行排序,最好的事情,我认为是由ALTKN和KUNNR排序。 然后需要另一个缓冲表,相同类型。 必须循环第一个哈希表,并将所有具有相同ALTKN的拟合kunnr“收集”到缓冲表中。 第二个KUNR字段所在的第二个缓冲表可以保存第一个KUNR和ALTKN,第二个KUNR字段可以保存实际的KUNR,该缓冲表是循环的,其中当前KUNR为“前KUNR”,但ALTKN eq为“前ALTKN”

在循环过程中,您始终可以将实际KUNR/ALTKN与上一个进行比较。 不要忘记检查第一个循环和最后一个循环


这有帮助吗?

查找所有重复记录将由此代码完成。它查找所有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.

我知道这是一个老问题,但是有一个非常简单的解决方案,可以用一个纯SQL查询来表示。。。假设它能工作(看到ABAP Open SQL中的一些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\u kunnrs\u重复账户
将包含客户
kunnrs
,但如果您还需要
ALTKN
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.

澄清条件:相同ALTKN和相同BUKR的不同KUNR意味着重复记录。如果存在不同的KUNR、不同的BUKR和相同的ALTKN,则外键正在执行其任务,即跨公司代码合并和管理客户名称和地址。