通过Alv网格-SAP ABAP

时间:2018-08-27 17:31:58

标签: sap abap

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

我也有一个显示alv Grid的z程序。通过工具栏上的(+)按钮,我们可以通过此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 :(得分:1)

这是一种基于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 )取代

答案 1 :(得分:0)

您可以尝试使用唯一键将内部表声明为已排序。 这样,您的表将始终被排序并且没有重复项。

例如:

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

如果这样做,则必须使用 INSERT ... INTO ... 来更改您的追加。