Проверьте наличие дубликата (первичный ключ) перед вставкой в ​​ztable через alv grid - SAP ABAP - PullRequest
0 голосов
/ 27 августа 2018

У меня есть Ztable, который имеет 14 полей, из которых первые 5 являются ключевыми.

У меня также есть программа z, которая отображает alv Grid. Мы можем добавить записи в таблицу с помощью этой Z-программы, нажав кнопку (+) на панели инструментов.

Так что, когда я ввожу набор значений через сетку (копировать, вставить), я получаю все значения через внутреннюю таблицу. Мне нравится, как сейчас, Ключи 1, 2 и 3 - это балансовая единица, организация продаж и другое значение на экране выбора. Я не думаю, что мой код ниже очень эффективен, пожалуйста, предложите улучшить это.

  loop at datatab_y.
IF datatab_y-key3 IS NOT INITIAL.
  SORT datatab_y by key3.
  at new key3.
    new_row = sy-tabix.
  endat.
  at end of key3.
    check sy-tabix > new_row.
    lv_dupflg = datatab_y-key3.
    perform send_dupkey_msg USING lv_dupflg.
  endat.
ELSEIF datatab_y-key4 IS NOT INITIAL.
   SORT datatab_y by key4.
  at new key4.
    new_row = sy-tabix.
  endat.
  at end of key4.
    check sy-tabix > new_row.
    lv_dupflg = datatab_y-key4.
    perform send_dupkey_msg USING lv_dupflg.
  endat.
ENDIF.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вот решение для краткости кода, основанное на выражении COLLECT.

Таким образом, вы сохраняете значения каждого ключевого поля в выделенной «неявной хеш-таблице» (эффект COLLECT для стандартной таблицы), и если значение уже существует в таблице, COLLECT не добавляет новую строку.

DATA: saved_number_of_lines TYPE i,
      key3s LIKE STANDARD TABLE OF datatab_y-key3 WITH KEY table_line,
      key4s LIKE STANDARD TABLE OF datatab_y-key4 WITH KEY table_line.

CLEAR: key3s, key4s.

LOOP AT datatab_y.

  saved_number_of_lines = lines( key3s ).
  COLLECT datatab_y-key3 INTO key3s.
  IF lines( key3s ) = saved_number_of_lines.
    " it means that COLLECT has not added a new line, i.e. the value already exists
    PERFORM send_dupkey_msg USING datatab_y-key3.
  ENDIF.

  saved_number_of_lines = lines( key4s ).
  COLLECT datatab_y-key4 INTO key4s.
  IF lines( key4s ) = saved_number_of_lines.
    PERFORM send_dupkey_msg USING datatab_y-key4.
  ENDIF.

ENDLOOP.

FREE: key3s, key4s. " free memory if needed

PS: здесь я использую ваш стиль кодирования, хотя было бы неплохо не использовать "строки заголовка".

РЕДАКТИРОВАТЬ: моя плохая синтаксическая ошибка из-за lines( datatab_y-key3 ) и lines( datatab_y-key4 ), заменена на lines( key3s ) и lines( key4s )

0 голосов
/ 28 августа 2018

Вы можете попытаться объявить свою внутреннюю таблицу уже SORTED с УНИКАЛЬНЫМ КЛЮЧОМ . Таким образом, ваша таблица всегда будет отсортирована и не будет иметь дубликатов.

Например:

DATA : itab TYPE SORTED TABLE OF mara WITH UNIQUE KEY matnr.

Если вы это сделаете, вам придется изменить приложение с помощью INSERT ... INTO ... .

...