背景:
这两天被问到一个需求,ALV上有一个字符串类型的状态值字段,假如值是A,B,C,D,E,按照标准排序逻辑,这个排序规则是没办法改变的,升序肯定就是ABCDE,倒序肯定就是EDCBA,但是用户说我就想点升序后,给我按照BDCAE的顺序进行排序,有没有办法,我第一反应是这标准的排序逻辑肯定是改不了的,用户能不能接受给状态前面拼接上12345的前缀,比如1-B,2-D,3-C,4-A,5-E,这样是可以达到要求的,但是用户肯定是不接受的,刚才突然想到一个很不常用的功能可以实现,也不叫不常用,应该说是很少需要自己去创建的一个功能,没错,它就是:转换例程
实现方式:
假定现在ALV上有个字段,它的值会有5种可能,张三,李四,王五,赵四,刘能,我需要让他点击排序的时候就按照这个顺序给我排序,这种只有一种办法,让系统把张三认为是1,李四认为是2,王五认为是3,以此类推,不借助其他字段的话咋办呢,对,使用转换例程,这个东西其实经常用,但基本上不会自己去建一个,都用的系统标准的,针对这个需求,现在我们需要创建两个转换例程函数:
转换例程函数的命名规则是:CONVERSION_EXIT_XXXXX_INPUT,XXXXX是五位任意字符,不要和系统的重复即可。
- 创建函数CONVERSION_EXIT_ZSORT_INPUT:
FUNCTION conversion_exit_zsort_input. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(INPUT) TYPE CLIKE *" EXPORTING *" REFERENCE(OUTPUT) TYPE CLIKE *"---------------------------------------------------------------------- CASE input. WHEN '张三'. output = 1. WHEN '李四'. output = 2. WHEN '王五'. output = 3. WHEN '赵四'. output = 4. WHEN '刘能'. output = 5. WHEN OTHERS. output = 99. ENDCASE. ENDFUNCTION.
- 创建函数CONVERSION_EXIT_ZSORT_OUTPUT:
FUNCTION CONVERSION_EXIT_ZSORT_OUTPUT. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(INPUT) TYPE CLIKE *" EXPORTING *" REFERENCE(OUTPUT) TYPE CLIKE *"---------------------------------------------------------------------- CASE input. WHEN 1. output = '张三'. WHEN 2. output = '李四'. WHEN 3. output = '王五'. WHEN 4. output = '赵四'. WHEN 5. output = '刘能'. WHEN OTHERS. output = '未知'. ENDCASE. ENDFUNCTION.
这样一来,内外码转换的函数就做好了,接下来我们只需要创建一个域字段,分配上该转换例程,那么使用到该域的数据元素字段,就可以按照我们指定的排序规则排序了。
测试代码:
*&---------------------------------------------------------------------*
*& Report ZTEST_ALV_13065
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_alv_13065.
DATA lt_alv TYPE STANDARD TABLE OF ztest_sort_by_custom_logic.
lt_alv = VALUE #( ( int_value = 1 out_value = '张三' value_with_exit = 1 )
( int_value = 2 out_value = '李四' value_with_exit = 2 )
( int_value = 3 out_value = '王五' value_with_exit = 3 )
( int_value = 4 out_value = '赵四' value_with_exit = 4 )
( int_value = 5 out_value = '刘能' value_with_exit = 5 ) ).
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_structure_name = 'ZTEST_SORT_BY_CUSTOM_LOGIC'
TABLES
t_outtab = lt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
普通字符类型字段升序的结果:
指定了转换例程的字段的升序结果:
以上,通过一个小技巧即可轻松完成这种需求。