一、后端Odata实现
实体集扩展多用于抬头和行项目整合
方法:/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET,在这里需要注意的是我们要告诉gateway已经在单个实体集中扩展了子实体集,无需再次去调用,可以用参数ET_EXPANDED_TECH_来实现这一点,另外 Navigation的名字必须和定义的名字相同,也可拼接两个entity,定义一个深层次结构的表来重新覆盖ER_ENTITYSET
DATA:lt_filters TYPE /iwbep/t_mgw_select_option,
lr_bzdh TYPE RANGE OF zyke_bzdh,
ls_bzdh LIKE LINE OF lr_bzdh.
DATA: ls_case LIKE LINE OF et_expanded_tech_clauses.
FIELD-SYMBOLS: <fs_filters> TYPE /iwbep/s_mgw_select_option,
<fs_select_options> TYPE /iwbep/s_cod_select_option.
DATA(ls_entity) = io_tech_request_context->get_entity_type_name( ).
CASE ls_entity.
WHEN 'Bidocuheader'."凭证预览
ls_case = 'BIDOCUHEADERSET/BIDOCUITEMSET'.
APPEND ls_case TO et_expanded_tech_clauses.
REFRESH:lt_filters,
lr_bzdh.
lt_filters = io_tech_request_context->get_filter( )->get_filter_select_options( ).
LOOP AT lt_filters ASSIGNING <fs_filters>.
CASE <fs_filters>-property.
WHEN 'ZBZDH'.
LOOP AT <fs_filters>-select_options ASSIGNING <fs_select_options>.
MOVE-CORRESPONDING <fs_select_options> TO ls_bzdh .
APPEND ls_bzdh TO lr_bzdh.
CLEAR ls_bzdh.
ENDLOOP.
ENDCASE.
ENDLOOP.
*获取凭证预览数据
LOOP AT lt_header INTO DATA(ls_head).
MOVE-CORRESPONDING ls_head TO ls_data.
LOOP AT lt_item INTO DATA(ls_item) WHERE xh = ls_head-xh.
* IF ls_data-zywlx = '1501008' AND ls_item-wrbtr IS INITIAL.
* CONTINUE.
* ELSE.
APPEND ls_item TO ls_data-bidocuitemset.
* ENDIF.
ENDLOOP.
APPEND ls_data TO lt_data.
CLEAR ls_data.
ENDLOOP.
copy_data_to_ref(
EXPORTING
is_data = lt_data
CHANGING
cr_data = er_entityset ).
WHEN OTHERS.
ENDCASE.
二、 FIORI前端实现
可以看见前端向在读取BidocuheaderSet的时候向后端发起请求的时候就带有一个扩展试图
获取后端传过来的值
代码部分
onInit: function() {
var headJSONModel = new JSONModel([]);
var itemJSONModel = new JSONModel([]);
var footJSONModel = new JSONModel([]);
this.byId("headTable").setModel(headJSONModel);
this.byId("itemTable").setModel(itemJSONModel);
this.getView().setModel(headJSONModel, "headList");
this.getView().setModel(itemJSONModel, "itemList");
this.getView().getModel("itemList").setSizeLimit(1000);
this.getView().setModel(footJSONModel, "headInfo");
},
onAfterRendering: function() {
var that = this;
var sZbzdh = this.getGlobalVar("Zbzdh");
var aFilter = [];
aFilter.push(new Filter("Zbzdh", FilterOperator.EQ, sZbzdh));
this.getModel().read("/BidocuheaderSet", {
filters: aFilter,
urlParameters: {
"$expand": "BidocuitemSet"
},
success: function(oData, response) {
var aHead = [];
var aItem = [];
if (oData.results) {
for (var i in oData.results) {
var oHead = oData.results[i];
for (var j in oData.results[i].BidocuitemSet.results) {
var oItem = oData.results[i].BidocuitemSet.results[j];
aItem.push(oItem);
}
delete oHead.BidocuitemSet;
aHead.push(oHead);
}
}
that.getView().getModel("headList").setData(aHead);
that.getView().getModel("itemList").setData(aItem);
that.selectFirstItem();
that.setGlobalVar("busy", false);
},
error: function(oError) {
that.setGlobalVar("busy", false);
}
});
}