SAP ABAP ALV 如何让字符串类型按照自定义规则排序

背景:

这两天被问到一个需求,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.

普通字符类型字段升序的结果:

指定了转换例程的字段的升序结果:


以上,通过一个小技巧即可轻松完成这种需求。

SAP ABAP ALV 报表是一种基于 ABAP 编程语言的高级列表工具,用于生成和显示数据报表。如果你想要为 ALV 报表添加自定义校验逻辑,可以按照以下步骤进行修改: 1. 首先,创建一个包含自定义校验逻辑的 ABAP 函数模块。该函数模块可用于对 ALV 报表的数据进行验证。在函数模块中,你可以定义各种校验规则和逻辑,例如检查数据的完整性、一致性或合法性。 2. 在 ABAP 程序中,使用 ALV 报表时,可以在数据填充之前或之后调用自定义函数模块。例如,你可以使用 FUNCTION MODULE_BEFORE_OUTPUT 或 FUNCTION MODULE_AFTER_OUTPUT 事件处理程序,在 ALV 表的输出之前或之后执行自定义校验逻辑。 3. 在这些事件处理程序中,可以调用定义的自定义函数模块来执行数据校验。通过将 ALV 表的数据传递给这些函数模块,你可以对数据进行校验,并根据校验结果决定是否允许数据的修改。如果校验失败,可以通过向用户显示错误消息、高亮显示错误行或阻止修改操作来提醒用户。 4. 在 ALV 报表的输出或修改事件中,你还可以根据需要调整和修改 ALV 表的格式和显示。例如,你可以通过修改字段属性、调整列宽或添加新的 ALV 功能按钮来满足特定的需求。 通过以上步骤,你可以在 SAP ABAP ALV 报表中成功添加自定义校验逻辑。这将提高报表数据的质量和准确性,并为用户提供更好的用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeveloperMrMeng

觉得有用的佛系投币哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值