Fiori-Odata 实体集扩展应用实例介绍

本文档介绍了如何在后端通过/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITYSET方法实现OData实体集扩展,特别是在凭证预览场景中,以及在FIORI前端如何利用这些扩展数据。后端通过设置ET_EXPANDED_TECH_CLAUSES参数避免重复调用,而前端通过设置URL参数"$expand"获取并处理扩展数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、后端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);
				}
			});
		}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值