我在SAP中有一个我正在尝试解决的任务,但到目前为止,我还没有成功,作为SAP和ABAP的初学者。
我需要检查地址表中是否有重复的记录。
客户存储在下表中:
KNA1
包含地址,全局视图的主数据
KNB1
公司代码的主数据
我们填写了前一个号码KNB1-ALTKN
字段。
现在的想法是找到具有此编号的所有重复记录,但如果KUNNR
不同,则只有重复记录。由于同一客户可以使用多个公司代码(BUKRS
),因此肯定有多个条目具有相同的ALTKN
。
所以这里的条件是:具有相同KUNNR
的不同ALTKN
表示重复记录。
有人可以帮我这样做吗?
答案 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中失败) )...
无论如何,要获得过滤条件,您需要做的只是按用于查找重复项的键(在本例中为ALTKN
,BUKRS
)进行分组,并且仅采用具有{{{ 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
,但如果您还需要kunnrs
和ALTKN
,只需在主查询中添加联接并在子中添加相应的条件-query。
BUKRS