遇到的需求是这样的,PR 批导的时候,输入个日期availability date。
另外需要查找gr日期,来计算出deliver date。
delivery date = Excel 中的 availability date – GR processing time
这之间的天数都是工作日,所以相当于是根基某个日期,倒推N个工作日,是几号。
有标准函数:
BKK_ADD_WORKINGDAY
但是我是先自己写了一个,然后才发现有标准的。
所以这里也把我写的发出来吧。
代码如下:
FUNCTION ZLM_GET_DAY.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IV_FROM_DATE) TYPE DATUM
*" REFERENCE(IV_DAYS) TYPE INT4
*" EXPORTING
*" REFERENCE(EV_DATE) TYPE DATUM
*"----------------------------------------------------------------------
DATA:LV_FROM TYPE SY-DATUM.
DATA:LV_TO TYPE SY-DATUM.
DATA:LV_DAYS TYPE INT4.
DATA:LV_INDEX TYPE INT4.
DATA:LT_DAY_ATTRIBUTES TYPE TABLE OF CASDAYATTR.
DATA:LS_DAY_ATTRIBUTES TYPE CASDAYATTR.
LV_FROM = IV_FROM_DATE - IV_DAYS - 100."预留出100天
LV_TO = IV_FROM_DATE.
CALL FUNCTION 'DAY_ATTRIBUTES_GET'
EXPORTING
FACTORY_CALENDAR = 'CN'
HOLIDAY_CALENDAR = 'CN'
DATE_FROM = LV_FROM
DATE_TO = LV_TO
TABLES
DAY_ATTRIBUTES = LT_DAY_ATTRIBUTES
EXCEPTIONS
FACTORY_CALENDAR_NOT_FOUND = 1
HOLIDAY_CALENDAR_NOT_FOUND = 2
DATE_HAS_INVALID_FORMAT = 3
DATE_INCONSISTENCY = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
ENDIF.
*&去掉节假日
DELETE LT_DAY_ATTRIBUTES WHERE FREEDAY = 'X'.
"倒序
SORT LT_DAY_ATTRIBUTES BY DATE DESCENDING.
READ TABLE LT_DAY_ATTRIBUTES TRANSPORTING NO FIELDS
WITH KEY DATE = LV_TO.
IF SY-SUBRC = 0.
"如果 to date 是工作日
LV_INDEX = IV_DAYS + 1.
ELSE.
"如果 to date 不是工作日
LV_INDEX = IV_DAYS .
ENDIF.
READ TABLE LT_DAY_ATTRIBUTES INTO LS_DAY_ATTRIBUTES
INDEX LV_INDEX.
EV_DATE = LS_DAY_ATTRIBUTES-DATE.
ENDFUNCTION.