‎2006 Dec 21 7:08 AM
Hi Al,
can any one help me how to find the number of working days from starting date and to date excluding sundays,is there any function module
thanks
lokesh
‎2006 Dec 21 7:11 AM
‎2006 Dec 21 7:13 AM
call function 'RKE_SELECT_FACTDAYS_FOR_PERIOD'
exporting
i_datab = start_date
i_datbi = end_date
i_factid = 'US'
tables
eth_dats = days.
‎2006 Dec 21 7:13 AM
Are u referring to a indian calender id..
can u confirm whether the plant is maintained for this by checking in table T001W-FABKL FIELD .
and teh calender id in TFACD.
Then check this code..
REPORT ZEX8 .
tables : VBAK.
PARAMETERS : P_WERKS LIKE T001W-WERKS OBLIGATORY.
select-options : s_date for vbak-erdat OBLIGATORY.
DATA : WRK_DYS TYPE I ,
TOT_DYS TYPE I ,
HOL_DYS TYPE I.
DATA: calid LIKE tfacd-ident.
DATA : BEGIN OF ITAB OCCURS 0,
DATE LIKE SY-DATUM,
END OF ITAB.
DATA : BEGIN OF IWRK OCCURS 0,
WRDATE LIKE SY-DATUM,
END OF IWRK.
DATA : BEGIN OF IHOL OCCURS 0,
HOLDAY LIKE SY-DATUM,
END OF IHOL.
DATA : V_DATE LIKE SY-DATUM.
IF S_DATE-LOW ne '00000000'.
PERFORM FILLTAB.
ENDIF.
* LOOP AT ITAB.
* WRITE:/ ITAB-DATE.
* ENDLOOP.
DESCRIBE TABLE ITAB LINES TOT_DYS.
WRITE:/ 'TOTAL NUMBER OF DAYS ARE', TOT_DYS.
PERFORM FCT_CALID.
PERFORM WRK_DAYS.
PERFORM DISP_WRKDYS.
PERFORM DISP_HOLDAYS.
form FILLTAB.
ITAB-DATE = S_DATE-LOW.
APPEND ITAB.
IF S_DATE-HIGH ne '00000000'.
IF S_DATE-LOW = S_DATE-HIGH.
EXIT.
ENDIF.
ADD 1 To S_DATE-LOW.
PERFORM FILLTAB.
ENDIF.
endform. " FILLTAB
*&---------------------------------------------------------------------*
*& Form WRK_DAYS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form WRK_DAYS.
LOOP AT ITAB.
V_DATE = ITAB-DATE.
CALL FUNCTION 'DATE_CHECK_WORKINGDAY'
EXPORTING
date = V_DATE
factory_calendar_id = CALID
message_type = 'I'
EXCEPTIONS
DATE_AFTER_RANGE = 1
DATE_BEFORE_RANGE = 2
DATE_INVALID = 3
DATE_NO_WORKINGDAY = 4
FACTORY_CALENDAR_NOT_FOUND = 5
MESSAGE_TYPE_INVALID = 6
OTHERS = 7
.
IF SY-SUBRC EQ 0.
IWRK-WRDATE = V_DATE.
APPEND IWRK.
CLEAR IWRK.
ELSE.
IHOL-HOLDAY = V_DATE.
APPEND IHOL.
CLEAR IHOL.
ENDIF.
ENDLOOP.
endform. " WRK_DAYS
*&---------------------------------------------------------------------*
*& Form DISP_WRKDYS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form DISP_WRKDYS.
DESCRIBE TABLE IWRK LINES WRK_DYS.
LOOP AT IWRK.
AT FIRST.
skip.
WRITE:/5 'WORKING DAYS'.
SKIP.
ENDAT.
WRITE:/5 IWRK-WRDATE.
ENDLOOP.
WRITE:/ 'Total number of working days are', wrk_Dys.
skip.
endform. " DISP_WRKDYS
*&---------------------------------------------------------------------*
*& Form DISP_HOLDAYS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form DISP_HOLDAYS.
DESCRIBE TABLE IHOL LINES HOL_DYS.
LOOP AT IHOL.
AT FIRST.
skip.
WRITE:/5 'NON WORKING DAYS ARE '.
SKIP.
ENDAT.
WRITE:/5 IHOL-HOLDAY.
ENDLOOP.
WRITE:/ 'Total number of NON working days are', HOL_Dys.
skip.
endform. " DISP_HOLDAYS
*&---------------------------------------------------------------------*
*& Form FCT_CALID
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form FCT_CALID.
SELECT SINGLE fabkl INTO calid FROM t001w
WHERE werks = P_werks.
endform. " FCT_CALIDregards,
vijay
‎2006 Dec 21 7:14 AM
1. DATE_CHECK_WORKINGDAY
This is one useful FM
2. Try this code (just copy paste)
IT DOES EXACTLY WHAT U REQUIRE.
REPORT abc.
data : num type i.
parameters : frdate type sy-datum default '20051216'.
parameters : todate type sy-datum default '20051221'.
perform getinfo using frdate todate changing num.
break-point.
&----
*& Form getinfo
&----
text
----
FORM getinfo USING fromdate todate CHANGING numofdays type i.
DATA : d TYPE sy-datum.
d = fromdate - 1.
DO.
d = d + 1.
IF d > todate.
EXIT.
endif.
CALL FUNCTION 'DATE_CHECK_WORKINGDAY'
EXPORTING
date = d
factory_calendar_id = '01'
message_type = 'I'
EXCEPTIONS
date_after_range = 1
date_before_range = 2
date_invalid = 3
date_no_workingday = 4
factory_calendar_not_found = 5
message_type_invalid = 6
OTHERS = 7.
IF sy-subrc = 0.
numofdays = numofdays + 1.
write 😕 d.
ENDIF.
ENDDO.
ENDFORM. "getinfo
I hope it helps.