此例子是创建一个ODATA,为了管理自定义用户二次登陆的表,主要以对表ZTUSER做一个增删改的ODATA,为例子说明类方法的代码,
1.1.创建表ZTUSER.
2.2.SEGW创建ODATA项目,
并创建使用表ZTUSER的Entity,如图
3.事务码/IWFND/MAINT_SERVICE激活ODATA服务
3.4.重定义读单行的类方法,
注:经测试发现,当用户使用POST提交(就是调用UPDATA的更新方法)时,ODATA服务器会选调用此此计单行的类方法,如此方法不能正常读取时UPDATA的方法是不会正常运行的。
在这步重定义读单行的ZTUSERSET_GET_ENTITY方法,内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
METHOD ZTUSERSET_GET_ENTITY. DATA: LS_FILTER_SELECT_OPTIONS TYPE LINE OF /IWBEP/T_MGW_SELECT_OPTION, LS_SELECT_OPTIONS TYPE LINE OF /IWBEP/T_COD_SELECT_OPTIONS, ES_ENTITYSET TYPE LINE OF ZCL_ZUSER_MANGE_MPC=>TT_ZTUSER. DATA: LS_KEY_TAB TYPE LINE OF /IWBEP/T_MGW_NAME_VALUE_PAIR. DATA: LO_MESSAGE_CONTAINER TYPE REF TO /IWBEP/IF_MESSAGE_CONTAINER. DATA: L_MSGTX TYPE SYMSGV, L_MSG_TEXT TYPE BAPI_MSG. DATA: L_BNAME TYPE XUBNAME, LS_MESSAGE TYPE SCX_T100KEY. LOOP AT IT_KEY_TAB INTO LS_KEY_TAB. IF LS_KEY_TAB-NAME = 'Bname'. L_BNAME = LS_KEY_TAB-VALUE. EXIT. ENDIF. ENDLOOP . *--------------------------------------------------------------------* SELECT SINGLE * INTO CORRESPONDING FIELDS OF ER_ENTITY FROM ZTUSER WHERE BNAME = L_BNAME. ENDMETHOD. |
4.5.读多行类方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
METHOD ztuserset_get_entityset. DATA: ls_filter_select_options TYPE LINE OF /iwbep/t_mgw_select_option, ls_select_options TYPE LINE OF /iwbep/t_cod_select_options, es_entityset TYPE LINE OF ZCL_ZUSER_MANGE_MPC=>TT_ZTUSER. DATA: RT_BNAME TYPE ZTBNAME_RANGE, RS_BNAME TYPE LINE OF ZTBNAME_RANGE, RT_NAME_TEXT TYPE ZTNAME_TEXT_RANGE, RS_NAME_TEXT TYPE LINE OF ZTNAME_TEXT_RANGE. DATA: ls_key_tab TYPE LINE OF /iwbep/t_mgw_name_value_pair. DATA: lo_message_container TYPE REF TO /iwbep/if_message_container. DATA: l_msgtx TYPE symsgv, l_msg_text TYPE bapi_msg. LOOP AT it_filter_select_options INTO ls_filter_select_options. IF ls_filter_select_options-property = 'Bname'."用户名 LOOP AT ls_filter_select_options-select_options INTO ls_select_options. MOVE-CORRESPONDING LS_SELECT_OPTIONS to RS_BNAME. APPEND RS_BNAME TO RT_BNAME. CLEAR: RS_BNAME. ENDLOOP. ELSEIF ls_filter_select_options-property = 'NameText'."用户名 LOOP AT ls_filter_select_options-select_options INTO ls_select_options. MOVE-CORRESPONDING LS_SELECT_OPTIONS to RS_NAME_TEXT. APPEND RS_NAME_TEXT TO RT_NAME_TEXT. CLEAR: RS_NAME_TEXT. ENDLOOP. ENDIF. ENDLOOP . LOOP AT it_key_tab INTO ls_key_tab. IF ls_key_tab-name = 'Bname'. RS_BNAME-SIGN = 'I'. RS_BNAME-OPTION = 'EQ'. RS_BNAME-LOW = ls_key_tab-value. APPEND RS_BNAME TO RT_BNAME. CLEAR: RS_BNAME. ELSEIF ls_key_tab-name = 'Name_text'. RS_NAME_TEXT-SIGN = 'I'. RS_NAME_TEXT-OPTION = 'EQ'. RS_NAME_TEXT-LOW = ls_key_tab-value. APPEND RS_NAME_TEXT TO RT_NAME_TEXT. CLEAR: RS_NAME_TEXT. ENDIF. ENDLOOP . *--------------------------------------------------------------------* SELECT * INTO CORRESPONDING FIELDS OF TABLE et_entityset FROM ZTUSER WHERE BNAME IN RT_BNAME OR NAME_TEXT IN RT_NAME_TEXT. *--------------------------------------------------------------------* * IF l_msgtx IS NOT INITIAL. * l_msg_text = l_msgtx. * CALL METHOD me->/iwbep/if_mgw_conv_srv_runtime~get_message_container * RECEIVING * ro_message_container = lo_message_container. * * CALL METHOD lo_message_container->add_message * EXPORTING * iv_msg_type = /iwbep/cl_cos_logger=>error * iv_msg_id = '00' * iv_msg_number = '000' * iv_msg_text = l_msg_text * iv_msg_v1 = l_msgtx * iv_add_to_response_header = abap_true. "add the message to the header * * ENDIF. ENDMETHOD. |
5.6.创建行类方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
METHOD ZTUSERSET_CREATE_ENTITY. BREAK YANGSEN. DATA: LS_ZTUSER TYPE ZTUSER. 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. IO_DATA_PROVIDER->READ_ENTRY_DATA( IMPORTING ES_DATA = LS_ZTUSER ). INSERT ZTUSER FROM LS_ZTUSER. IF SY-SUBRC = 0. MOVE-CORRESPONDING LS_ZTUSER TO ER_ENTITY. ELSE. L_MSGTX = '保存数据失败'. * L_MSG_TEXT = L_MSGTX. * CALL METHOD ME->/IWBEP/IF_MGW_CONV_SRV_RUNTIME~GET_MESSAGE_CONTAINER * RECEIVING * RO_MESSAGE_CONTAINER = LO_MESSAGE_CONTAINER. * * CALL METHOD LO_MESSAGE_CONTAINER->ADD_MESSAGE * EXPORTING * IV_MSG_TYPE = /IWBEP/CL_COS_LOGGER=>ERROR * IV_MSG_ID = '00' * IV_MSG_NUMBER = '000' * IV_MSG_TEXT = L_MSG_TEXT * IV_MSG_V1 = L_MSGTX * IV_ADD_TO_RESPONSE_HEADER = ABAP_TRUE. "add the message to the header LS_MESSAGE-MSGID = ''. LS_MESSAGE-MSGNO = ''. LS_MESSAGE-ATTR1 = L_MSGTX. RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTION EXPORTING TEXTID = LS_MESSAGE. ENDIF. ENDMETHOD. |
6.7.更新行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
METHOD ZTMENUSET_UPDATE_ENTITY. DATA: LS_ZTMENU TYPE ZTMENU. 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. "得到传入数据。 IO_DATA_PROVIDER->READ_ENTRY_DATA( IMPORTING ES_DATA = LS_ZTMENU ). MODIFY ZTMENU FROM LS_ZTMENU. IF SY-SUBRC = 0. MOVE-CORRESPONDING LS_ZTMENU TO ER_ENTITY. ELSE. L_MSGTX = '保存数据失败'. * L_MSG_TEXT = L_MSGTX. * CALL METHOD ME->/IWBEP/IF_MGW_CONV_SRV_RUNTIME~GET_MESSAGE_CONTAINER * RECEIVING * RO_MESSAGE_CONTAINER = LO_MESSAGE_CONTAINER. * * CALL METHOD LO_MESSAGE_CONTAINER->ADD_MESSAGE * EXPORTING * IV_MSG_TYPE = /IWBEP/CL_COS_LOGGER=>ERROR * IV_MSG_ID = '00' * IV_MSG_NUMBER = '000' * IV_MSG_TEXT = L_MSG_TEXT * IV_MSG_V1 = L_MSGTX * IV_ADD_TO_RESPONSE_HEADER = ABAP_TRUE. "add the message to the header LS_MESSAGE-MSGID = ''. LS_MESSAGE-MSGNO = ''. LS_MESSAGE-ATTR1 = L_MSGTX. RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTION EXPORTING TEXTID = LS_MESSAGE. ENDIF. ENDMETHOD. |
7.8.删除行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
METHOD ZTUSERSET_DELETE_ENTITY. BREAK YANGSEN. DATA: LS_KEY_TAB TYPE LINE OF /IWBEP/T_MGW_NAME_VALUE_PAIR. DATA: L_BNAME TYPE XUBNAME, LS_MESSAGE TYPE SCX_T100KEY. LOOP AT IT_KEY_TAB INTO LS_KEY_TAB. IF LS_KEY_TAB-NAME = 'Bname'. L_BNAME = LS_KEY_TAB-VALUE. EXIT. ENDIF. ENDLOOP. IF L_BNAME = ''. LS_MESSAGE-ATTR1 = '只能按用户名删除'. RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTION EXPORTING TEXTID = LS_MESSAGE. RETURN. ENDIF. DELETE FROM ZTUSER WHERE BNAME = L_BNAME . IF SY-SUBRC <> 0 . LS_MESSAGE-ATTR1 = '删除用户时出错'. LS_MESSAGE-ATTR2 = L_BNAME. RAISE EXCEPTION TYPE /IWBEP/CX_MGW_BUSI_EXCEPTION EXPORTING TEXTID = LS_MESSAGE. RETURN. ENDIF. ENDMETHOD. |
8.说明:
1.此代码是为后面用SAPUI5做用户管理APP使用,
2.代码也是第一次写,功能在使用SAPUI5测试正常,但代码可能存不合理现象。
3.在代码中都使用/IWBEP/CX_MGW_BUSI_EXCEPTION方式返回错误,并且此错误能在SAPUI5中捕获到,更多错误返回方法可查看:如何在ODATA服务中返回错误MESSAGE