在编写 基于 Func 生成 PO 的 Data Type 规则时找到一个关于数据类型的转换文章 Generalize the call to conversion exit functions以下是针对相关复现

    1. FUNCTION zfm_generalize_conversion.
    2. *"----------------------------------------------------------------------
    3. *"*"本地接口:
    4. *" IMPORTING
    5. *" REFERENCE(I_VARIABLE)
    6. *" REFERENCE(I_CONVER_TYPE) TYPE C DEFAULT 'I'
    7. *" EXPORTING
    8. *" REFERENCE(O_VARIABLE)
    9. *" EXCEPTIONS
    10. *" CONVER_TYPE_FAIL
    11. *"----------------------------------------------------------------------
    12. " note:
    13. " - 要求 i_variable 或 o_variable 参考数据元素或表字段创建( 可取到 转换规则 )
    14. " - 优先使用 i_variable 的转换规则
    15. " - I_CONVER_TYPE 指定转换方式 I 外值转内值 O 内值转外值
    16. " - 例外 CONVER_FAIL 为转换异常
    17. DATA: lo_data TYPE REF TO data.
    18. DATA: lv_rule TYPE funcname.
    19. " 获取字段属性
    20. DESCRIBE FIELD i_variable OUTPUT-LENGTH DATA(l_len)
    21. EDIT MASK DATA(l_mask).
    22. IF l_mask IS INITIAL.
    23. DESCRIBE FIELD o_variable OUTPUT-LENGTH l_len
    24. EDIT MASK l_mask.
    25. IF l_mask IS INITIAL.
    26. o_variable = i_variable.
    27. RETURN.
    28. ENDIF.
    29. ENDIF.
    30. REPLACE FIRST OCCURRENCE OF '==' IN l_mask WITH ''.
    31. CONDENSE l_mask NO-GAPS.
    32. " APLHA 类的转换设置传出长度
    33. CREATE DATA lo_data TYPE c LENGTH l_len.
    34. IF lo_data IS BOUND.
    35. ASSIGN lo_data->* TO FIELD-SYMBOL(<fs_data>).
    36. IF <fs_data> IS ASSIGNED.
    37. " pass
    38. ELSE.
    39. " 异常处理
    40. o_variable = i_variable.
    41. ENDIF.
    42. ELSE.
    43. " 异常处理
    44. o_variable = i_variable.
    45. ENDIF.
    46. " 转换规则
    47. CASE i_conver_type.
    48. WHEN 'I'.
    49. lv_rule = |CONVERSION_EXIT_{ l_mask }_INPUT|.
    50. WHEN 'O'.
    51. lv_rule = |CONVERSION_EXIT_{ l_mask }_OUTPUT|.
    52. WHEN OTHERS.
    53. RAISE conver_type_fail.
    54. ENDCASE.
    55. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    56. EXPORTING
    57. input = i_variable
    58. IMPORTING
    59. output = <fs_data>
    60. EXCEPTIONS
    61. OTHERS = 1.
    62. IF sy-subrc = 0.
    63. o_variable = <fs_data>.
    64. ELSE.
    65. o_variable = i_variable.
    66. ENDIF.
    67. ENDFUNCTION.