在插入到 Z table 之前检查重复的主键

Check for duplicate primary key before inserting to Z table

我有一个 Ztable,它有 14 个字段,其中前 5 个是关键字段。

我还有一个显示 alv 网格的 z 程序。我们可以通过此 Z 程序向 table 添加条目,方法是通过工具栏按 (+) 按钮。

因此,当我通过网格(复制粘贴)输入一堆值时,我通过内部 table 获取所有值。我现在很喜欢这个, 键 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.

您可以尝试使用 UNIQUE KEY 声明您的内部 table 已经 SORTED。 这样,您的 table 将始终排序并且没有重复项。

例如:

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

如果你这样做,你将不得不用 INSERT ... INTO ... 更改你的追加。

这是一个基于 COLLECT 语句的使代码简短的解决方案。

这样,您将每个关键字段的值存储在专用 "implicit hash table" 中(COLLECT 对标准 table 的影响),如果该值已存在于 table, 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:在这里,我使用你的编码风格,尽管不使用 "header lines".

会很好

编辑:由于 lines( datatab_y-key3 )lines( datatab_y-key4 ),我的语法错误被替换为 lines( key3s )lines( key4s )