独立需求上传程序(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
DATA: BEGIN 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
DATA: END 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
DATA: BEGIN OF I_ERROR OCCURS 0.
DATA: FIELD(040).
DATA: VALUE(030).
DATA: MESSAGE(040).
DATA: END OF I_ERROR.
*--* define internal table for error store
DATA: BEGIN 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
DATA: MESSAGE TYPE STRING.
DATA: END OF I_RESULT.
*--* determine BOM Usage for Sales Forecasting
DATA: STR_STLAN LIKE MAST-STLAN .
*----------------------------------------------------------------------*
* Global program variables *
*----------------------------------------------------------------------*
*--* internal table for uploading date audit
DATA: BEGIN OF AUDIT.
DATA: LIN_ERROR TYPE I. " # of lines errors
DATA: LIN_TOTAL TYPE I. " # of lines total
DATA: END 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(004) TYPE 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
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
DATA: BEGIN 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
DATA: END 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
DATA: BEGIN OF I_ERROR OCCURS 0.
DATA: FIELD(040).
DATA: VALUE(030).
DATA: MESSAGE(040).
DATA: END OF I_ERROR.
*--* define internal table for error store
DATA: BEGIN 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
DATA: MESSAGE TYPE STRING.
DATA: END OF I_RESULT.
*--* determine BOM Usage for Sales Forecasting
DATA: STR_STLAN LIKE MAST-STLAN .
*----------------------------------------------------------------------*
* Global program variables *
*----------------------------------------------------------------------*
*--* internal table for uploading date audit
DATA: BEGIN OF AUDIT.
DATA: LIN_ERROR TYPE I. " # of lines errors
DATA: LIN_TOTAL TYPE I. " # of lines total
DATA: END 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(004) TYPE 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