报表开发中,经常会遇到用户提出将金额以万元或者百万元等显示,或者为了计算精确度保留了多位小数,用户却要求仅显示2位或不显示.
多数情况为了满足用户的这个需求,我们会通过定义不同格式的字段来处理.但是这样会发生数据核对时不方便或者为了计算精确度需要定义多个字段作为临时记录.
其实在alv中通过设置字段目录可以达到这个要求,并不需要我们去调整数据(比如将金额除以万等).见下表
我们可以看到,通过设置"DECIMALS_O"字段可以调整输出的小数位数,并且会自动四舍五入,比如设置为2可以保留2位小数。要注意的是如果设置的位数超出字段原本的定义,那么显示虽然是按设置显示,但是超出部分的值只会是0.
而"ROUND"字段则用于设置倍数显示,比如要将元转为万元,则将值设置为4即可。
如果想对每条记录单独设置或者让用户在前台自自己设置,就需要增加对应的列,然后设置DECMFIELD 和ROUNDFIELD字段为对应的列名,具体见示例源程序和效果图
另外需要注意的是,如果设置了ref_table 和ref_field,这几个字段可能就会失效,
下面是效果图
附上源代码
REPORT ZSL_ALV_01.
types:begin of ty_t1,
matnr type matnr_d,
menge type menge_d,
dmbtr type dmbtr,
MENGE_ROUND TYPE LVC_RNDFN,
dmbtr_DECIMAL TYPE LVC_DFNAME,
end of ty_t1.
data: t_t1 type table of ty_t1.
data:o_con type ref to cl_gui_docking_container,
o_alv type ref to cl_gui_alv_grid.
parameters p_test type c.
at selection-screen output.
select * from mseg INTO corresponding fields of table @t_t1.
loop at t_t1 assigning field-symbol(<f1>).
<f1>-menge_round = 2.
<f1>-dmbtr_DECIMAL = 4.
endloop.
if o_con is initial.
o_con = new cl_gui_docking_container( side = 4 extension = 160 ratio = 90 ).
o_alv = new cl_gui_alv_grid( i_parent = o_con ).
o_alv->set_frontend_fieldcatalog( it_fieldcatalog = value #( ( FIELDNAME = 'MATNR' )
( FIELDNAME = 'MENGE' ROUND = 4 DECIMALS_O = '2' )
( FIELDNAME = 'DMBTR' ROUND = 1 DECIMALS_O = '-3' ) ) ).
data(LT_FCAT) = value LVC_T_FCAT(
( FIELDNAME = 'MATNR' )
( FIELDNAME = 'MENGE' ROUNDFIELD = 'MENGE_ROUND' )
( FIELDNAME = 'DMBTR' DECMLFIELD = 'DMBTR_DECIMAL' )
( FIELDNAME = 'MENGE_ROUND' EDIT = ABAP_TRUE )
( FIELDNAME = 'DMBTR_DECIMAL' EDIT = ABAP_TRUE )
).
O_ALV->set_table_for_first_display( changing IT_OUTTAB = T_T1 it_fieldcatalog = LT_FCAT ).
endif.