额,鸽了好久好久没发了……
疫情期间大家还好吧……都复工了吗?
在这里祝大家工作顺利,新年发财咯!
正文
计算某日期的前置或者后推日期时,笔者不喜欢调用函数来计算,更倾向于自己手写代码来计算,而且尽量用一行代码来实现,现分享给大家。
前提
使用SAP的"|"语法和":"语法。
笔者试了下,在SAP_ABA版本702及以上测试可用,700上不可用。
代码
- DATA: l_dateTYPE 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_monthsTYPE 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.
l_date= |{ sy-datum(4) - 1 }0{ sy-datum+4(2) +12 - l_months }01|. "sy-datum+4(2) + 12 - l_months得到的是个位数时,需要补0
ENDIF.
解释说明
冒号:
重复调用前面的命令。比如我们常用的
perform: forma,formb,formc.
marco_build_fcat: '' '' '', '' '' ''.
竖线|
使用方法
|文本|,等于'文本'
|{ sy-datum - 1 }|,注意左大括号后面和右大括号前面要有空格。如果竖线和大括号之间有空格,表示是一个空格文本,是不会被忽视的哦。大括号中间的内容,是一个可以运算出结果的表达式。
更复杂一点,如下例:
DATA: l_strTYPE stringValue 'HE'.
l_str= |{ l_str &&'LL' }O|.
WRITE l_str.
运算结果是HELLO。