背景:我正在使用cl_salv_table类来生成和修改ALV。此ALV显示一个zpm_et_qual_notif_s类型的表,其中每个偶数行都是一个CHAR长度1类型的分隔符字段,名称为DELIM1DELIM2 ...等。由于没有理由在ALV中显示定界符列,因此我想删除它们。

注意:我在标题中保留了“ABAP字典/内部结构”的通用名称,因为我是根据ABAP字典结构还是由其定义的内部表确定列数,这对我而言并不重要。

对我来说,简单的解决方案是拥有这15条语句,因为当前有15个分隔符字段:

lv_alv->get_columns( )->get_column( 'DELIM1' )->set_visible( if_salv_c_bool_sap=>false ).
lv_alv->get_columns( )->get_column( 'DELIM2' )->set_visible( if_salv_c_bool_sap=>false ).
lv_alv->get_columns( )->get_column( 'DELIM3' )->set_visible( if_salv_c_bool_sap=>false ).
lv_alv->get_columns( )->get_column( 'DELIM4' )->set_visible( if_salv_c_bool_sap=>false ).
lv_alv->get_columns( )->get_column( 'DELIM5' )->set_visible( if_salv_c_bool_sap=>false ).
...

这样做的问题是,如果将新字段添加到表中,我的程序也必须更新。因此,这种方法需要许多几乎重复的行,我发现这是一个草率的解决方案。

我认为这是一种更清洁的解决方案,它以如下方式动态设置所有定界符列的可见性:
" Dynamically hide delimiter columns
DATA lv_idx TYPE syst_index VALUE 1.
WHILE lv_idx < 16. " Number of delimiters
    lv_alv->get_columns( )->get_column( |DELIM{ lv_idx }| )->set_visible( if_salv_c_bool_sap=>false ).
    lv_idx = lv_idx + 1.
ENDWHILE.

很好,因为这是一个简单的解决方案,并且开销最小。但是,我仍然有必须对分隔符列数进行硬编码的问题。理想的解决方案是让我这样做:
" Dynamically hide delimiter columns
DATA lv_idx TYPE syst_index VALUE 1.
WHILE lv_idx < ( columns( 'ZPM_ET_QUAL_NOTIF_S' ) / 2 ). " Number of delimiters
    lv_alv->get_columns( )->get_column( |DELIM{ lv_idx }| )->set_visible( if_salv_c_bool_sap=>false ).
    lv_idx = lv_idx + 1.
ENDWHILE.

...但是,那当然不是问题。

如何动态获取内部表或基于该表的ABAP词典结构的列数?当然,有一些动态的解决方案。我自己尝试解决此问题,使我不得不使用cl_abap_structdescrcl_abap_tabledescr玩弄,但没有实质性进展。如果我的整个方法都不好,我很乐意对其进行更改以遵循良好的做法。

最佳答案

首先,我将使用set_technical标记这些列,以防止它们被完全显示。 set_visible( abap_false )仅将它们从当前/初始显示中隐藏,但是用户可以选择显示这些可能令人困惑的列。

然后,我可能会尝试通过数据元素而不是位置来区分这些列。 (伪)代码,未经测试:

DATA(columns) = my_alv->get_columns( ).
DATA(column_list) = columns->get( ).
LOOP AT column_list ASSIGNING FIELD-SYMBOL(<column>).
  IF <column>-r_column->get_ddic_rollname( ) = 'Z_IRRELEVANT_DELIMITER'.
    <column>-r_column->set_technical( ).
  ENDIF.
ENDLOOP.

关于sap - 根据数据类型动态隐藏ALV列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42698675/

10-11 02:34