如何为通过CDS视图创建的OData服务生成供Fiori使用的function import
基于CDS视图的OData服务添加Function Import的实现方案
完全可以不依赖SEGW事务,为基于CDS视图生成的OData服务创建Function Import,主流实现方式分两种,对应不同的CDS服务架构:
场景1:RAP架构的CDS OData服务
如果是基于REST应用编程(RAP)模型开发的CDS服务,直接通过行为定义(BDL)声明静态操作即可自动生成对应的Function Import,无需额外配置:
- 在CDS行为定义中声明
static function类型的操作,指定输入参数和返回结构 - 实现对应操作的ABAP处理逻辑,激活后OData服务会自动生成同名Function Import
示例BDL代码:
define behavior for ZC_MyBusinessObject alias BO persistent table zmy_db_table lock master authorization master (global) { // 声明静态Function,无副作用、支持HTTP GET调用 static function GetTotalRecords( inputYear : abap.numc(4) ) result [1] abap.int4; }
场景2:传统@OData.publish: true发布的CDS OData服务
如果是使用@OData.publish: true注解直接发布的非RAP架构CDS OData服务,通过扩展OData服务的标准生成类手动注册即可:
- 找到服务对应的模型扩展类
*_MPC_EXT和数据提供扩展类*_DPC_EXT,命名规则通常为ZCL_<OData服务标识>_MPC_EXT/ZCL_<OData服务标识>_DPC_EXT - 重写
MPC_EXT类的DEFINE方法,注册Function Import的元数据:
METHOD define. super->define( ). " 创建Function Import实例 DATA(lo_func_import) = model->create_function_import( iv_name = 'GetCustomData' ). " 配置返回实体集,若返回基础类型可调用set_return_type方法 lo_func_import->set_return_entity_set( iv_entity_set_name = 'ZC_MYCDSVIEWSet' ). " 配置输入参数 DATA(lo_param) = lo_func_import->create_parameter( iv_name = 'Status' iv_abap_type = 'ABAP.CHAR(2)' ). lo_param->set_nullable( abap_false ). " 配置支持HTTP GET调用 lo_func_import->set_supported_for_http_get( abap_true ). ENDMETHOD.
- 重写
DPC_EXT类的/IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION方法,实现业务逻辑:
METHOD /iwbep/if_mgw_appl_srv_runtime~execute_action. CASE iv_action_name. WHEN 'GetCustomData'. " 读取传入参数 DATA(lv_status) = it_parameter[ name = 'Status' ]-value. " 自定义业务逻辑处理,返回结果 SELECT * FROM zc_mycdsview WHERE status = @lv_status INTO CORRESPONDING FIELDS OF TABLE @er_data. WHEN OTHERS. " 调用标准逻辑处理其他请求 super->/iwbep/if_mgw_appl_srv_runtime~execute_action( EXPORTING iv_action_name = iv_action_name iv_entity_set_name = iv_entity_set_name iv_source_name = iv_source_name it_parameter = it_parameter io_tech_request_context = io_tech_request_context IMPORTING er_data = er_data es_response_context = es_response_context ). ENDCASE. ENDMETHOD.
上述两种方式生成的Function Import均可直接在Fiori应用中正常调用,和SEGW创建的Function Import使用逻辑完全一致。
内容的提问来源于stack exchange,提问作者tanto39
相关产品推荐
相关产品推荐

