这是您的任务的解决方案的概念验证。
前提是我们已经根据与您的非常相似的表格按材料类型 ( MTART ) 数据集预先选择:mara
------------------------------------------------
| MATNR | ERSDA | VPSTA |MTART|
------------------------------------------------
| 17000000007|18.06.2018|KEDBXCZ |ZSHD |
| 17000000008|21.06.2018|K |ZSHD |
| 17000000011|21.06.2018|K |ZSHD |
| 17000000023|22.06.2018|KEDCBGXZLV|ZSHD |
| 17000000103|09.01.2019|K |ZSHD |
| 17000000104|09.01.2019|K |ZSHD |
| 17000000105|09.01.2019|K |ZSHD |
| 17000000113|06.02.2019|V |ZSHD |
------------------------------------------------
以下是材料,我们只想在创建日期 ( ERSDA ) 之前留下最后一个和第一个材料 ( MATNR ),并为第一个和最后一个找到维护类型 ( VPSTA )。
------------------------------------------------
| MATNR | ERSDA | VPSTA |MTART|
------------------------------------------------
| 17000000007|18.06.2018|KEDBXCZ |ZSHD |
| 17000000113|06.02.2019|V |ZSHD |
------------------------------------------------
在您的情况下,您类似地根据datefrom标准( )在每个POB(mtart
)源和目标合同contract_id(最后一个和第一个)中搜索。vpsta
ersda
一个可以使用UNION
子查询和两个选择来实现:
SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
FROM mara AS m
WHERE ersda = ( SELECT MAX( ersda ) FROM mara WHERE mtart = m~mtart )
UNION SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
FROM mara AS m2
WHERE ersda = ( SELECT MIN( ersda ) FROM mara WHERE mtart = m2~mtart )
ORDER BY type, date
INTO TABLE @DATA(lt_result).
在这里您可以注意到第一个选择获取最大ersda
日期,第二个选择获取最小日期。
按类型和日期排序的结果集将有点像您要查找的内容(F = 第一个,L = 最后一个):
您的 SELECT 应该看起来像这样:
SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
FROM farr_d_pob_his AS farr
WHERE datefrom = ( SELECT MAX( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr~pob_id )
UNION SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
FROM farr_d_pob_his AS farr2
WHERE datefrom = ( SELECT MIN( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr2~pob_id )
ORDER BY pob, date
INTO TABLE @DATA(lt_result).
请注意,这仅在您有唯一datefrom
日期时才有效,否则查询将不知道您要使用哪个最后/第一个合同。此外,如果每个 POB 中只有一个合同,则只有一个记录。
关于实施的几句话。在您的示例中,我看到您使用 AMDP 类,但后来您提到ORDER
CDS 不支持该类。是的,CDS 和子查询不支持它们,但 AMDP 支持它们。
您应该区分两种类型的 AMDP 函数:AMDP 方法的函数和 CDS 表函数的函数。第一个完美地处理带有排序和子查询的 SELECT。您可以在CL_DEMO_AMDP_VS_OPEN_SQL
演示类中查看演示 AMDP 功能(包括子查询)的示例。您可以在 AMDP 函数中派生代码并从 CDS 表函数实现中调用它。