额,鸽了好久好久没发了……

疫情期间大家还好吧……都复工了吗?

在这里祝大家工作顺利,新年发财咯!


正文


计算某日期的前置或者后推日期时,笔者不喜欢调用函数来计算,更倾向于自己手写代码来计算,而且尽量用一行代码来实现,现分享给大家。


前提


使用SAP的"|"语法和":"语法。

笔者试了下,在SAP_ABA版本702及以上测试可用,700上不可用。


代码




DATA: l_date TYPE d.

"前推一天
l_date = sy-datum - 1. "遇到月底年底会自动处理,无须担心

"当前月份第一天
l_date = sy-datum(6) && '01'.
l_date = |{ sy-datum(6) }01|.

"上月最后一天
l_date =: sy-datum(6) && '01', l_date - 1.
l_date =: |{ sy-datum(6) }01|, l_date - 1.

"当前月份最后一天
l_date =: sy-datum(6) && '01', l_date + 31, l_date(6) && '01', l_date - 1.
l_date =: |{ sy-datum(6) }01|, l_date + 31, |{ l_date(6) }01|, l_date - 1.

"当年第一天
l_date = sy-datum(4) && '0101'.
l_date = |{ sy-datum(4) }0101|.

"去年的今天
l_date = |{ sy-datum(4) - 1 }{ sy-datum+4 }|.

"前推X个月的第一天(X大于0,且X小于当前月+12)。
"如当前日期是20200318,X应大于0且小于15
"比如要前推6个月的第一天
DATA: l_months TYPE i VALUE 6.
IF sy-datum+4(2) > l_months.
l_date = |{ sy-datum(6) - l_months }01|.
ELSEIF sy-datum+4(2) + 12 - l_months >= 10. "月份的结果是两位数
l_date = |{ sy-datum(4) - 1 }{ sy-datum+4(2) + 12 - l_months }01|.
ELSE. "月份的结果是个位数,需要补0
l_date = |{ sy-datum(4) - 1 }0{ sy-datum+4(2) + 12 - l_months }01|.
ENDIF.


解释说明


冒号:

重复调用前面的命令。比如我们常用的

perform: forma,formb,formc.
marco_build_fcat: '' '' '', '' '' ''.

竖线|

使用方法

|文本|,等于'文本'

|{ sy-datum - 1 }|,注意左大括号后面和右大括号前面要有空格。如果竖线和大括号之间有空格,表示是一个空格文本,是不会被忽视的哦。大括号中间的内容,是一个可以运算出结果的表达式。

更复杂一点,如下例:



DATA: l_str TYPE string Value 'HE'.
l_str = |{ l_str && 'LL' }O|.
WRITE l_str.

运算结果是HELLO。