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.
相关推荐
敢敢のwings2 小时前
智元 D1 强化学习sim-to-real系列 | Robot Lab 基于 Isaac Lab 的机器人强化学习使用(四)
数据库·redis·机器人
sunwenjian8862 小时前
DVWA靶场通关——SQL Injection篇
数据库·sql
LaughingZhu2 小时前
Product Hunt 每日热榜 | 2026-03-30
大数据·数据库·人工智能·经验分享·搜索引擎
代码派2 小时前
MySQL数据如何实时同步到StarRocks?NineData实操指南 原创
数据库·starrocks·mysql·数据库管理·慢sql·ninedata·ddl变更
小温冲冲2 小时前
Qt WindowContainer 完整实战示例:QWidget 嵌入 QML
开发语言·数据库·qt
xiaoliuliu123452 小时前
Android Studio 2025 安装教程:详细步骤+自定义安装路径+SDK配置(附桌面快捷方式创建)
java·前端·数据库
l1t3 小时前
这个插件使postgresql能访问ducklake数据湖。
数据库·postgresql
samson_www3 小时前
用nssm部署FASTAPI服务
数据库·python·fastapi
@insist1233 小时前
数据库系统工程师-分布式数据库与数据仓库核心考点及应用体系
数据库·数据仓库·分布式·软考·数据库系统工程师·软件水平考试