按数据类型动态隐藏ALV列

时间:2017-03-09 15:03:57

标签: abap

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

注意:我在标题中留下了“ABAP Dictionary / Internal Structure”泛型,因为我是否从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来玩,但没有任何实质性的结果。如果我的整个方法都很糟糕,我很乐意改变它以遵循良好的做法。

2 个答案:

答案 0 :(得分:4)

首先,我会使用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.

答案 1 :(得分:1)

以下代码段确定数据字典结构或表的活动版本中的列数。

  SELECT COUNT( * ) INTO @DATA(num_cols)
                    FROM dd03l
                   WHERE tabname EQ @p_struct
                     AND as4local EQ 'A'. " Active

可以使用RTTS framework或使用ASSIGN COMPONENT

制作其他解决方案