ABAP调用类方法时能否返回internal table及实现方法咨询
ABAP类方法返回内表实现方案
ABAP的类方法完全支持将内表作为返回值传递,以下是两种常用的实现方案:
方案一:使用RETURNING参数返回(推荐)
该方案语义清晰,调用时可以直接用内联声明接收返回值,是最常用的实现方式。
实现步骤
- 首先将自定义结构和表类型定义在类的公共可见区域,确保调用方可以识别该类型
- 方法定义时声明RETURNING参数,类型为定义好的内表类型
- 方法实现中将计算完成的内表直接赋值给RETURNING参数即可
代码示例
类定义部分
CLASS zcl_period_calculator DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. " 公共定义期间结构与内表类型 TYPES: BEGIN OF ty_period, begda TYPE dats, endda TYPE dats, END OF ty_period, tt_period TYPE STANDARD TABLE OF ty_period WITH EMPTY KEY. " 定义计算期间的方法,通过RETURNING返回内表 METHODS get_periods IMPORTING iv_start_date TYPE dats " 输入开始日期 iv_end_date TYPE dats " 输入结束日期 RETURNING VALUE(rt_periods) TYPE tt_period RAISING cx_invalid_date_range. " 可自定义异常处理非法日期范围 PRIVATE SECTION. ENDCLASS.
类实现部分
CLASS zcl_period_calculator IMPLEMENTATION. METHOD get_periods. " 此处替换为你已经开发完成的计算逻辑即可 DATA: lv_current_begda TYPE dats, lv_current_endda TYPE dats. lv_current_begda = iv_start_date. WHILE lv_current_begda <= iv_end_date. " 获取当月最后一天 lv_current_endda = cl_abap_dyn_prg=>last_day_of_month( lv_current_begda ). lv_current_endda = COND #( WHEN lv_current_endda > iv_end_date THEN iv_end_date ELSE lv_current_endda ). " 追加到返回内表 APPEND VALUE #( begda = lv_current_begda endda = lv_current_endda ) TO rt_periods. " 跳转至下一月第一天 lv_current_begda = lv_current_endda + 1. ENDWHILE. ENDMETHOD. ENDCLASS.
调用示例
DATA(lo_calc) = NEW zcl_period_calculator( ). " 直接接收返回的内表 DATA(lt_periods) = lo_calc->get_periods( iv_start_date = '20200101' iv_end_date = '20200331' ). " 验证结果 LOOP AT lt_periods INTO DATA(ls_period). WRITE: / ls_period-begda, ' - ', ls_period-endda. ENDLOOP.
方案二:使用EXPORTING/CHANGING参数返回
如果需要同时返回多个结果,或者使用的ABAP版本较低不支持RETURNING传内表,可以使用该方案。
方法定义示例
METHODS get_periods IMPORTING iv_start_date TYPE dats iv_end_date TYPE dats EXPORTING et_periods TYPE tt_period ev_count TYPE i. " 可同时返回其他结果,例如期间总数
调用示例
DATA: lt_periods TYPE zcl_period_calculator=>tt_period, lv_count TYPE i. lo_calc->get_periods( EXPORTING iv_start_date = '20200101' iv_end_date = '20200331' IMPORTING et_periods = lt_periods ev_count = lv_count ).
注意事项
- 若需要跨程序调用该方法,建议将结构和表类型创建为ABAP字典全局类型,避免类型不兼容问题
- RETURNING参数只能定义一个,多返回值场景请使用EXPORTING参数
- 7.40及以上ABAP版本支持内联声明
DATA()直接接收返回值,低版本需要先手动声明内表变量再接收
内容的提问来源于stack exchange,提问作者ix.trc
相关产品推荐
相关产品推荐

