Как проверить дублирование адресов в таблицах KNA1 и KNB1?

Мне нужно проверить, есть ли повторяющиеся записи в адресных таблицах.

Клиенты хранятся в следующих таблицах:

KNA1 Основные данные с адресом, общий вид

KNB1 Основные данные для балансовой единицы

Заполняли поле KNB1-ALTKN предыдущее число.

Теперь идея состоит в том, чтобы найти все повторяющиеся записи с этим номером, но есть только повторяющиеся записи, если KUNNR отличается. Поскольку один и тот же клиент может быть в нескольких балансовых единицах (BUKRS), наверняка существует более одной записи с одним и тем же ALTKN.

Итак, условие здесь: разные KUNNR с одинаковым ALTKN означают дублированную запись.

Может ли кто-нибудь помочь мне в этом?


person Chechi    schedule 04.08.2013    source источник
comment
Чтобы уточнить условие: разные KUNNR с одинаковыми ALTKN и одинаковыми BUKRS означают дублированную запись. Если существуют разные KUNNR, разные BUKRS и одинаковые ALTKN, то внешний ключ выполняет свою работу, то есть объединяет и управляет именами и адресами клиентов по балансовым единицам.   -  person Eric    schedule 15.08.2013


Ответы (3)


Я знаю, что это старый вопрос, но для этого есть гораздо более простое решение, которое можно выразить одним чистым 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 будет содержать клиентов 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.
person Zero    schedule 16.05.2018

Я полагаю, что в этом случае вам следует создать экран выбора, который может принимать варианты выбора для BUKRS в качестве параметра выбора.

И вам нужен тип, подобный типам begin of tty_mytype. kunnr тип kunnr, kunnr2 тип kunnr, altkn тип altkn. конец tty_mytype.

Затем вы можете использовать полное сканирование таблицы на KNA1 в хешированную таблицу типа tty_my.

Объедините все таблицы в хеш-таблицу, используя сканирование всей таблицы, просто выберите KUNNR из KNA1 и ALTKN из KNB1. Вот и все. Используйте внешнее соединение.

И тогда вам нужно будет отсортировать результаты, лучше всего, по ALTKN и KUNNR, я думаю. И тогда Вам понадобится еще одна буферная таблица того же типа. Вы должны перебрать первую хеш-таблицу и «собрать» все подходящие куннеры, которые имеют одинаковый ALTKN, в буферную таблицу. Вторая буферная таблица со вторым полем KUNNR может содержать ПЕРВЫЙ KUNNR с ALTKN, а второе поле kunnr может содержать фактическую таблицу, которая зацикливается, где текущий KUNNR ne "бывший kunnr", НО ALTKN eq "бывший ALTKN".

Во время цикла Вы всегда можете сравнить фактический KUNNR / ALTKN с последним. Не забудьте проверить первую и последнюю петли.

Это помогло ?

person icbytes    schedule 05.08.2013

С помощью этого кода можно будет найти все повторяющиеся записи. Он ищет во всех 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.
person Eric    schedule 15.08.2013