CDS视图WHERE条件下的计算日期

Calculated date in WHERE condition of CDS view

我正在尝试获取通知对象的有效系统状态列表,为了不检查 table 中的所有通知,我想通过仅检查最后 2 个来执行选择多年的数据。

也许我的问题有更好的解决方案,但我仍然对这种技术限制感到好奇。据我所知,SAP 中的系统状态是硬编码的,无法通过任何 table 确定每个对象(SAP 可以随时添加新的系统状态)。

我尝试创建下面的 CDS 视图,但是函数 dats_add_months 不能在 where 条件下使用,有解决办法吗?请注意,7.50 没有系统日期的会话参数,所以我使用了一个环境变量:

define view ZNOTIF_SYS_STATUS 
    with parameters sydat : abap.dats @<Environment.systemField: #SYSTEM_DATE
    as select distinct from qmel as notif
    inner join jest as notif_status on notif_status.objnr = notif.objnr
                                   and notif_status.inact = ''
    inner join tj02t as sys_status on sys_status.istat = notif_status.stat
                                  and sys_status.spras = $session.system_language
{
    key sys_status.txt04 as statusID,
        sys_status.txt30 as description
} where notif.erdat > dats_add_months($parameters.sydat, -12, '') //THIS CAN'T BE USED!!

仅支持将内置函数放在 WHERE 的 RHS 位置 since 7.51 并且您说的是 7.50。这就是为什么它对豪杰有用而不对你有用。

这里可以做什么?可能的选项是消耗 AMDP-class 的 CDS table 函数。考虑这个示例:

Table函数

@EndUserText.label: 'table_func months'
define table function ZTF_MONTHS
with parameters 
@Environment.systemField : #SYSTEM_DATE 
    p_datum : syst_datum
returns {

    mandt : abap.clnt;
    num   : qmnum;
    type  : qmart;
 }
implemented by method zcl_cds_qmel=>get_last_two_years;

AMDP

CLASS zcl_cds_qmel DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC.

  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    TYPES: tt_statuses TYPE STANDARD TABLE OF qmel.
    CLASS-METHODS get_last_two_years FOR TABLE FUNCTION ztf_months.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS zcl_cds_qmel IMPLEMENTATION.
  METHOD get_last_two_years BY DATABASE FUNCTION
          FOR HDB
          LANGUAGE SQLSCRIPT
          OPTIONS READ-ONLY.

    twoyrs := add_months (CURRENT_DATE,-12)

    RETURN SELECT mandt, qmnum AS num, qmart AS type FROM qmel WHERE erdat > twoyrs;
  ENDMETHOD.
  ENDCLASS.

与您的原始任务相比,它非常简单,但可以让您了解如何执行此操作。