Abap CDS视图的何处条件下的计算日期

Abap CDS视图的何处条件下的计算日期,abap,cds,Abap,Cds,我正在尝试获取notification对象的有效系统状态列表,为了不检查表中的所有通知,我希望通过只检查最近2年的数据来执行选择 也许有更好的方法解决我的问题,但我仍然对这个技术限制感到好奇。据我所知,SAP中的系统状态是硬编码的,无法通过任何表格确定每个对象(SAP可以随时添加新的系统状态) 我试图创建下面的CDS视图,但是函数dats\u add\u months不能在where条件下使用,有解决方案吗?请注意,7.50没有system date的会话参数,因此我使用了一个环境变量: def

我正在尝试获取notification对象的有效系统状态列表,为了不检查表中的所有通知,我希望通过只检查最近2年的数据来执行选择

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

我试图创建下面的CDS视图,但是函数
dats\u add\u months
不能在where条件下使用,有解决方案吗?请注意,7.50没有system date的会话参数,因此我使用了一个环境变量:

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!!
定义视图ZNOTIF\u系统状态
使用参数sydat:abap.dats@dats\u add\u months($parameters.sydat,-12',)//这不能使用!!

将内置函数放在WHERE的RHS位置仅受支持,您有7.50,正如您所说。这就是为什么它对豪杰有效,而不是对你

这里可以做什么?可能的选项是使用AMDP类的CDS表函数。考虑这个样本:

表格功能

@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.

与您最初的任务相比,它非常简单,但为您提供了执行此任务的方法。

它应该可以工作。dats_add_months的第三个参数不应为初始值。对吗?不,第三个参数不是问题所在,我将其替换为初始日期“00000000”,但仍然得到以下语法错误:“条件中不支持随机表达式”。也许这是7.50的限制?尝试dats_add_months($parameters.sydat,-12,“FAIL”)仍然存在相同的错误:(我无法进一步帮助。它对我有效。谢谢你的回答!显然我没有阅读正确的版本更改。你的解决方案是有效的,因此我将其标记为正确。但在我的情况下,我没有直接公开CD,我使用ABAP SQL读取数据,因此这次我将不得不跳过CD。