举个例子,如果需要一个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.