Working days

form FRM_GET_WORKING_DAYS
  TABLES pt_days
  CHANGING  pv_duration.


  DATA:ls_xt001w TYPE t001w,
       lv_sdate TYPE sy-datum,
       lv_edate TYPE sy-datum.

* Get the factory calendar for specific plant
  SELECT SINGLE * FROM t001w INTO ls_xt001w
                     WHERE werks IN s_plant.   " Use your plant

*   Set start date
  CONCATENATE sy-datum+0(6) '01' INTO lv_sdate.

*   End date
  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      date      = lv_sdate
      days      = 0
      months    = 1
      signum    = '+'
      years     = 0
    IMPORTING
      calc_date = lv_edate
    EXCEPTIONS
      OTHERS    = 2.

* Get working days in between

  CALL FUNCTION 'DURATION_DETERMINE'
    EXPORTING
      factory_calendar           = ls_xt001w-fabkl
    IMPORTING
      duration                   = pv_duration     " In days
    CHANGING
      start_date                 = lv_sdate
      end_date                   = lv_edate
    EXCEPTIONS
      factory_calendar_not_found = 1
      date_out_of_calendar_range = 2
      date_not_valid             = 3
      unit_conversion_error      = 4
      si_unit_missing            = 5
      parameters_not_valid       = 6
      OTHERS                     = 7.

  WHILE lv_sdate < lv_edate.
    CALL FUNCTION 'DATE_CHECK_WORKINGDAY'
      EXPORTING
        date                             = lv_sdate
        factory_calendar_id              = ls_xt001w-fabkl
        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.
      append lv_sdate to pt_days.
    ENDIF.

  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      date      = lv_sdate
      days      = 1
      months    = 0
      signum    = '+'
      years     = 0
    IMPORTING
      calc_date = lv_sdate
    EXCEPTIONS
      OTHERS    = 2.

  ENDWHILE.
endform.

We can get working days easily by 'describe table lines ' of pt_days ,this is merely a demo of FM usage,not making an unnecessary move

原文地址:https://www.cnblogs.com/aurora-cj/p/10422128.html