abap - CDS 视图的 WHERE 条件下的计算日期
问题描述
我正在尝试获取通知对象的有效系统状态列表,为了不检查表中的所有通知,我想通过仅检查过去 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!!
解决方案
仅从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.
与您的原始任务相比,它非常简化,但为您提供了如何执行此操作的想法。
推荐阅读
- python - 给定一个 Python 列表,找到所有可能的平面列表,这些列表保持每个子列表的顺序?
- wordpress - 如何使自定义分类法出现在 Gutenberg BLOCK LIST 中
- javascript - 大指数在 HTML 输入数字中返回空
- r - 从最后一天开始,如何每周都有 x 轴标签?
- python - 从excel运行宏时xlwings keyerror
- css - 分页 Django 模板的最后一页所需的列数不同
- oracle - 奥比。将分析导出到 excel 时,其标题被截断
- html - 如何将一个部分作为所有页面的背景?
- php - Codeigniter 选择用户电子邮件不在另一个表中执行时间太长
- r - Rbind 字符向量成为数据表 r 中的第一行