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.
相关推荐
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql
白远山3 天前
上海24小时自助健身房解决方案实战指南与经验分享
java·数据库·架构·需求分析
Omics Pro3 天前
斯坦福Nature+Science|广义虚拟细胞基础大模型
数据库·人工智能·算法·机器学习·自然语言处理
2603_965148113 天前
AI+API选品:下一代智能商务助手雏形已现
java·大数据·数据库·人工智能·数据挖掘