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.
与您的原始任务相比,它非常简单,但可以让您了解如何执行此操作。
我正在尝试获取通知对象的有效系统状态列表,为了不检查 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.
与您的原始任务相比,它非常简单,但可以让您了解如何执行此操作。