背景:我正在使用cl_salv_table
该类来生成和修改 ALV。此 ALV 显示一个类型的表zpm_et_qual_notif_s
,其中每个偶数行都是一个CHAR
长度类型的分隔符字段,1
其中包含名称DELIM1
等DELIM2
。由于没有理由在 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_structdescr
and cl_abap_tabledescr
,但没有任何实质性的结果。如果我的整个方法不好,我很乐意改变它以遵循良好的做法。