在CDS视图中计算下一个生日?

2020-08-21 22:00发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)在HANA侧车中,我具有标量功能...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在HANA侧车中,我具有标量功能,因此我可以根据存储在桌上的任何出生日期轻松获得下一个生日。 处理方面,例如2月29日on年出生的人。

但是,有没有人有任何可重用的方式在CDS视图中执行此操作,而又不求助于在HANA本身内部开发对象(即使这可能是一个不错的选择-我更愿意将所有内容保留在ABAP域中)?

或者,人们做了什么工作以确保与员工编号一起使用时的最佳绩效,以便不为所有员工计算下一个生日。

4条回答
南山jay
2020-08-21 22:39 .采纳回答

感谢约翰·帕特森(John Patterson)向我指向日历日期查找表SCAL_TT_DATE的方向-如果您不与120岁以上的人打交道,那应该没事。

总之,我 创建了2个视图来帮助解决此问题,并将在关联中使用该视图来获取周年纪念日。

第一个"前"视图是为我们提供可以使用的日期范围(忽略默认的"填充" 并命名,因为我仍在掌握最有效的方法):

 @ AbapCatalog.sqlViewName:'ZIPREANNIV'
 @ AbapCatalog.compiler.compareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#检查
 @ EndUserText.label:'AnnivesaryDatesPre'
 将视图ZIPreAnnivesaryDates定义为从scal_tt_date选择为_SourceDate
 将[1..1]与scal_tt_date关联为_Today
         于_Today.calendardate = $ session.system_date
  {
     关键日历日期为OriginalDate,
     将(concat(concat(_conday(_Today.calendaryear,calendarmonth),calendarday)作为abap.dats)转换为AnniversaryDateThisYear,
     dats_is_valid(cast(concat(concat(concat(_Today.calendaryear,calendarmonth),calendarday)as abap.dats))作为AnniversaryDateThisYearValid,
     演员表(concat(concat(left(cast(cast(cast(_Today.calendaryear as abap.int4)+ 1 as abap.char(12)),4),calendarmonth),calendarday)as abap.dats)as AnniversaryDateNextYear,
     dats_is_valid(cast(concat(concat(concat(left(cast(cast(_Today.calendaryear as abap.int4)+ 1 as abap.char(12)),4),calendarmonth),calendarday)as abap.dats))作为AnniversaryDateNextYearValid,
     铸件
       当calendarday ='29'和calendarmonth ='02'时
         concat(concat(_Today.calendaryear,calendarmonth),'28')
       其他
         ''
       以abap.dats结尾)作为AnniversaryDateThisYearLY,
     铸件
       当calendarday ='29'和calendarmonth ='02'时
         concat(concat(left(cast(cast(cast(_Today.calendaryear as abap.int4)+ 1 as abap.char(12)),4),calendarmonth),'28')
       其他
         ''
       以abap.dats结尾)为AnniversaryDateNextYearLY
 }


 

这将为我们提供一个表格,其键为原始生日或开始日期等。

旁注-我讨厌我不能将1加到 NUMC在这里,必须先转换为INT4,然后转换为CHAR12,然后剥离8个字符以将其连接到CHAR4。

对于每个值,它将提供5个值。

AnniversaryDateThisYear,AnniversaryDateThisYearValid,AnniversaryDateNextYear,AnniversaryDateNextYearValid以及万一它是2月29日:AnniversaryDateThisYearLY和AnniversaryDateNextYearLY

然后它是一个简单的辅助视图,它为我们提供了一个周年纪念日。 sqlViewName:'ZIANNIVERSARY' @ AbapCatalog.compiler.compareFilter:是 @ AbapCatalog.preserveKey:是 @ AccessControl.authorizationCheck:#检查 @ EndUserText.label:'AnniversaryDates' 将视图ZIAnniversaryDates定义为从ZIPreAnnivesaryDates中选择{ 键OriginalDate 案件 当AnniversaryDateThisYearValid = 1且AnniversaryDateThisYear> $ session.system_date时 今年周年纪念日 当AnniversaryDateThisYearLY> $ session.system_date时 今年周年纪念日 当AnniversaryDateNextYearValid = 1时 下一年的周年纪念日 其他 下一年的周年纪念日 结束为AnniversaryDate }

因此,我们希望HANA CDS足够聪明,只可以针对相关日期进行计算,但是在ADT测试中需要51毫秒的时间,因此我想我现在可以接受。

有人对此有更好的主意吗?

一周热门 更多>