我有一个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.
答案 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 ... 来更改您的追加。