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

时间:2013-08-04 11:57:09

标签: sap abap

我在SAP中有一个我正在尝试解决的任务,但到目前为止,我还没有成功,作为SAP和ABAP的初学者。

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

客户存储在下表中:

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

KNB1公司代码的主数据

我们填写了前一个号码KNB1-ALTKN字段。

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

所以这里的条件是:具有相同KUNNR的不同ALTKN表示重复记录。

有人可以帮我这样做吗?

3 个答案:

答案 0 :(得分: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“前kunnr”但是ALTKN eq“前ALTKN”。

循环期间您可以随时再次比较实际的KUNNR / ALTKN。 不要忘记检查第一个循环和最后一个循环。

这有用吗?

答案 1 :(得分: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.

答案 2 :(得分:0)

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

无论如何,要获得过滤条件,您需要做的只是按用于查找重复项的键(在本例中为ALTKNBUKRS)进行分组,并且仅采用具有{{{ 1}}(记录组中的计数)高于1.

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

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

count ( * )

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,但如果您还需要kunnrsALTKN,只需在主查询中添加联接并在子中添加相应的条件-query。

BUKRS