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.
相关推荐
上学的小垃圾6 小时前
01-数据库系统概述
数据库
二进制漫游记7 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996227 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄9 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato10 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67310 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy32210 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安11 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB11 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB11 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi