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,则外键正在执行其任务,即跨公司代码合并和管理客户名称和地址。