SAP CDS对数据进行排序后读取第一条数据

举个例子,如果需要一个cds来读取物料的销售视图(MVKE表),只取其中一条,单纯用CDS的话,很难实现(其实可以实现),但是如果用AMDP的话,实现起来就很快。

首先创建一个table function的cds,如下所示:

bash 复制代码
@EndUserText.label: 'Get material sales data'
@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #SESSION_VARIABLE
define table function ZI_GET_MVKE
  with parameters
    @Environment.systemField: #CLIENT
    P_SAPClient : abap.clnt
returns
{
  mandt : abap.clnt;
  matnr : matnr;
  vkorg : vkorg;
  vtweg : vtweg;
  mtpos : mtpos;
}
implemented by method
  zcl_material_sales_data=>get_mvke;

创建class:zcl_material_sales_data,引用接口:if_amdp_marker_hdb,实现方法get_mvke

bash 复制代码
CLASS zcl_material_sales_data DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    INTERFACES if_amdp_marker_hdb .

    CLASS-METHODS get_mvke
        FOR TABLE FUNCTION zi_get_mvke.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.



CLASS zcl_material_sales_data IMPLEMENTATION.

  METHOD get_mvke
  BY DATABASE FUNCTION FOR HDB
   LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING mvke.

*    gt_mvke = select mandt,
*                     matnr,
*                     vkorg,
*                     vtweg
*               from mvke
*               orDER BY matnr, vkorg, vtweg;
*    gt_mvke2 = SELECT mandt,
*                      matnr,
*                      concat( vkorg,vtweg ) as salesdata
*               FROM:gt_mvke;
*    gt_mvke3 = SELECT mandt,
*                      matnr,
*                      MIN(salesdata) as salesdata
*               FROM:gt_mvke2
*               GROUP BY mandt,matnr;
*    gt_mvke4 = SELECT mandt,
*                      matnr,
*                      left(salesdata,4) AS vkorg,
*                      right(salesdata,2) AS vtweg
*               from:gt_mvke3;
*   RETURN
*      select a.mandt,
*             a.matnr,
*             a.vkorg,
*             a.vtweg,
*             a.mtpos
*         from mvke as a
*         inner join :gt_mvke4 as b
*         on  a.mandt = b.mandt
*         and a.matnr = b.matnr
*         and a.vkorg = b.vkorg
*         and a.vtweg = b.vtweg
*         ordER BY matnr;

    RETURN
      select mandt,
             matnr,
             vkorg,
             vtweg,
             mtpos
       from (
            SELECT mandt,
                   matnr,
                   vkorg,
                   vtweg,
                   mtpos,
                   ROW_NUMBER() over (
                     PARTITION BY mandt,matnr
                     ORDER BY vkorg,vtweg asc
                   ) as rn
                 from mvke
               ) as a
          where a.rn = 1
          order by matnr;

  ENDMETHOD.

ENDCLASS.
相关推荐
2401_8414956417 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
Hardworking66619 小时前
第7章 软硬件系统集成
数据库·软硬件系统集成
名字还没想好☜19 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
熊猫钓鱼>_>19 小时前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
wenb1n20 小时前
MySQL诊断系列(3/6):索引分析——5个SQL揪出“僵尸索引”
数据库·人工智能·编程语言
段一凡-华北理工大学20 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
ClouGence1 天前
CloudDM 数据库管理平台,全新 UI,更清晰、更高效!
数据库·开源
花生了什么事o1 天前
DDD:领域驱动设计的初步认识
java·数据库
BGK1123581 天前
基于qemu_v8+optee 4.00 平台构建 ca/ta
java·大数据·数据库
何中应1 天前
Spring Boot整合Doris
java·数据库·spring boot