排序在 ALV 中也是一个比较重要的功能,在有合计的场合下,排序能实现排序字段的小计(subtotal)。
- 通过 get_sorts 方法,得到类 CL_SALV_SORTS 的引用
- 调用类方法 add_sort 添加排序的字段,如果还要小计,输入参数 subtotal 需要传入 ‘X’
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
PRIVATE SECTION.
METHODS: set_sort
CHANGING co_alv TYPE REF TO cl_salv_table.
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
CALL METHOD set_sort
CHANGING co_alv = gr_table.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
METHOD set_sort.
DATA: lr_sort TYPE REF TO cl_salv_sorts.
"Get Sort object"
lr_sort = co_alv->get_sorts( ).
"Set the SORT on the AUART with Subtotal"
TRY.
CALL METHOD lr_sort->add_sort
EXPORTING
columnname = 'AUART'
position = 1 "排序的顺序,如果根据多个字段来排时,决定哪个先排"
sequence = if_salv_c_sort=>sort_up "升序"
subtotal = if_salv_c_bool_sap=>true."是否需要以此字段进行分类小计"
CALL METHOD lr_sort->add_sort
EXPORTING
columnname = 'ERDAT'
position = 2
sequence = if_salv_c_sort=>sort_down "降序"
subtotal = if_salv_c_bool_sap=>false.
CATCH cx_salv_not_found . "#EC NO_HANDLER"
CATCH cx_salv_existing . "#EC NO_HANDLER"
CATCH cx_salv_data_error . "#EC NO_HANDLER"
ENDTRY.
ENDMETHOD. "set_sort"
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*
分类汇总:Apply Aggregations
计算平均值,取最大值、最小值,这类操作统称为 Aggregations(聚集)。
- 通过 get_aggregations 方法,得到类 CL_SALV_AGGREGATIONS 的引用
- 调用类方法 ADD_AGGREGATION 添加 Aggregations
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
PRIVATE SECTION.
METHODS:set_aggregation
CHANGING co_alv TYPE REF TO cl_salv_table.
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
CALL METHOD set_aggregation
CHANGING co_alv = gr_table.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
METHOD set_aggregation.
DATA: lr_aggrs TYPE REF TO cl_salv_aggregations.
lr_aggrs = co_alv->get_aggregations( ).
"Add TOTAL for COLUMN NETWR"
"如果不先进行排序,则只有汇总,不会进行分类小计"
TRY.
CALL METHOD lr_aggrs->add_aggregation
EXPORTING
columnname = 'NETWR'
aggregation = if_salv_c_aggregation=>total.
CATCH cx_salv_data_error . "#EC NO_HANDLER"
CATCH cx_salv_not_found . "#EC NO_HANDLER"
CATCH cx_salv_existing . "#EC NO_HANDLER"
ENDTRY.
"将合计放置到SALV的顶端"
lr_aggrs->set_aggregation_before_items( ).
ENDMETHOD. "set_aggregation"
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*
过滤设置
SALV 的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件。
- 通过方法 get_filters, 得到 filter 类 CL_SALV_FILTERS 的引用
- 调用类方法 ADD_FILTERS 添加过滤的条件,过滤条件和 range、select-options 一样,用到了sign、option、low 、high
*$*$*.....CODE_ADD_1 - Begin..................................1..*$*$*
PRIVATE SECTION.
METHODS:set_filter
CHANGING co_alv TYPE REF TO cl_salv_table.
*$*$*.....CODE_ADD_1 - End....................................1..*$*$*
*$*$*.....CODE_ADD_2 - Begin..................................2..*$*$*
*Set Filters
CALL METHOD set_filter
CHANGING co_alv = gr_table.
*$*$*.....CODE_ADD_2 - End....................................2..*$*$*
*$*$*.....CODE_ADD_3 - Begin..................................3..*$*$*
METHOD set_filter.
DATA: lr_filter TYPE REF TO cl_salv_filters.
lr_filter = co_alv->get_filters( ).
"Set the filter for the column ERDAT"
TRY.
CALL METHOD lr_filter->add_filter
EXPORTING
columnname = 'ERDAT'
sign = 'I'
option = 'EQ'
low = '20190602'
high = '201906*'.
CATCH cx_salv_not_found . "#EC NO_HANDLER"
CATCH cx_salv_data_error . "#EC NO_HANDLER"
CATCH cx_salv_existing . "#EC NO_HANDLER"
ENDTRY.
ENDMETHOD. "set_filter"
*$*$*.....CODE_ADD_3 - End....................................3..*$*$*