SAP Odata実行命令(2)

分页技术详解
本文介绍了一种通过使用$skiptoken参数实现的数据分页技术,该技术有助于限制应用程序接收的数据条目数量,从而提高性能。文章详细展示了如何在SAP系统中定义页面大小并请求特定范围的数据。

前言

$ skiptokenは、アプリケーションに送信されるエントリ数を制限するために使用されます。 膨大な数のエントリが要求された場合、これはパフォーマンスの向上にも役立ちます。次のリンクがアプリケーションに戻って提供され、次の大量のデータを取得します。

構文

http://<server>:<port>/sap/opu/odata/sap/<service_name>/ProductsSet?$skiptoken=10

使い方法

  • サーバーでページサイズ、つまりDPC_EXTクラスのGET_ENTITYSETメソッドを定義する必要があります。
  • エンティティセットのエントリがページサイズより大きい場合は、エントリをページサイズで割ります。
  • skiptoken値と、次のエントリセットへの次のリンクに基づいて、要求されたエントリセットをアプリケーションに送信します。 詳細は下の画像をご覧ください。

skiptoken logic

 

Step.1


Go to ABAP Workbench

 

 

Step.2 

PRODUCTSSET_GET_ENTITYSET ソースコードは以下のようです。

DATA:      ls_order          TYPE /iwbep/s_mgw_sorting_order,
           lt_products       TYPE STANDARD TABLE OF bapi_epm_product_header,
           ls_products       TYPE bapi_epm_product_header,
           ls_entityset      TYPE zcl_zdemo_gw_srv_mpc=>ts_products,
           lt_entityset      TYPE zcl_zdemo_gw_srv_mpc=>tt_products,
           lv_max_rows       TYPE bapi_epm_max_rows,
           ls_filter         TYPE /iwbep/s_mgw_select_option,
           lr_product_id     TYPE TABLE OF  bapi_epm_product_id_range,
           ls_product_id     TYPE bapi_epm_product_id_range,
           ls_select_options TYPE /iwbep/s_cod_select_option.

* >> Check if $filter option is available
* Get the filter option for product ID
    READ TABLE it_filter_select_options
        INTO ls_filter
        WITH KEY property = 'ProductId'.
    IF sy-subrc = 0.
      LOOP AT ls_filter-select_options INTO ls_select_options.
        MOVE-CORRESPONDING ls_select_options TO ls_product_id.
        APPEND ls_product_id TO lr_product_id.
      ENDLOOP.
    ENDIF.

* Call the BAPI by providing the filter options
* if no filter, BAPI will get the entire list of products
    CALL FUNCTION 'BAPI_EPM_PRODUCT_GET_LIST'
      TABLES
        headerdata        = lt_products
        selparamproductid = lr_product_id.
    IF lt_products IS NOT INITIAL.
      LOOP AT lt_products INTO ls_products.
        MOVE-CORRESPONDING ls_products TO ls_entityset.
        APPEND ls_entityset TO et_entityset.
      ENDLOOP.
    ENDIF.

  上記のソースだとすべてデータを取得しますので、

$skiptoken オプションでページサイズを設定します。

 

Step.3

PRODUCTSSET_GET_ENTITYSETに以下のようにページサイズを設定します。

DATA:  ls_order          TYPE /iwbep/s_mgw_sorting_order,
           lt_products       TYPE STANDARD TABLE OF bapi_epm_product_header,
           ls_products       TYPE bapi_epm_product_header,
           ls_entityset      TYPE zcl_zdemo_gw_srv_mpc=>ts_products,
           lt_entityset      TYPE zcl_zdemo_gw_srv_mpc=>tt_products,
           lv_max_rows       TYPE bapi_epm_max_rows,
           ls_filter         TYPE /iwbep/s_mgw_select_option,
           lr_product_id     TYPE TABLE OF  bapi_epm_product_id_range,
           ls_product_id     TYPE bapi_epm_product_id_range,
           ls_select_options TYPE /iwbep/s_cod_select_option.

* >> Check if $filter option is available
* Get the filter option for roduct ID
    READ TABLE it_filter_select_options
        INTO ls_filter
        WITH KEY property = 'ProductId'.
    IF sy-subrc = 0.
      LOOP AT ls_filter-select_options INTO ls_select_options.
        MOVE-CORRESPONDING ls_select_options TO ls_product_id.
        APPEND ls_product_id TO lr_product_id.
      ENDLOOP.
    ENDIF.

* Call the BAPI by providing the filter options
* if no filter, BAPI will get the entire list of products
    CALL FUNCTION 'BAPI_EPM_PRODUCT_GET_LIST'
      TABLES
        headerdata        = lt_products
        selparamproductid = lr_product_id.
    IF lt_products IS NOT INITIAL.
      LOOP AT lt_products INTO ls_products.
        MOVE-CORRESPONDING ls_products TO ls_entityset.
        APPEND ls_entityset TO lt_entityset.
      ENDLOOP.
    ENDIF.

    DATA: lv_page_size   TYPE i VALUE 50,  " Define the Page Size/
          lv_index_start TYPE i,
          lv_skiptoken   TYPE string,
          lv_index_end   TYPE i,
          lv_table_size  TYPE i.


* Obtain the $skiptoken value if it exists in the URL
    lv_skiptoken = io_tech_request_context->get_skiptoken( ).

* Clear the skiptoken, if the result is empty
    DESCRIBE TABLE lt_entityset LINES lv_table_size.
    IF lv_table_size IS INITIAL.
      CLEAR es_response_context-skiptoken.
      EXIT.
    ENDIF.

* If the table size is less than the predefined page size,
* send all the data
    IF lv_table_size < lv_page_size.
      et_entityset = lt_entityset.

* If the table size is beyond the predefined page size,
*    cut the whole table into pieces with the page size
    ELSE.
      lv_index_start = lv_skiptoken.
      lv_index_end   = lv_skiptoken + lv_page_size.
    ENDIF.

    LOOP AT lt_entityset INTO ls_entityset.
      IF sy-tabix > lv_index_start AND
         sy-tabix <= lv_index_end.
        APPEND ls_entityset TO et_entityset.
      ENDIF.
    ENDLOOP.

*  Next Link
    es_response_context-skiptoken = lv_index_end + 1.
    CONDENSE es_response_context-skiptoken.

 

Step.4

※画像では$skiptoken=20書いてますが、正しくは$skiptoken=10です。  

转载于:https://www.cnblogs.com/yjyongil/p/10614192.html

<think> 首先,用户提供了几条引用,但它们似乎与SAP OData相关,包括技术细节、缓存机制、实现方式和后台表。用户明确表示这些引用仅供参考,并非真正的需求。用户最后的问题是:“我想获取关于SAP OData的相关信息,可能包括使用方法、功能特性、相关案例等 请问SAP OData的详细介绍及使用相关内容”。所以,我需要基于系统指令,生成一个关于SAP OData的详细介绍。 系统指令包括: - 所有内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 基于引用,但用户说这些引用仅供参考,所以我不能完全依赖它们;需要确保回答真实可靠。 用户的问题是关于SAP OData的详细介绍和使用相关内容。因此,我需要覆盖: - OData是什么? - SAP OData的功能特性。 - 使用方法(例如,如何设置、实现)。 - 相关案例或示例。 - 可能包括技术细节如缓存、性能优化,但不限于引用。 引用摘要: - Ref[1]: 提到CSRF Token和性能分析。 - Ref[2]: 讨论OData模型的缓存机制。 - Ref[3]: OData实现方式,如CDS视图注解。 - Ref[4]: OData相关的后台表。 - Ref[5]: 附件下载的实现代码。 我需要自然地融入这些引用,但回答应全面。既然用户说“尽可能多的参考用户上一次的问题和你的回答”,但在对话历史中,这是首次互动(根据上下文),没有上一次问题。系统示例是快速排序,但用户当前问题是SAP OData。 回答结构: 1. **介绍SAP OData**:解释OData是什么,以及它在SAP中的角色。 2. **功能特性**:描述主要功能和特性。 3. **使用方法**:如何创建、部署和使用OData服务。 4. **技术细节**:包括缓存、实现方式等,基于引用。 5. **相关案例**:提供简单示例或场景。 6. **相关问题**:生成相关问题结尾。 确保使用中文。添加引用标识在相关段落末尾。 生成相关问题: - 如系统示例所示,在回答结束时生成几个相关问题。 数学表达式:由于主题是SAP OData,可能涉及技术参数,但不太可能涉及数学公式。如果有,使用指定格式。例如,如果有时间间隔或性能指标,但引用中没有明显数学内容。或许在缓存机制中提到时间戳比较,可以用公式表示,但保持简单。 步骤: - 开头介绍OData。 - 然后逐步展开。 - 在讨论缓存机制时,引用Ref[2]。 - 在实现方式时,引用Ref[3]。 - 在后台表时,引用Ref[4]。 - 在附件下载时,引用Ref[5]。 - CSRF Token在Ref[1],可以提到安全特性。 - 最后生成相关问题。 完整回答: - 结构化:使用标题或分段。 - 清晰:逐步解释。 - 真实可靠:基于通用知识,确保准确。如果不确定,避免猜测;参考标准SAP实践。 最终,生成相关问题,如: 1. SAP OData的缓存机制如何优化性能? 2. 如何使用CDS视图创建OData服务? 3. SAP OData在云集成中的应用场景? </think> ### SAP OData 详细介绍及使用指南 SAP OData(Open Data Protocol)是一种基于 RESTful 的标准协议,用于构建和消费 Web API,特别适用于 SAP 系统中的数据交换和集成。它基于 HTTP 协议,支持 CRUD(创建、读取、更新、删除)操作,并提供了统一的元数据格式(如 XML 或 JSON),便于在不同系统间高效传输数据。在 SAP 生态中,OData 常用于 SAP Gateway 服务器,实现 SAP ERP、S/4HANA 或 SAP UI5 应用的数据访问。下面,我将逐步介绍其核心内容,包括功能特性、使用方法、相关案例和技术细节,确保回答真实可靠,基于 SAP 标准文档和最佳实践。 #### 一. OData 的功能特性 SAP OData 提供了一系列强大功能,适用于企业级应用: - **标准化数据访问**:支持 RESTful 风格,使用 URI 定位资源,例如通过 `$filter` 或 `$select` 参数查询特定数据。 - **元数据描述**:通过 `/metadata` 端点提供数据模型的详细描述(如实体类型、关联关系),便于客户端动态解析[^2]。 - **安全机制**:集成 CSRF(Cross-Site Request Forgery)Token 保护,防止未授权操作。CSRF Token 是服务器端会话的属性,其超时时间可由管理员通过 RZ11 事务码配置[^1]。 - **高性能处理**:支持批处理请求(batch processing),减少网络开销;结合缓存机制优化响应速度。 - **灵活扩展**:允许添加自定义操作(如函数导入),适应业务逻辑需求。 - **跨平台兼容**:可与 SAP UI5、Fiori 应用无缝集成,也支持非 SAP 系统(如 .NET 或 Java)的数据消费。 这些特性使 SAP OData 成为企业数据共享的核心工具,尤其在微服务架构和云集成场景中。 #### 二. SAP OData 的使用方法 创建和部署 SAP OData 服务通常涉及以下步骤,用户可通过 SAP Gateway 事务码头(如 SEGW)实现。 1. **服务定义**: - **使用 SEGW 工具**:在 SAP 系统中,运 SEGW 事务码创建 OData 项目。定义实体集(Entity Sets)、实体类型(Entity Types)和关联(Associations)。这一步由 Data Model Provider Class (MPC) 处理元数据[^2]。 - **CDS 视图注解方式**:更现代的方法是使用 Core Data Services (CDS) 视图添加 OData 注解。例如,创建 CDS 视图时添加 `@OData.publish: true`,系统会自动生成 OData 服务。示例代码: ```sql @OData.publish: true define view ZCDS_SFLIGHT as select from sflight { key carrid, key connid, fldate, price } ``` 这种方式简化了开发,适用于 S/4HANA 系统[^3]。 2. **服务实现**: - **后台编码**:在 Data Provider Class (DPC) 中实现业务逻辑,覆盖方法如 `GET_ENTITYSET`(读取数据)或 `CREATE_ENTITY`(创建数据)。引用中提到附件下载的实现,例如在 DPC 中处理流数据: ```abap METHOD /iwbep/if_mgw_appl_srv_runtime~get_stream. DATA: ls_stream TYPE ty_s_media_resource, ls_header TYPE ihttpnvp. " 设置文件类型 IF iv_entity_name = 'Zfile'. READ TABLE it_key_tab INTO DATA(ls_guid) WITH KEY name = 'Guid'. IF sy-subrc = 0. SELECT SINGLE * FROM ztmm_htcq_fjgj INTO @DATA(ls_ztmm_htcq_fjgj) WHERE zno EQ @ls_guid-value. ls_stream-value = ls_ztmm_htcq_fjgj-content. " 文件内容 ls_stream-mime_type = ls_ztmm_htcq_fjgj-zwjlx. " 文件类型 copy_data_to_ref( EXPORTING is_data = ls_stream CHANGING cr_data = er_stream ). ENDIF. ENDIF. ENDMETHOD. ``` 此代码演示了如何从数据库读取附件并输出为 HTTP 流[^5]。 - **激活和注册**:部署服务后,通过 Gateway 的 `/IWFND/MAINT_SERVICE` 事务码注册 URI,确保客户端可访问。 3. **客户端消费**: - **前端集成**:使用 SAP UI5 或 JavaScript 调用 OData 服务。例如,通过 `sap.ui.model.odata.v2.ODataModel` 加载数据: ```javascript var oModel = new sap.ui.model.odata.v2.ODataModel("/sap/opu/odata/sap/Z_MY_SERVICE"); oModel.read("/EntitySet", {...}); ``` - **工具支持**:利用 Postman 或 SAP Gateway 客户端测试端点,确保参数如 `$top` 或 `$expand` 正确应用。 #### 三. 技术细节:缓存机制与性能优化 SAP OData 内置缓存功能提升性能,减少后台计算开销: - **缓存校验机制**:Gateway 系统在收到元数据请求(如 `/metadata`)时,首先查询缓存表 `/IWFND/I_MED_CTC`。如果缓存命中,系统检查缓存数据的最后修改时间戳是否与后台模型一致。这通过 MPC_EXT 类的 `GET_LAST_MODIFIED` 方法获取时间戳进比较。如果时间戳相等,直接使用缓存数据(避免重复调用后台方法);如果不相等,缓存过期,系统重新生成元数据[^2]。 - **性能考虑**:首次请求时缓存为空,需生成元数据(耗时较高);后续请求若缓存有效,响应时间显著降低。管理员可调整缓存策略,例如通过事务码优化超时设置。 #### 四. 相关案例 - **案例 1:销售订单查询**:在 SAP S/4HANA 中,创建 OData 服务检索订单数据。实体集基于 `VBAK` 表(销售订单抬头),客户端通过 `$filter=OrderStatus eq 'Open'` 筛选数据,集成到 Fiori 应用中提升用户体验。 - **案例 2:附件下载服务**:如引用所示,企业使用 OData 实现文件下载功能。实体 `Zfile` 存储附件内容,服务读取数据库表(如 `ztmm_htcq_fjgj`)并返回文件流,支持 MIME 类型处理[^5]。 - **案例 3:云集成**:SAP Cloud Platform 使用 OData 连接外部系统,例如将 Salesforce 数据导入 SAP,通过批处理减少 API 调用次数。 #### 五. 最佳实践与注意事项 - **安全**:启用 CSRF Token 防止攻击;测试表明短期内发送多个 OData 请求时,前一个可能被取消(需确保错误处理)[^1]。 - **性能优化**:监控缓存表(如 `/IWBEP/I_SBD_AT` 或 `/IWBEP/I_SBO_PR`)确保数据一致性[^4];避免过度查询,使用 `$inlinecount` 分页。 - **调试**:通过 SAP Gateway 日志分析请求,或使用 ST01 跟踪事务码排查问题。 - **常见陷阱**:缓存失效可能导致元数据错误;确保 MPC_EXT 方法正确更新时间戳。 SAP OData 是强大的数据集成工具,结合标准协议和 SAP 优化,广泛应用于企业数字化转型。如果您提供具体场景(如特定模块或错误),我可进一步细化解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值