patricksong

独立需求上传程序(BAPI)

  REPORT ZPPIPE001  LINE-SIZE 167
                  LINE-COUNT 65
                  NO STANDARD PAGE HEADING
                  MESSAGE-ID MG.
*----------------------------------------------------------------------*
* Program     :  ZPPIPE001                                             *
* Author      :  Patrick,Song                                          *
* Date        :  June 10, 2008                                         *
* Code type   :  conversion                                            *
* Version     :  new creation                                          *
* (interface/conversion/on-line transaction/report)                    *
*                                                                      *
*----------------------------------------------------------------------*
* Error handling :                                                     *
*----------------------------------------------------------------------*
* 1.                                                                   *
*                                                                      *
*----------------------------------------------------------------------*
* Change log :                                                         *
*----------------------------------------------------------------------*
* CR#       :                                                          *
* Corr. no. :                                                          *
* Date      :                                                          *
* Author    :                                                          *
* Change    :                                                          *
*                                                                      *
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
* Table declaration
*&---------------------------------------------------------------------*
TABLES: MARC,    "Plant data for material
        MARA,    "Material Number
        MAST,    "Material BOM
        KNA1,    "Customer Master - General Data
        T001W,   "Plant Data
        T459V,   "Version table
        T459A,   "External requirements types
        THOC.    "Public Holiday Calendar
*&---------------------------------------------------------------------*
* Subrouting declaration
*&---------------------------------------------------------------------*
TYPE-POOLS: KCDE.
INCLUDE   : ZBCDWI000 .
*&---------------------------------------------------------------------*
* selection screen define
*&---------------------------------------------------------------------*
* define block a1 for screen 1000

SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-TB1.
PARAMETERS: P_UPFN  LIKE RLGRAP-FILENAME OBLIGATORY.
*parameters: p_stlan like mast-stlan default \'1\' .
SELECTION-SCREEN END OF BLOCK A1.
PARAMETERS: P_RESULT AS CHECKBOX DEFAULT \'X\'.

*&---------------------------------------------------------------------*
* globe parameters declaration
*&---------------------------------------------------------------------*
*--* define table to store tempoary data
DATA INT_TAB     TYPE KCDE_INTERN_STRUC OCCURS 0 WITH HEADER LINE.

*--* define these internal tables for BAPI processing                  .
DATA: LS_RET        TYPE BAPIRET2                         .
DATA: LS_CM60R      LIKE CM60R OCCURS 0 WITH HEADER LINE  .
DATA: DO_COMMIT     LIKE BAPISPARAM-DO_COMMIT   VALUE \'X\' .
DATA: UPDATE_MODE   LIKE BAPISPARAM-UPDATE_MODE VALUE \'X\' .
DATA: REFER_TYPE    LIKE BAPISPARAM-REFER_TYPE  VALUE \'X\' .
DATA: PROFILID      LIKE BAPISPARAM-PROFILID              .

*--* store forecast header to batch input for each item
DATA: BAPI_SITEMR TYPE BAPISITEMR  .

*--* store these scheduling items for Schedule line data input
DATA: BAPI_SSHDIN   LIKE BAPISSHDIN  OCCURS 0 WITH HEADER LINE.

*--* store these detailed requirements
DATA: BAPI_SITMEO LIKE BAPISITMEO  OCCURS 0 WITH HEADER LINE .

*--* store configured data for forcasting scheduling input
DATA:  BAPI_SCHARR LIKE BAPISCHARR  OCCURS 0 WITH HEADER LINE.

*--* store returned message while processing is completed
DATA:  BAPI_RETURN TYPE BAPIRETURN1 OCCURS 0 WITH HEADER LINE.

*--* store parameters for Batch Input
DATA: BAPI_PARAM TYPE BAPIPARAM .

*--* define internal table for data uploading
DATABEGIN OF ITAB  OCCURS  0.
DATA: PBDNR  LIKE  AM60X-PBDNR.   "Planned Number => Customer ID
DATA: MATNR  LIKE  AM60X-MATNR.   "Material Number
DATA: WERKS  LIKE  AM60X-WERKS.   "Plant
*data: versb  like  pbpt-versb .   "Ind.Requirement Version
*data: bedae  like  rm60x-bedae.   "Ind.Requirement Type
DATA: DATVE  LIKE  SY-DATUM   .   "Beginning Date
DATA: DATBE  LIKE  SY-DATUM   .   "Ending Date
DATA: PLN01  LIKE  RM60X-PLN01.   "Forecast Qty 01
DATA: PLN02  LIKE  RM60X-PLN02.   "Forecast Qty 02
DATA: PLN03  LIKE  RM60X-PLN03.   "Forecast Qty 03
DATA: PLN04  LIKE  RM60X-PLN04.   "Forecast Qty 04
DATA: PLN05  LIKE  RM60X-PLN05.   "Forecast Qty 05
DATA: PLN06  LIKE  RM60X-PLN06.   "Forecast Qty 06
DATA: PLN07  LIKE  RM60X-PLN07.   "Forecast Qty 07
DATA: PLN08  LIKE  RM60X-PLN08.   "Forecast Qty 08
DATA: PLN09  LIKE  RM60X-PLN09.   "Forecast Qty 09
DATA: PLN10  LIKE  RM60X-PLN10.   "Forecast Qty 10
DATA: PLN11  LIKE  RM60X-PLN11.   "Forecast Qty 11
DATA: PLN12  LIKE  RM60X-PLN12.   "Forecast Qty 12
DATAEND OF ITAB.

*--* define data for holiday check ...
DATA: LC_HOLIDAY_FOUND        LIKE SCAL-INDICATOR.
DATA: LTAB_HOLIDAY_ATTRIBUTES LIKE THOL OCCURS 0 WITH HEADER LINE.

*--* define data for date format check
DATA: DATUV LIKE SY-DATUM .

*--* define internal table for error store
DATABEGIN OF I_ERROR OCCURS 0.
DATAFIELD(040).
DATAVALUE(030).
DATAMESSAGE(040).
DATAEND   OF I_ERROR.

*--* define internal table for error store
DATABEGIN OF I_RESULT OCCURS 0.
DATA: PBDNR   LIKE  ITAB-PBDNR .   "Planned Number => Salesperson
DATA: MATNR   LIKE  ITAB-MATNR .   "Material Number
DATA: WERKS   LIKE  ITAB-WERKS .   "Plant
*data: versb   like  itab-versb .   "Ind.Requirement Version
*data: bedae   like  itab-bedae .   "Ind.Requirement Type
DATA: DATVE   LIKE  ITAB-DATVE .   "Beginning Date
DATA: DATBE   LIKE  ITAB-DATBE .   "Ending Date
DATAMESSAGE TYPE  STRING.
DATAEND   OF I_RESULT.

*--* determine BOM Usage for Sales Forecasting
DATA: STR_STLAN LIKE MAST-STLAN .

*----------------------------------------------------------------------*
* Global program variables                                             *
*----------------------------------------------------------------------*

*--* internal table for uploading date audit
DATABEGIN OF AUDIT.
DATA: LIN_ERROR      TYPE I.        " # of lines errors
DATA: LIN_TOTAL      TYPE I.        " # of lines total
DATAEND   OF AUDIT .

*&---------------------------------------------------------------------*
* top-of-page.
*&---------------------------------------------------------------------*
TOP-OF-PAGE.
  PERFORM PAGE_HEADER.
  PERFORM COLUMN_HEADER .

*&---------------------------------------------------------------------*
* initialization.
*&---------------------------------------------------------------------*
INITIALIZATION.
  REFRESH: BAPI_SSHDIN, BAPI_SCHARR, BAPI_RETURN, I_RESULT.
  CLEAR  : BAPI_SSHDIN, BAPI_SCHARR, BAPI_RETURN, I_RESULT.
  CLEAR  : STR_STLAN  , AUDIT.

  N = 167 .

*&---------------------------------------------------------------------*
* at selection-screen
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN .
  IF P_UPFN IS INITIAL .
    MESSAGE TEXT-E00 TYPE \'E\' .
  ENDIF .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPFN .
  PERFORM GET_UPLOAD_FILENAME .

*&---------------------------------------------------------------------*
* start-of-selection.
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*--* get start time
  PERFORM GET_START_TIME .

*--* Manufacturing BOM Usage determined
*  move p_stlan to str_stlan  .

*--* upload data
  PERFORM UPLOAD_FORECAST_DATA    .

*--* check record validation
  PERFORM CHECK_RECORD_VALIDATION .

*--* display uploaded result
  IF NOT P_RESULT IS INITIAL .
    PERFORM DISPLAY_UPLOAD_RESULT   .
  ENDIF .

*--* display uploaded data errors
  PERFORM UPLOADED_ERROR_LIST     .

*&---------------------------------------------------------------------*
* end-of-selection.
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*--* get end time
  PERFORM GET_END_TIME .

  IF NOT I_ERROR[] IS INITIAL .
    SET PF-STATUS \'TFR\' EXCLUDING \'IDPCRT\' .
  ELSE.
    SET PF-STATUS \'TFR\' .
  ENDIF .

*&---------------------------------------------------------------------*
* end-of-page.
*&---------------------------------------------------------------------*
END-OF-PAGE.
  PERFORM PAGE_FOOTER .
*&---------------------------------------------------------------------*
* at user-command.
*&---------------------------------------------------------------------*
AT USER-COMMAND.

  CASE SY-UCOMM .
    WHEN \'IDPCRT\'.
      IF NOT ITAB[] IS INITIAL .
        PERFORM POPUP_TO_CONFIRM USING TEXT-HH1 TEXT-Q01.
        IF L_ANSWER = \'1\'.
          PERFORM PLANNED_REQUIREMENT_MAINTAIN .
          REFRESH: ITAB .
          CLEAR  : ITAB .
        ENDIF .
      ELSE.
        MESSAGE TEXT-S00 TYPE \'E\' .
      ENDIF .
    WHEN \'DLFORMAT\' .
  ENDCASE.

*&---------------------------------------------------------------------*
* end-of-selection.
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  GET_UPLOAD_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_UPLOAD_FILENAME .

  CALL FUNCTION \'WS_FILENAME_GET\'             "Get file name
       EXPORTING
*            DEF_FILENAME     = \' \'
*            DEF_PATH         = \' \'
             MASK             = \',*.* ,*.*.\'
             MODE             = \'0\'
             TITLE            = \'Get File name\'
       IMPORTING
             FILENAME         = P_UPFN
*            RC               =
       EXCEPTIONS
             INV_WINSYS       = 1
             NO_BATCH         = 2
             SELECTION_CANCEL = 3
             SELECTION_ERROR  = 4
             OTHERS           = 5.
  IF SY-SUBRC <> 0.
*            MESSAGE E016 WITH P_PATH.
  ENDIF.

ENDFORM.                    " GET_UPLOAD_FILENAME

*&---------------------------------------------------------------------*
*&      Form  UPLOAD_FORECAST_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UPLOAD_FORECAST_DATA .

  REFRESH: INT_TAB .
  CLEAR  : INT_TAB .
  CALL FUNCTION \'KCD_EXCEL_OLE_TO_INT_CONVERT\'
    EXPORTING
      FILENAME                = P_UPFN
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 3
      I_END_COL               = 17
      I_END_ROW               = 9999
    TABLES
      INTERN                  = INT_TAB
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  SORT INT_TAB BY ROW COL.

  REFRESH: ITAB.
  LOOP AT INT_TAB.
    AT NEW ROW.
      CLEAR: ITAB.
    ENDAT.
    CASE INT_TAB-COL.
      WHEN 1.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PBDNR.
        TRANSLATE ITAB-PBDNR TO UPPER CASE.
      WHEN 2.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-MATNR.
        TRANSLATE ITAB-MATNR TO UPPER CASE.
      WHEN 3.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-WERKS.
*      when 4.
*        check not int_tab-value is initial .
*        move int_tab-value to itab-versb.
*        translate itab-versb to upper case.
*      when 5.
*        move int_tab-value to itab-bedae.
*        translate itab-bedae to upper case.
      WHEN 4.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-DATVE .
      WHEN 5.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-DATBE .
      WHEN 6.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN01 .
      WHEN 7.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN02 .
      WHEN 8.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN03 .
      WHEN 9.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN04 .
      WHEN 10.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN05 .
      WHEN 11.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN06 .
      WHEN 12.
        MOVE INT_TAB-VALUE TO ITAB-PLN07 .
      WHEN 13.
        MOVE INT_TAB-VALUE TO ITAB-PLN08 .
      WHEN 14.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN09 .
      WHEN 15.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN10 .
      WHEN 16.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN11 .
      WHEN 17.
        CHECK NOT INT_TAB-VALUE IS INITIAL .
        MOVE INT_TAB-VALUE TO ITAB-PLN12 .
    ENDCASE.
    AT END OF ROW .
      APPEND ITAB .
      CLEAR  ITAB .
    ENDAT.
  ENDLOOP.

ENDFORM.                    " UPLOAD_FORECAST_DATA

*&---------------------------------------------------------------------*
*&      Form  STORE_FORECAST_ERROR_DETAILS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_1437   text
*      -->P_ITAB_PBDNR  text
*      -->P_TEXT_E00  text
*----------------------------------------------------------------------*
FORM STORE_FORECAST_ERROR_DETAILS  USING  ITEM1 ITEM2 MSGTXT.
  MOVE ITEM1        TO I_ERROR-FIELD.
  MOVE ITEM2        TO I_ERROR-VALUE.
  MOVE MSGTXT       TO I_ERROR-MESSAGE.
  APPEND: I_ERROR.
  CLEAR : I_ERROR.
ENDFORM.                    " STORE_FORECAST_ERROR_DETAILS
*&---------------------------------------------------------------------*
*&      Form  CHECK_RECORD_VALIDATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM CHECK_RECORD_VALIDATION .

  DATA : L_KUNNR LIKE ITAB-PBDNR .
  DATA : L_LENGTH TYPE P .
  DATA : STR_FIELD TYPE STRING      .
  DATA : PRE_PBDNR LIKE ITAB-PBDNR  .
  DATA : PRE_WERKS LIKE ITAB-WERKS  .
  DATA : PRE_MATNR LIKE ITAB-MATNR  .
*  data : pre_versb like itab-versb  .
*  data : pre_bedae like itab-bedae  .

*  clear: l_length, pre_pbdnr, pre_matnr, pre_werks, pre_versb, pre_bedae .
  CLEAR: L_LENGTH, PRE_PBDNR, PRE_MATNR, PRE_WERKS .

*  sort itab by pbdnr matnr werks versb bedae.
  SORT ITAB BY PBDNR MATNR WERKS .

  LOOP AT ITAB .

*-* Independent Requirement Plan Check

    CLEAR: KNA1 .
    CLEAR: L_KUNNR  .
    L_KUNNR = ITAB-PBDNR .
    PERFORM FORMAT_ALPHA_OUTPUT CHANGING L_KUNNR .
    SELECT SINGLE * FROM KNA1 WHERE KUNNR = L_KUNNR .
    IF SY-SUBRC <> 0 .
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-PBDNR\'
                                                  L_KUNNR
                                                  TEXT-E10.
    ENDIF .

*    PERFORM FORMAT_ALPHA_OUTPUT CHANGING ITAB-PBDNR .

*-* check if duplicated record exists or not
    IF ITAB-PBDNR = PRE_PBDNR AND
       ITAB-MATNR = PRE_MATNR AND
*       itab-werks = pre_werks and
*       itab-versb = pre_versb and
*       itab-bedae = pre_bedae.
        ITAB-WERKS = PRE_WERKS.
*      concatenate itab-pbdnr itab-matnr itab-werks itab-versb itab-bedae
      CONCATENATE ITAB-PBDNR ITAB-MATNR ITAB-WERKS
             INTO STR_FIELD SEPARATED BY SPACE.
      PERFORM STORE_FORECAST_ERROR_DETAILS USING  STR_FIELD
                                                  ITAB-PBDNR
                                                  TEXT-E01.
    ELSE.
      PRE_PBDNR = ITAB-PBDNR .
      PRE_WERKS = ITAB-WERKS .
      PRE_MATNR = ITAB-MATNR .
*      pre_versb = itab-versb .
*      pre_bedae = itab-bedae .
    ENDIF .

* check if material exists or not
    CLEAR: MARA .
    SELECT SINGLE * FROM MARA CLIENT SPECIFIED WHERE MANDT = SY-MANDT
    AND MATNR = ITAB-MATNR.
    IF SY-SUBRC NE 0 .
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-MATNR\'
                                                  ITAB-MATNR
                                                  TEXT-E03.
    ENDIF .
* check if Plant code is valid or not
    CLEAR: T001W .
    SELECT SINGLE * FROM  T001W CLIENT SPECIFIED
         WHERE  MANDT  = SY-MANDT
         AND    WERKS  = ITAB-WERKS.
    IF SY-SUBRC NE 0.
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-WERKS\'
                                                  ITAB-WERKS
                                                  TEXT-E04.
    ENDIF .
** check if requirement version is valid or not
*    clear: t459v .
*    select single * from  t459v client specified
*         where  mandt  = sy-mandt
*         and    versb  = itab-versb.
*    if sy-subrc ne 0.
*      perform store_forecast_error_details using \'ITAB-VERSB\'
*                                                  itab-versb
*                                                  text-e05.
*    endif .
** check if requirement type is invalid or not
*    clear: t459a .
*    select single * from  t459a client specified
*         where  mandt  = sy-mandt
*         and    bedae  = itab-bedae.
*    if sy-subrc ne 0.
*      perform store_forecast_error_details using \'ITAB-BEDAE\'
*                                                  itab-bedae
*                                                  text-e06.
*    endif .
*-* check if date format is valid or not - Starting Date
    CLEAR: DATUV .
    MOVE ITAB-DATVE TO DATUV.
    CALL FUNCTION \'DATE_CHECK_PLAUSIBILITY\'
      EXPORTING
        DATE                      = DATUV
      EXCEPTIONS
        PLAUSIBILITY_CHECK_FAILED = 1
        OTHERS                    = 2.
    IF SY-SUBRC NE 0.                    " Invalid date
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-DATVE\'
                                                  ITAB-DATVE
                                                  TEXT-E07.
    ENDIF.
*-* check if date format is valid or not - Ending Date
    CLEAR: DATUV .
    MOVE ITAB-DATBE TO DATUV.
    CALL FUNCTION \'DATE_CHECK_PLAUSIBILITY\'
      EXPORTING
        DATE                      = DATUV
      EXCEPTIONS
        PLAUSIBILITY_CHECK_FAILED = 1
        OTHERS                    = 2.
    IF SY-SUBRC NE 0.                    " Invalid date
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-DATBE\'
                                                  ITAB-DATBE
                                                  TEXT-E07.
    ENDIF.

*-* check if the beginnning date be fit for the ruler

    IF ITAB-DATVE+6(2) = \'01\' OR ITAB-DATVE+6(2) = \'08\' OR
       ITAB-DATVE+6(2) = \'15\' OR ITAB-DATVE+6(2) = \'22\'.
    ELSE .
      PERFORM STORE_FORECAST_ERROR_DETAILS USING \'ITAB-DATVE\'
                                                  ITAB-DATVE
                                                  TEXT-E08.
    ENDIF .

**-* check if Manufacturing BOM exists or not
*    clear: mast .
*    select single * from mast client specified
*                   where mandt = sy-mandt
*                     and matnr = itab-matnr
*                     and werks = itab-werks
*                     and stlan = str_stlan.
*    if sy-subrc ne 0.
*      concatenate itab-matnr itab-werks str_stlan
*             into str_field separated by space .
*      perform store_forecast_error_details using \'ITAB-MATNR\'
*                                                  str_field
*                                                  text-e09.
*    endif .

    MODIFY ITAB .
  ENDLOOP .

ENDFORM.                    " CHECK_RECORD_VALIDATION
*&---------------------------------------------------------------------*
*&      Form  PLANNED_REQUIREMENT_MAINTAIN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PLANNED_REQUIREMENT_MAINTAIN .

  DATA : CNT_ITEM(004TYPE P DECIMALS 0 .
  DATA : STR_UNIT LIKE MARA-MEINS . " store temp. unit for material
  CLEAR: CNT_ITEM .
  LOOP AT ITAB.
    REFRESH: BAPI_SSHDIN.
    CLEAR  : BAPI_SSHDIN, BAPI_SITEMR, STR_UNIT.

*-* store processed line counted
    CNT_ITEM = CNT_ITEM + 1 .

*-* determine the header of Planned Ind.Requiremens
    BAPI_SITEMR-MATERIAL    = ITAB-MATNR.    "planned material
    BAPI_SITEMR-PLANT       = ITAB-WERKS.    "planned plant
*    bapi_sitemr-requ_type   = itab-bedae.    "requirement type
*    bapi_sitemr-version     = itab-versb.    "default \'00\'
    BAPI_SITEMR-VERSION     = \'02\'.          "default \'00\'
*    bapi_sitemr-vers_activ  = \'X\' .          "default \'X\'
    BAPI_SITEMR-VERS_ACTIV  = \' \' .          "default \'X\'
    BAPI_SITEMR-REQ_NUMBER  = ITAB-PBDNR.    "defined by user

*-* get material base unit of measurement
    CLEAR: MARA .
    SELECT SINGLE MEINS INTO STR_UNIT FROM MARA
          WHERE MARA~MATNR = ITAB-MATNR.

* prepare scheduling lines for batch input processing
    PERFORM PREPARE_SCHEDULE_LINE USING STR_UNIT.

* get detailed requirements using BAPI function
    REFRESH: BAPI_SITMEO, BAPI_RETURN .
    CLEAR  : BAPI_SITMEO, BAPI_RETURN .
    CALL FUNCTION \'BAPI_REQUIREMENTS_GETDETAIL\'
      EXPORTING
          MATERIAL                 = BAPI_SITEMR-MATERIAL
          PLANT                    = BAPI_SITEMR-PLANT
          REQUIREMENTSTYPE         = BAPI_SITEMR-REQU_TYPE
          VERSION                  = BAPI_SITEMR-VERSION
          REQMTSPLANNUMBER         = BAPI_SITEMR-REQ_NUMBER
          MRP_AREA                 = BAPI_SITEMR-MRP_AREA
      TABLES
        REQUIREMENTS_OUT           = BAPI_SITMEO
*        requirements_char_in       = bapi_scharr
        RETURN                     = BAPI_RETURN .

    IF NOT BAPI_SITMEO[] IS INITIAL .  "if not empty, update ind.Requirements
*-* Planned Independent requirement - Update
      REFRESH: BAPI_RETURN .
      CLEAR  : BAPI_RETURN .
      CALL FUNCTION \'BAPI_REQUIREMENTS_CHANGE\'
        EXPORTING
          MATERIAL                 = BAPI_SITEMR-MATERIAL
          PLANT                    = BAPI_SITEMR-PLANT
          REQUIREMENTSTYPE         = BAPI_SITEMR-REQU_TYPE
          VERSION                  = BAPI_SITEMR-VERSION
          REQMTSPLANNUMBER         = BAPI_SITEMR-REQ_NUMBER
          VERS_ACTIV               = BAPI_SITEMR-VERS_ACTIV
          REQUIREMENT_PARAM        = LS_CM60R
          MRP_AREA                 = BAPI_SITEMR-MRP_AREA
          DELETE_OLD               = SPACE
        IMPORTING
          REQUIREMENT_ITEM_OUT     = BAPI_SITEMR
        TABLES
          REQUIREMENTS_SCHEDULE_IN = BAPI_SSHDIN
          REQUIREMENTS_CHAR_IN     = BAPI_SCHARR
          RETURN                   = BAPI_RETURN.

      READ TABLE BAPI_RETURN INDEX  1.
      IF SY-SUBRC <> 0.
* "Record has been updated successfully
        WRITE:/ CNT_ITEM, ITAB-PBDNR, ITAB-MATNR, ITAB-WERKS, ITAB-DATVE,
                \'UPDATE SUCCEED\' COLOR COL_KEY,       BAPI_RETURN-MESSAGE.
      ELSE.
* "Update not succeed, please check it
        WRITE:/ CNT_ITEM, ITAB-PBDNR, ITAB-MATNR, ITAB-WERKS, ITAB-DATVE,
                \'UPDATE FAILED\'  COLOR COL_NEGATIVE,  BAPI_RETURN-MESSAGE.

      ENDIF.

*-* Planned Independent requirement - New creation
    ELSE .  "If empty, new creation for this item
      REFRESH: BAPI_RETURN .
      CLEAR  : BAPI_RETURN .
      CALL FUNCTION \'BAPI_REQUIREMENTS_CREATE\'
        EXPORTING
          REQUIREMENTS_ITEM        = BAPI_SITEMR
        IMPORTING
          MATERIAL                 = BAPI_SITEMR-MATERIAL
          PLANT                    = BAPI_SITEMR-PLANT
          REQUIREMENTSTYPE         = BAPI_SITEMR-REQU_TYPE
          VERSION                  = BAPI_SITEMR-VERSION
          REQMTSPLANNUMBER         = BAPI_SITEMR-REQ_NUMBER
        TABLES
          REQUIREMENTS_SCHEDULE_IN = BAPI_SSHDIN
          REQUIREMENTS_CHAR_IN     = BAPI_SCHARR
          RETURN                   = BAPI_RETURN.
      READ TABLE BAPI_RETURN INDEX 1.
      IF SY-SUBRC <> 0  .
        WRITE:/ CNT_ITEM,  ITAB-PBDNR, ITAB-MATNR, ITAB-WERKS, ITAB-DATVE,
                \'INSERT SUCCEED\' COLOR COL_KEY, BAPI_RETURN-MESSAGE.
      ELSE.
        WRITE:/ CNT_ITEM,  ITAB-PBDNR, ITAB-MATNR, ITAB-WERKS, ITAB-DATVE,
                \'INSERT FAILED\' COLOR COL_NEGATIVE, BAPI_RETURN-MESSAGE.
      ENDIF.
    ENDIF .
    COMMIT WORK .
  ENDLOOP.

ENDFORM.                    " PLANNED_REQUIREMENT_MAINTAIN
*&---------------------------------------------------------------------*
*&      Form  UPLOADED_ERROR_LIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM UPLOADED_ERROR_LIST .
  IF NOT I_ERROR[] IS INITIAL .
    SKIP .
    ULINE AT (N) .
    WRITE:/ TEXT-H01 COLOR COL_KEY ,
            TEXT-H02 COLOR COL_KEY ,
            TEXT-H03 COLOR COL_KEY .
    ULINE AT (N) .
    LOOP AT I_ERROR .
      WRITE: / I_ERROR-FIELD    UNDER TEXT-H01 COLOR COL_NEGATIVE,
               I_ERROR-VALUE    UNDER TEXT-H02 COLOR COL_NEGATIVE,
               I_ERROR-MESSAGE  UNDER TEXT-H03 COLOR COL_NEGATIVE.
    ENDLOOP .
  ENDIF .
ENDFORM.                    " UPLOADED_ERROR_LIST
*&---------------------------------------------------------------------*
*&      Form  COLUMN_HEADER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM COLUMN_HEADER .
  IF NOT P_RESULT IS INITIAL .
    WRITE:/60 "72
            TEXT-F08 COLOR COL_KEY RIGHT-JUSTIFIED,
            TEXT-F09 COLOR COL_KEY RIGHT-JUSTIFIED,
            TEXT-F10 COLOR COL_KEY RIGHT-JUSTIFIED,
            TEXT-F11 COLOR COL_KEY RIGHT-JUSTIFIED,
            TEXT-F12 COLOR COL_KEY RIGHT-JUSTIFIED,
            TEXT-F13 COLOR COL_KEY RIGHT-JUSTIFIED.

    WRITE:/ TEXT-F01 COLOR COL_KEY ,
            TEXT-F02 COLOR COL_KEY ,
            TEXT-F03 COLOR COL_KEY ,
*            text-f04 color col_key ,
*            text-f05 color col_key ,
            TEXT-F06 COLOR COL_KEY CENTERED,
            TEXT-F07 COLOR COL_KEY CENTERED,
            TEXT-F14 COLOR COL_KEY UNDER TEXT-F08 RIGHT-JUSTIFIED,
            TEXT-F15 COLOR COL_KEY UNDER TEXT-F09 RIGHT-JUSTIFIED,
            TEXT-F16 COLOR COL_KEY UNDER TEXT-F10 RIGHT-JUSTIFIED,
            TEXT-F17 COLOR COL_KEY UNDER TEXT-F11 RIGHT-JUSTIFIED,
            TEXT-F18 COLOR COL_KEY UNDER TEXT-F12 RIGHT-JUSTIFIED,
            TEXT-F19 COLOR COL_KEY UNDER TEXT-F13 RIGHT-JUSTIFIED.
    ULINE AT (N) .
  ENDIF .

ENDFORM.                    " COLUMN_HEADER
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_UPLOAD_RESULT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DISPLAY_UPLOAD_RESULT .

  LOOP AT ITAB  .
    WRITE:/ ITAB-PBDNR UNDER TEXT-F01 ,
            ITAB-MATNR UNDER TEXT-F02 ,
            ITAB-WERKS UNDER TEXT-F03 ,
*           itab-versb under text-f04 ,
*           itab-bedae under text-f05 ,
            ITAB-DATVE UNDER TEXT-F06 ,
            ITAB-DATBE UNDER TEXT-F07 ,
            ITAB-PLN01 UNDER TEXT-F08 COLOR COL_KEY ,
            ITAB-PLN02 UNDER TEXT-F09 COLOR COL_KEY ,
            ITAB-PLN03 UNDER TEXT-F10 COLOR COL_KEY ,
            ITAB-PLN04 UNDER TEXT-F11 COLOR COL_KEY ,
            ITAB-PLN05 UNDER TEXT-F12 COLOR COL_KEY ,
            ITAB-PLN06 UNDER TEXT-F13 COLOR COL_KEY .
    WRITE:/ ITAB-PLN07 UNDER TEXT-F14 COLOR COL_KEY ,
            ITAB-PLN08 UNDER TEXT-F15 COLOR COL_KEY ,
            ITAB-PLN09 UNDER TEXT-F16 COLOR COL_KEY ,
            ITAB-PLN10 UNDER TEXT-F17 COLOR COL_KEY ,
            ITAB-PLN11 UNDER TEXT-F18 COLOR COL_KEY ,
            ITAB-PLN12 UNDER TEXT-F19 COLOR COL_KEY .
  ENDLOOP .
ENDFORM.                    " DISPLAY_UPLOAD_RESULT
*&---------------------------------------------------------------------*
*&      Form  PREPARE_SCHEDULE_LINE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_BDATE  text
*      -->P_ITAB_PLN01  text
*----------------------------------------------------------------------*
FORM PREPARE_SCHEDULE_LINE USING UNIT.

  DATA : PREV_MONTH(006).
  DATA : CURR_MONTH(006).
  DATA : BEGIN_DATE LIKE ITAB-DATVE ,"for beign date check (inter.table)
         PLN_DATE   LIKE ITAB-DATVE ."for planned date determination
  CLEAR: PREV_MONTH, CURR_MONTH, BEGIN_DATE .

*-* Week 01
  BEGIN_DATE = ITAB-DATVE      .
  PREV_MONTH = ITAB-DATVE+0(6) .
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN01 UNIT.

*-* Week 02
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN02 UNIT.

*-* Week 03
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN03 UNIT.

*-* Week 04
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN04 UNIT.

*-* Week 05
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
*-* check if weekend day, if ok, delay to workday
*    perform get_beginning_date using begin_date changing begin_date .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN05 UNIT .

*-* Week 06
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN06 UNIT .

*-* Week 07
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN07 UNIT .

*-* Week 08
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN08 UNIT .

*-* Week 09
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN09 UNIT .

*-* Week 10
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN10 UNIT .

*-* Week 11
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .
*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN11 UNIT .

*-* Week 12
  BEGIN_DATE = PLN_DATE + 7 .
  IF BEGIN_DATE+6(2) > \'22\'.
    BEGIN_DATE = BEGIN_DATE + 7 .
  ENDIF .
  CURR_MONTH = BEGIN_DATE+0(6) .
  IF CURR_MONTH <> PREV_MONTH .
    CONCATENATE CURR_MONTH \'01\' INTO BEGIN_DATE .
    PREV_MONTH = CURR_MONTH .
  ENDIF.
  PLN_DATE = BEGIN_DATE .
*-* check if holiday... if true, add 1 to begin_date
  PERFORM GET_PLANNED_DATE USING BEGIN_DATE CHANGING BEGIN_DATE .

*-* forecast & planned indpendent requirements records appended
  PERFORM APPEND_SCHEDULE_LINE USING BEGIN_DATE ITAB-PLN12 UNIT .

ENDFORM.                    " PREPARE_SCHEDULE_LINE
*&---------------------------------------------------------------------*
*&      Form  GET_PLANNED_DATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PLN_DATE  text
*      <--P_PLN_DATE  text
*----------------------------------------------------------------------*
FORM GET_PLANNED_DATE  USING CHECK_DATE CHANGING PLAN_DATE.

  DATA : CHK_DATE LIKE ITAB-DATVE .
  DATA : LC_HOLIDAY_FOUND(001) .
  DATA : WORKDAYS TYPE P .
  CLEAR: CHK_DATE, LC_HOLIDAY_FOUND .
  CHK_DATE = CHECK_DATE .
  WHILE LC_HOLIDAY_FOUND IS INITIAL .
    CLEAR: THOC, WORKDAYS .
    SELECT SINGLE * FROM THOC WHERE IDENT EQ \'CN\'
                                AND DATUM EQ CHK_DATE.
    IF SY-SUBRC = 0 .
      CHK_DATE  = CHK_DATE - 1 .
    ELSE .
      PERFORM GET_DAY_IN_WEEK USING CHK_DATE WORKDAYS.
      IF WORKDAYS EQ 7 .
        CHK_DATE  = CHK_DATE - 1.
      ELSE.
        LC_HOLIDAY_FOUND = \'X\' .
        PLAN_DATE = CHK_DATE   .
      ENDIF .
    ENDIF .
  ENDWHILE .

ENDFORM.                    " GET_PLANNED_DATE

*&---------------------------------------------------------------------*
*&      Form  APPEND_SCHEDULE_LINE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM APPEND_SCHEDULE_LINE USING BEGINDATE PLNQTY STRUNIT.

** "Requirement Intervals Type: 1=>day,2=>Week,3=>Month
  BAPI_SSHDIN-DATE_TYPE = \'1\' .
  BAPI_SSHDIN-REQ_DATE  = BEGINDATE   .
  BAPI_SSHDIN-REQ_QTY   = PLNQTY       .
  BAPI_SSHDIN-UNIT      = STRUNIT     .
  APPEND BAPI_SSHDIN .
  CLEAR  BAPI_SSHDIN .

ENDFORM.                    " APPEND_SCHEDULE_LINE
发表于 2009-02-19 16:28  Patrick,Song  阅读(937)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-18
  • 2021-10-31
  • 2021-11-02
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-12-23
  • 2021-11-02
  • 2022-12-23
  • 2022-12-23
  • 2021-10-19
  • 2021-11-13
相关资源
相似解决方案