ABAP 如何发布odata服务
迪丽瓦拉
2025-06-01 15:56:16
0

一、根据DDIC 发布odata服务

1.SE11创建相对应的结构或者表,或者直接使用自建表

2.SEGW-->新建

3.右键-->import-->DDIC

输入你的实体类型名称和DDIC名称

选择你需要的字段

选择主键字段

自动生成对象(每次DDIC的修改都要重新生成)

4.如图位置可以做一些设置筛选和更新排序的属性,供fiori使用

5.右键Runtime Artifacts --》Go to ABAP Workbench 根据需求重定义CURD的方法

6.我这边的需求是一个数据抽取接口。所以我重定义的是GET_ENTITYSET方法

实例代码如下:

DATA:LT_FILTERS TYPE                   /IWBEP/T_MGW_SELECT_OPTION,LS_FILTER  TYPE                   /IWBEP/S_MGW_SELECT_OPTION.DATA: LV_TOP        TYPE I,LV_SKIP       TYPE I,LV_TABLE_SIZE TYPE I.DATA:LS_ENTITYSET TYPE ZCL_ZMM_GET_MB51_MPC=>TS_ZMB51.DATA: LO_MESSAGE_CONTAINER TYPE REF TO /IWBEP/IF_MESSAGE_CONTAINER.DATA: LV_MSGTX    TYPE SYMSGV,LV_MSG_TEXT TYPE BAPI_MSG,LS_MESSAGE TYPE SCX_T100KEY.DATA:S_WERKS TYPE /IWBEP/T_COD_SELECT_OPTIONS.DATA:S_MATNR TYPE /IWBEP/T_COD_SELECT_OPTIONS.DATA:S_LGORT TYPE /IWBEP/T_COD_SELECT_OPTIONS.DATA:S_BUDAT TYPE /IWBEP/T_COD_SELECT_OPTIONS.DATA:GT_DATA TYPE STANDARD TABLE OF ZSMM_MB51.*-get filter for Posting dateREAD TABLE LT_FILTERS WITH TABLE KEY PROPERTY = 'BUDAT' INTO LS_FILTER.IF SY-SUBRC = 0.S_BUDAT = LS_FILTER-SELECT_OPTIONS.ELSE.LS_MESSAGE-MSGID = ''.LS_MESSAGE-MSGNO = ''.LS_MESSAGE-ATTR1 = '过账日期不能为空'.RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTIONEXPORTINGTEXTID = LS_MESSAGE.ENDIF.
*-get filterLT_FILTERS = IO_TECH_REQUEST_CONTEXT->GET_FILTER( )->GET_FILTER_SELECT_OPTIONS( ).
*-get filter for PlantREAD TABLE LT_FILTERS WITH TABLE KEY PROPERTY = 'WERKS' INTO LS_FILTER.IF SY-SUBRC = 0.S_WERKS = LS_FILTER-SELECT_OPTIONS.ENDIF.
*-get filter for Material numberREAD TABLE LT_FILTERS WITH TABLE KEY PROPERTY = 'MATNR' INTO LS_FILTER.IF SY-SUBRC = 0.S_MATNR = LS_FILTER-SELECT_OPTIONS.ENDIF.
*-get filter for Storage LocationREAD TABLE LT_FILTERS WITH TABLE KEY PROPERTY = 'LGORT' INTO LS_FILTER.IF SY-SUBRC = 0.S_LGORT = LS_FILTER-SELECT_OPTIONS.ENDIF.*$top and $skip Query OptionsLV_TOP = IO_TECH_REQUEST_CONTEXT->GET_TOP( ).LV_SKIP = IO_TECH_REQUEST_CONTEXT->GET_SKIP( ).SELECT MKPF~MBLNRMKPF~MJAHRZEILEVBELN_IMBUDATBWARTMSEG~MATNRMAKT~MAKTXMENGEMEINSMSEG~WERKSMSEG~LGORTT001L~LGOBECHARGSOBKZFROM MKPFINNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR AND MKPF~MJAHR = MSEG~MJAHRINNER JOIN MAKT ON MSEG~MATNR = MAKT~MATNR AND MAKT~SPRAS = SY-LANGULEFT JOIN T001L ON MSEG~LGORT = T001L~LGORT AND MSEG~WERKS = T001L~WERKSINTO TABLE GT_DATAWHERE BUDAT IN S_BUDATAND   MSEG~WERKS IN S_WERKSAND   MSEG~LGORT IN S_LGORTAND   MSEG~MATNR IN S_MATNR.*   >> Client Paging (top/skip)IF LV_TOP IS NOT INITIAL ORLV_SKIP IS NOT INITIAL.LOOP AT GT_DATA INTO DATA(LS_DATA).IF SY-TABIX > LV_SKIP.MOVE-CORRESPONDING LS_DATA TO LS_ENTITYSET.APPEND LS_ENTITYSET TO ET_ENTITYSET.LV_TABLE_SIZE = LINES( ET_ENTITYSET ).IF LV_TOP IS NOT INITIAL ANDLV_TABLE_SIZE >= LV_TOP.EXIT.ENDIF.ENDIF.ENDLOOP.ELSE.
*   >> No PagingET_ENTITYSET[] = GT_DATA[]..ENDIF.

列举一下几种报错的方法:

第一种直接报错
MESSAGE '条码内容为空!' TYPE 'E'.
MESSAGE '条码内容为空!' TYPE 'I'.
"这种报错只能在/IWFND/ERROR_LOG查询,对方系统无法知道什么原因
第二种,把报错消息写到header里面
*1. Instatiate the Message ContainerDATA: lo_message_container TYPE REF TO /iwbep/if_message_container.CALL METHOD me->/iwbep/if_mgw_conv_srv_runtime~get_message_containerRECEIVINGro_message_container = lo_message_container.CALL METHOD lo_message_container->add_messageEXPORTINGiv_msg_type               = /iwbep/cl_cos_logger=>warningiv_msg_id                 = 'ZTEST'iv_msg_number             = '000'iv_add_to_response_header = abap_true. "add the message to the header
第三种DATA: lo_message_container TYPE REF TO /iwbep/if_message_container.DATA: l_msgtx    TYPE symsgv,l_msg_text TYPE bapi_msg,LS_MESSAGE TYPE SCX_T100KEY.LS_MESSAGE-MSGID = ''.LS_MESSAGE-MSGNO = ''.LS_MESSAGE-ATTR1 = '保存数据失败'.RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTIONEXPORTINGTEXTID = LS_MESSAGE.

7.双击LOCAL-->Registe

8.SAP Gateway Client 去做测试

相关内容