2

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

也许对我的问题有更好的解决方案,但我仍然对这个技术限制感到好奇。据我所知,SAP 中的系统状态是硬编码的,不能通过任何表来确定每个对象(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!!
4

1 回答 1

3

仅从7.51 开始支持将内置函数置于 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.

与您的原始任务相比,它非常简化,但为您提供了如何执行此操作的想法。

于 2020-04-03T14:17:05.383 回答