Get Working Days of a Plant
Every plant has own factory calendar in SAP. A factory calendar gives us working days in giving date range. Working days are depends on country, year, public holidays and so on.
You can see factory calendar details in SCAL T-Code in SAP. We will see how to fetch exact same data from SCAL for our ABAP reports.
Following code block gives working days in 1 years by plant which is user entered.
I started by getting factory calendar first. Factory calendar is kept as FABKL
in T001W
table. I get next years current day by using function RP_CALC_DATE_IN_INTERVAL
. I have may get next year by end_date = |{ begin_date(4) + 1 }{ begin_date+4 }|.
but I wanted to mention this useful function.
Function RP_CALC_DATE_IN_INTERVAL
is useful for adding, subtracting specific amount of days, months and years to a date.
PARAMETERS p_werks TYPE t001w-werks. "user enters plant START-OF-SELECTION. SELECT SINGLE fabkl FROM t001w WHERE werks = @p_werks INTO @DATA(factory_calendar). DATA: begin_date TYPE datum, end_date TYPE datum. begin_date = sy-datum. "get date after 1 year "I'd like to mention following function. "You can increase year by simply doing ""end_date = |{ begin_date(4) + 1 }{ begin_date+4 }|. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = begin_date days = '00' months = '00' signum = '+' "add (you should use '-' to subtract ) years = '01' IMPORTING calc_date = end_date. DATA: working_days TYPE STANDARD TABLE OF rke_dat. "get all working days by factory calendar CALL FUNCTION 'RKE_SELECT_FACTDAYS_FOR_PERIOD' EXPORTING i_datab = begin_date i_datbi = end_date i_factid = factory_calendar TABLES eth_dats = working_days EXCEPTIONS date_conversion_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. "display cl_demo_output=>display( EXPORTING data = working_days name = 'Working days of this year' ).
Get holidays of a plant
We’ve got working days but we may need holidays in a specific date range. SAP also presents an useful function to get holidays.
To fetch holidays, we need holiday calendar. We fetch this field from TFACD table as HOCID by factory calendar which we have already got from T001W. You may also join these two table up to your case.
Function HOLIDAY_GET
gives us holidays between given dates.
"get holiday calendar SELECT SINGLE hocid FROM tfacd "#EC CI_BYPASS WHERE ident = @factory_calendar INTO @DATA(holiday_calendar). DATA holidays TYPE STANDARD TABLE OF iscal_day. "get holidays CALL FUNCTION 'HOLIDAY_GET' EXPORTING holiday_calendar = holiday_calendar factory_calendar = factory_calendar date_from = begin_date date_to = end_date TABLES holidays = holidays 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. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. "display cl_demo_output=>display( EXPORTING data = working_days name = 'Holiday days of this year' ).
We had two different useful data from SAP. You may use both of them up to your case.
We mentioned 3 different functions which are good to keep in mind:
RP_CALC_DATE_IN_INTERVAL
: Used to do add/subtract operations on dateRKE_SELECT_FACTDAYS_FOR_PERIOD
: Gives working days in a date rangeHOLIDAY_GET
: Give holidays in a date range