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.
相关推荐
NineData2 分钟前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
J_bean43 分钟前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean1 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X1 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.1 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠2 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
刀客Doc2 小时前
即时零售不只是多一个渠道,品牌开始重做终端生意
大数据·数据库
就叫飞六吧2 小时前
防抖、幂等、唯一约束三件套 ;
数据库
神奇霸王龙2 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统3 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库