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

2020-08-21 22:00发布

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

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


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

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

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

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

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


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

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

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

付费偷看设置
发送
4条回答
南山jay
1楼 · 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毫秒的时间,因此我想我现在可以接受。

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

ZJXianG
2楼-- · 2020-08-21 22:28

正如John在twitter上所指出的那样-以上假设假定2月29日过生日的人都在庆祝生日 在非le年的第28个,但是如果您想使用3月1日,则只需更新代码,并添加一个额外的case语句(因为第2个仅在AnniversaryDateThisYearValid = 0时有效)

哎,真难
3楼-- · 2020-08-21 22:44

我无法抗拒...

然后我注意到一种视图是不可能的。 您可能需要堆叠2或3。

一个问题是与当前日期的比较。 要正确计算年份,您需要知道此人今年是否已经过生日。 因此,我使用了Parameter,因为在我的系统中没有Session变量。

下一个问题是,如果此人今年已经过生日,则增加一年。 您需要先将包含年份的当前日期替换为从char到numc,然后到int4的年份。 如果在一个视图中,ABAP会在某些"发布"中检查并阻止它。

那是我目前停下来的地方。 希望这对您有所帮助。

Alawn_Xu
4楼-- · 2020-08-21 22:27

感谢Michael-如果没有本地HANA中添加年份功能,这绝对是一个挑战。但是使用2个视图,我在John Patterson的附加帮助下找到了一个可能的解决方案 在Twitter上,我将针对...单独回答该问题。

一周热门 更多>