OData-filter

Gateway的OData不可以直接自定义参数传入,filter可以侧面的解决这个问题,后端的开发也比较简单,它只能用的GET_ENTITYSET中,如下例:

/sap/opu/odata/sap/ZGRC_ROLES_SRV/ZROLESet?$filter= XT eq 'ECTCLNT800' and GS eq '10000001' and MK eq 'FI'
在EntitySet后加’?$filter=’,然后接要传入的filter条件,这时个可以看下图,这个data model的getentity方法中有两个参数IV_FILTER_STRINGIT_FILTER_SELECT_OPTIONS可以捕获到传入的值,可以根据需要使用。



如果输入有'就需要转义,比如要传入 ECTCLNT800's server,就需要写成XT eq 'ECTCLNT800''s server'

需要注意的一点是,如果同一个参数要传入多个值,比如这里要传入GS eq ‘10000001’,GS eq ‘10000002’,GS eq ‘10000003’,简单的这样写$filter= XT eq 'ECTCLNT800' and GS eq '10000001' or GS eq '10000002' or GS eq '10000003' and MK eq 'FI'IT_FILTER_SELECT_OPTIONS参数是没有值的。用or时只能有一个filter参数,多个参数时不要这样用

虽然IV_FILTER_STRING有值,使用起来也很难受。

那同一个参数传入多个值怎么办?
我的测试是这样的,虽然SAP的Gateway Client不能这样用,但实际在前端的使用中是不受影响的。参照下面的写法,是可以正常传入的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var aFilter = [];
   aFilter.push(new sap.ui.model.Filter("ZMKSel",sap.ui.model.FilterOperator.EQ,"01"));
   aFilter.push(new sap.ui.model.Filter("ZOrgUnitSel",sap.ui.model.FilterOperator.EQ,"A01"));
   aFilter.push(new sap.ui.model.Filter("ZBCSFlag",sap.ui.model.FilterOperator.EQ,""));
   aFilter.push(new sap.ui.model.Filter("ZUser",sap.ui.model.FilterOperator.EQ,"10000006"));
   aFilter.push(new sap.ui.model.Filter("ZUser",sap.ui.model.FilterOperator.EQ,"10000007"));
   
   oModel.read("/ZMKSet",{
    urlParameters: '&$format=json',
    filters: aFilter,
    success: function(oData) {
     alert('success');
    },
    error: function(oData) {
     alert('failed');
    }
   });

GET_ENTITYSET中的写法,可以用IT_FILTER_SELECT_OPTIONS也可以用方法来取,一样的:

1
2
3
DATA: lt_filter_options TYPE /iwbep/t_mgw_select_option.
lt_filter_options = io_tech_request_context->get_filter( )->get_filter_select_options( ).

下面放一个实际的代码例子:

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
METHOD zroleset_get_entityset.
**TRY.
*CALL METHOD SUPER->ZROLESET_GET_ENTITYSET
* EXPORTING
* IV_ENTITY_NAME =
* IV_ENTITY_SET_NAME =
* IV_SOURCE_NAME =
* IT_FILTER_SELECT_OPTIONS =
* IS_PAGING =
* IT_KEY_TAB =
* IT_NAVIGATION_PATH =
* IT_ORDER =
* IV_FILTER_STRING =
* IV_SEARCH_STRING =
** IO_TECH_REQUEST_CONTEXT =
** IMPORTING
** ET_ENTITYSET =
** ES_RESPONSE_CONTEXT =
* .
** CATCH /IWBEP/CX_MGW_BUSI_EXCEPTION .
** CATCH /IWBEP/CX_MGW_TECH_EXCEPTION .
**ENDTRY.
DATA: l_zmk_sel TYPE string,
l_zsys_sel TYPE string,
l_zcomp_sel TYPE string,
l_zroleid_sel TYPE string,
l_zrolems_sel TYPE string,
l_zroleyw_sel TYPE string,
l_zcount_sel TYPE i.
DATA: lt_role TYPE STANDARD TABLE OF zgrc_s_rfc_req_item,
ls_role LIKE LINE OF lt_role,
lt_user TYPE STANDARD TABLE OF zgrc_s_rfc_user_info,
ls_user LIKE LINE OF lt_user.
DATA: lt_filter_options TYPE /iwbep/t_mgw_select_option.
DATA ls_filter TYPE /iwbep/s_mgw_select_option.
DATA ls_filter1 TYPE /iwbep/s_cod_select_option.
DATA:lt_roleinfo TYPE STANDARD TABLE OF zcl_zgrc_roles_mpc=>ts_zrole .
DATA ls_roleinfo LIKE LINE OF lt_roleinfo.
lt_filter_options = io_tech_request_context->get_filter( )->get_filter_select_options( ).
LOOP AT lt_filter_options INTO ls_filter.
CASE ls_filter-property.
WHEN 'ZMK_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zmk_sel = ls_filter1-low.
WHEN 'ZSYS_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zsys_sel = ls_filter1-low.
WHEN 'ZCOMP_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zcomp_sel = ls_filter1-low.
WHEN 'ZROLEID_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zroleid_sel = ls_filter1-low.
WHEN 'ZROLEMS_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zrolems_sel = ls_filter1-low.
WHEN 'ZROLEYW_SEL'.
READ TABLE ls_filter-select_options INTO ls_filter1 INDEX 1.
l_zroleyw_sel = ls_filter1-low.
WHEN 'ZUSER'.
LOOP AT ls_filter-select_options INTO ls_filter1.
ls_user-USERID = ls_filter1-low.
APPEND ls_user TO lt_user.
ENDLOOP.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
IF l_zcount_sel = 0.
l_zcount_sel = 99999.
ENDIF.
CALL FUNCTION 'ZGRC_FM_ROLE_GETLIST'
EXPORTING
zmk_sel = l_zmk_sel
zsys_sel = l_zsys_sel
zcomp_sel = l_zcomp_sel
zroleid_sel = l_zroleid_sel
zrolems_sel = l_zrolems_sel
zroleyw_sel = l_zroleyw_sel
zcount_sel = l_zcount_sel
TABLES
mt_role = lt_role
mt_user = lt_user.
IF sy-subrc = 0.
LOOP AT lt_role INTO ls_role .
"过滤‘角色’‘角色描述’‘业务角色’
IF l_zroleyw_sel IS NOT INITIAL.
IF ls_role-funarea_desc CS l_zroleyw_sel.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
IF l_zrolems_sel IS NOT INITIAL.
IF ls_role-role_desc CS l_zrolems_sel.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
IF l_zroleid_sel IS NOT INITIAL.
IF LS_ROLE-ITEM_NAME CS l_zroleid_sel.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
ls_roleinfo-ZROLEID_SEL = ls_role-item_name.
MOVE-CORRESPONDING ls_role TO ls_roleinfo.
APPEND ls_roleinfo TO lt_roleinfo.
ENDLOOP.
ENDIF.
et_entityset = lt_roleinfo[].
ENDMETHOD.

filter的operator可以参考下图:

除了这些operator之外,还可以直接用一些函数来转义:

我没有一一测试,大多是可以用的,像startswith这种还是很好用的,它在后端自动会转变为CP,如and startswith(MK,'FI')

$select

$select可以指定要返回的字段,这个参数不需要在后端指定

这里就返回了指定的ROLEFunarea两个字段

参考

http://www.odata.org/documentation/odata-version-2-0/uri-conventions/

Jim Guo wechat
ex. subscribe to my blog by scanning my public wechat account