上一节学习了the single read ( get_entity ),这一节学习$filter的使用。
更详细学习请参看:SAP Press – OData and SAP NetWeaver Gateway
1 |
ODATA学习(SAP Press - OData and SAP NetWeaver Gateway)第6.5.3章节,第272页 |
下面是一个为ODATA实现$filter的ECC例子。
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 |
method ZTSALE_HSET_GET_ENTITYSET. DATA:gt_data TYPE STANDARD TABLE OF ZTSALE_H. FIELD-SYMBOLS:<gs_data> TYPE ZTSALE_H. DATA: LS_ENTITYSET LIKE LINE OF ET_ENTITYSET. DATA: ls_filter_select_options TYPE /IWBEP/S_MGW_SELECT_OPTION , ls_seLect_option TYPE /IWBEP/S_COD_SELECT_OPTION . DATA: II_GJAHR TYPE EVAL_IV_GJAHR_RANGE_T, LS_GJAHR TYPE LINE OF EVAL_IV_GJAHR_RANGE_T, II_ZSALEID TYPE ZRANGE_SALEID_T, LS_ZSALEID TYPE LINE OF ZRANGE_SALEID_T. DATA: LS_FIELD TYPE FIELD. LOOP AT IT_FILTER_SELECT_OPTIONS INTO LS_FILTER_SELECT_OPTIONS . LS_FIELD = LS_FILTER_SELECT_OPTIONS-PROPERTY. TRANSLATE LS_FIELD TO UPPER CASE. IF LS_FIELD EQ 'GJAHR'. LOOP AT LS_FILTER_SELECT_OPTIONS-SELECT_OPTIONS INTO LS_SELECT_OPTION . MOVE-CORRESPONDING LS_SELECT_OPTION TO LS_GJAHR. APPEND LS_GJAHR TO II_GJAHR . ENDLOOP . ELSEIF LS_FIELD EQ 'ZSALEID '. LOOP AT LS_FILTER_SELECT_OPTIONS-SELECT_OPTIONS INTO LS_SELECT_OPTION . MOVE-CORRESPONDING LS_SELECT_OPTION TO LS_ZSALEID. APPEND LS_ZSALEID TO II_ZSALEID . ENDLOOP . ENDIF. ENDLOOP. |
代码激活后,就可以使用如:/sap/opu/odata/sap/ZSALE_SRV/ZTSALE_H?$filter= (Gjahr eq ‘2016’ and Zsaleid eq ‘1002’)的方式进行筛选数据了。
但使用中发现,以下几点:
由于定义的Entity type 时使用的是引入的表结构,系统自动把字段名的除第一位外的其它位都修改成了小写,所以在地址中的Gjahr,除第一位外都是小写字母,虽然在GET_ENTITYSET的方法中把传入的字母转换为了大写要处理,但当你地址中使用的是GJAHR而不是Gjahr时,打开时会报错的,调试发现这里都进不了 GET_ENTITYSET的方法中,错误如下:
<Error_Resolution>
<SAP_Transaction>Run transaction /IWFND/ERROR_LOG on SAP NW Gateway hub system and search for entries with the timestamp above for more details</SAP_Transaction>
<SAP_Note>See SAP Note 1797736 for error analysis (https://service.sap.com/sap/support/notes/1797736)</SAP_Note>
</Error_Resolution>
(Gjahr eq ‘2016’ and Zsaleid eq ‘1002’)这其中有的 连接多个参数时使用的连接是“and”,还必须是小写,不能是大写字母,其中的eq也必须是小写,也不能修改成”=”
Note that the preparation of the ranges tables has certain limitations.
Similar to defining an ABAP report with se l ect -options fields, you
can’t cover all use cases. For example, a filter such as Fi eldA eq ‘A’ or
FieldB eq ‘B’ can’t be put into ranges tables because of the or operator.
It would work if you use and instead of or , but that’s of course a differ·
ent statement and thus has a different result.
For these cases, the framework provides the import variable I V_F I L TER_
STRING that contains the actual filter string provided via the Hi 1 ter
query option (but not in a ranges tables style).
更多的查询选项请参看$select , $filter , $top , $skip , $inlinecount , and$orderby。