Skip to Content

Hi, in this brief post I would like to create new customer ABAP CDS view with calendar days and column working day flag. This flag has value 1 if a day is a working day according to factory calendar and has value 0 in opposite case.

Recently Sergey Shablykin published a post about calculation of a difference in working days between two dates, and my current post is complementing it in some respects.

Introduction

  • With S/4HANA we have a standard CDS view I_CalendarDate based on SCAL_TT_DATE table, but there aren’t information about working days. However it could be important to have such flag, for example, when we need to count only working days or filtering something based on working dates only.
  • Information about working days in stored in SAP system in table TFACS. Besides a year we need to define factory calendar (TFACS-IDENT) to select data. So in logic we need to ‘crop’ information about working day from TFACS-MONXX columns.

Step-by-step

1.Create new ABAP CDS view Z_I_CALDAYWD based on table function:

2. Create ABAP class and implement logic in class method:

Notes:

  • We are using variable p_ident to select only needed factory calendar, e.i. ‘RU’ in Russia.
  • We are using column calendar day (scal_tt_date-calendarday), which is number of a day in month, to ‘crop’ work day flag from tfacs-monXX columns.
  • Base tables are not client dependent that’s why we don’t have mandt column and annotate ABAP CDS view respectively.

3. In result we have for factory calendar ‘RU’ and the beggining of 2018 calendar year:

 

Thank you for attention!

To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

  1. Former Member

    This is my version without the need of DB tables

     

        DECLARE F1DATE, F2DATE DATE;
        
        F1DATE := :P_YEAR     || '-01-01';
        F2DATE := :P_YEAR + 1 || '-01-01';  
        
        OTAB = SELECT GENERATED_PERIOD_START AS CALDAY,
               CASE ADD_WORKDAYS( :P_IDENT, GENERATED_PERIOD_START, 0) 
                   WHEN GENERATED_PERIOD_START THEN 1 ELSE 0
               END AS WDFLAG
               FROM SERIES_GENERATE_DATE( 'INTERVAL 1 DAY', :F1DATE, :F2DATE);
             
        RETURN :OTAB;

     

    (0) 

Leave a Reply