ABAP Program to Get Output in EXCEL

This source code is an ABAP Program to Get Output in EXCEL

REPORT YLMM015A

MESSAGE-ID YL.

*———————————————————————–

*

* EDI FORECASTING INTERFACE – SHEILA TITCHENER JAN 1998

* L_IDOC_HEADER_CREATE, L_IDOC_SEGMENT_CREATE & L_IDOC_SEND

* left idoc ready to send but did not send automatically.

* these were replaced by ALE_MODEL_DETERMINE_IF_TO_SEND

* ALE_MODEL_INFO_GET & MASTER_IDOC_DISTRIBUTE

* ‘in update task’. This solved the problem. Records are set up in table

* t_edidd.

*———————————————————————–

* TABLES – Database *

*———————————————————————–

TABLES: EORD,

MARC,

MARM,

EINA,

PLAF,

EBAN,

EDIDD.

*———————————————————————–

* DATA – Work Fields

*———————————————————————–

DATA: W_START_MONTH LIKE SY-DATUM.

DATA: W_NEXT_MONTH LIKE SY-DATUM.

DATA: W_THIRD_MONTH LIKE SY-DATUM.

DATA: W_END_DATE LIKE SY-DATUM.

DATA: W_COMP_DATE LIKE SY-DATUM.

DATA: W_BEG_DATE LIKE SY-DATUM.

DATA: W_DESP_DATE LIKE SY-DATUM.

DATA: W_DAY LIKE HRVSCHED-DAYNR.

DATA: W_DAY_TXT LIKE HRVSCHED-DAYTXT.

DATA: W_INDEX LIKE SY-TABIX.

DATA: W_TOTAL LIKE EBAN-MENGE.

DATA: W_ITEM_NUMBER TYPE I.

* IDOC DATA

DATA: W_E1EDK01_DATA LIKE E1EDK01.

DATA: W_E1EDK03_DATA LIKE E1EDK03.

DATA: W_E1EDKA1_DATA LIKE E1EDKA1.

DATA: W_E1EDP01_DATA LIKE E1EDP01.

DATA: W_E1EDP20_DATA LIKE E1EDP20.

DATA: W_E1EDP19_DATA LIKE E1EDP19.

* DATA – INTERNAL TABLES

*———————————————————————–

* forecast buckets – 8/9 weekly for first 2 months then 10 monthly

DATA: BEGIN OF FORECAST OCCURS 19,

DATE TYPE D, “start date of bucket

WEEK_MON, “weekly or monthly indicator

QTY LIKE EBAN-MENGE. “accumulated qty

DATA: END OF FORECAST.

*DATA: PRODUCTS LIKE EORD OCCURS 10 WITH HEADER LINE.

DATA: BEGIN OF PRODUCTS OCCURS 10,

MATNR LIKE EORD-MATNR,

WERKS LIKE EORD-WERKS,

LIFNR LIKE EORD-LIFNR.

DATA: END OF PRODUCTS.

* planned orders table PLAF

DATA: BEGIN OF T_PLAF OCCURS 10,

GSMNG LIKE PLAF-GSMNG,

PEDTR LIKE PLAF-PEDTR.

DATA: END OF T_PLAF.

* planned orders table EBAN

DATA: BEGIN OF T_EBAN OCCURS 10,

MENGE LIKE EBAN-MENGE,

LFDAT LIKE EBAN-LFDAT.

DATA: END OF T_EBAN.

* IDOC _SEND parameter

DATA: COMM_IDOC_CONTROL LIKE EDIDC OCCURS 1 WITH HEADER LINE.

*———————————————————————–

* new fields for new way of sending IDOC

DATA: W_EDIDC LIKE EDIDC OCCURS 5 WITH HEADER LINE,

L_EDIDC LIKE EDIDC,

L_SEND_FLAG,

W_SDATA LIKE EDIDD-SDATA.

DATA: T_BDI_MODEL LIKE BDI_MODEL OCCURS 0 WITH HEADER LINE.

DATA: T_EDIDC LIKE EDIDC OCCURS 0 WITH HEADER LINE.

DATA: T_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.

*——————————————————————–

* OUTPUT file layout

DATA: BEGIN OF OUTREC,

MATNR LIKE EBAN-MATNR,

D1 VALUE ‘$’,

IDNLF LIKE EINA-IDNLF,

D2 VALUE ‘$’,

WEEK_MON,

D3 VALUE ‘$’,

PERIOD LIKE SY-DATUM,

D4 VALUE ‘$’,

QTY(8),

ENDOFLINE TYPE X VALUE ‘0D’,

END OF OUTREC.

*———————————————————————–

* SELECT-OPTIONS

*———————————————————————–

SELECT-OPTIONS P_LIFNR FOR EORD-LIFNR.

*———————————————————————–

* PARAMETERS *

*———————————————————————–

PARAMETERS: P_PART LIKE EDIDC-RCVPRN DEFAULT ‘EDIFCAST’,

P_FILE(30) DEFAULT ‘/vmedata/XXX/mdafcstddmmyy’ LOWER CASE.

*———————————————————————–

* INITIALIZATION.

*———————————————————————–

INITIALIZATION.

* move hoot name to output file name

P_FILE+9(3) = SY-SYSID.

* move todays date to output file name

P_FILE+20(2) = SY-DATUM+6(2).

P_FILE+22(2) = SY-DATUM+4(2).

P_FILE+24(2) = SY-DATUM+2(2).

*———————————————————————–

START-OF-SELECTION.

*———————————————————————–

* OPEN $ delimited file

OPEN DATASET P_FILE FOR OUTPUT IN TEXT MODE.

* 4.1 create header idoc

* REPLACE function with alternative

* CALL FUNCTION ‘L_IDOC_HEADER_CREATE’

* EXPORTING

* I_MESTYP = ‘ORDERS’

* I_MESCOD = ‘ ‘

* I_IDOCTP = ‘ORDERS01’

* I_RCVPRN = P_PART

* EXCEPTIONS

* OTHERS = 1.

*- Call function module to determine if message is to be distributed

CALL FUNCTION ‘ALE_MODEL_DETERMINE_IF_TO_SEND’

EXPORTING

MESSAGE_TYPE = ‘ORDERS’

IMPORTING

IDOC_MUST_BE_SENT = L_SEND_FLAG

EXCEPTIONS

OWN_SYSTEM_NOT_DEFINED = 1

OTHERS = 2.

*- Determine recipient systems

CALL FUNCTION ‘ALE_MODEL_INFO_GET’

EXPORTING

MESSAGE_TYPE = ‘ORDERS’

* RECEIVING_SYSTEM = ‘ ‘

* SENDING_SYSTEM = ‘ ‘

* VALIDDATE = SY-DATUM

TABLES

MODEL_DATA = T_BDI_MODEL

EXCEPTIONS

NO_MODEL_INFO_FOUND = 1

OWN_SYSTEM_NOT_DEFINED = 2

OTHERS = 3.

* 4.2 – 4.5 create idoc segments

PERFORM IDOC_CREATE.

* 4.6 Set up forecast bucket dates

* determine start of the next forecast month

W_START_MONTH = SY-DATUM.

* 12 months ago

*_LAST_12_MTH = SY-DATUM – 365.

IF W_START_MONTH+4(2) = ’12’.

W_START_MONTH+4(2) = ’01’.

W_START_MONTH(4) = W_START_MONTH(4) + ‘0001’.

ELSE.

W_START_MONTH+4(2) = W_START_MONTH+4(2) + ’01’.

ENDIF.

W_START_MONTH+6 = ’01’.

CALL FUNCTION ‘RH_GET_DATE_DAYNAME’

EXPORTING

LANGU = ‘E’

DATE = W_START_MONTH

* CHECK =

IMPORTING

DAYNR = W_DAY

DAYTXT = W_DAY_TXT

EXCEPTIONS

NO_LANGU = 1

NO_DATE = 2

NO_DAYTXT_FOR_LANGU = 3

INVALID_DATE = 4

OTHERS = 5.

CASE W_DAY.

WHEN 1.

WHEN 2.

W_START_MONTH = W_START_MONTH – 1.

WHEN 3.

W_START_MONTH = W_START_MONTH – 2.

WHEN 4.

W_START_MONTH = W_START_MONTH + 4.

WHEN 5.

W_START_MONTH = W_START_MONTH + 3.

WHEN 6.

W_START_MONTH = W_START_MONTH + 2.

WHEN 7.

W_START_MONTH = W_START_MONTH + 1.

ENDCASE.

* date of start of monthly forecasting

W_THIRD_MONTH = W_START_MONTH.

IF
W_START_MONTH+4(2) < '11'. W_THIRD_MONTH+4(2) = W_THIRD_MONTH+4(2) + '02'. ELSE. W_THIRD_MONTH+4(2) = W_THIRD_MONTH+4(2) - '10'. W_THIRD_MONTH(4) = W_THIRD_MONTH(4) + '0001'. ENDIF. * day will be the first W_THIRD_MONTH+6 = '01'. * find nearest monday - removed *CALL FUNCTION 'RH_GET_DATE_DAYNAME' * EXPORTING * LANGU = 'E' * DATE = W_THIRD_MONTH ** CHECK = * IMPORTING * DAYNR = W_DAY * DAYTXT = W_DAY_TXT * EXCEPTIONS * NO_LANGU = 1 * NO_DATE = 2 * NO_DAYTXT_FOR_LANGU = 3 * INVALID_DATE = 4 * OTHERS = 5. *CASE W_DAY. * WHEN 1. * WHEN 2. * W_THIRD_MONTH = W_THIRD_MONTH - 1. * WHEN 3. * W_THIRD_MONTH = W_THIRD_MONTH - 2. * WHEN 4. * W_THIRD_MONTH = W_THIRD_MONTH + 4. * WHEN 5. * W_THIRD_MONTH = W_THIRD_MONTH + 3. * WHEN 6. * W_THIRD_MONTH = W_THIRD_MONTH + 2. * WHEN 7. * W_THIRD_MONTH = W_THIRD_MONTH + 1. *ENDCASE. * set up all dates in table DO. IF SY-INDEX = 1. FORECAST-DATE = W_START_MONTH. W_NEXT_MONTH = W_START_MONTH. ELSE. * if this takes us into the third month set to monthly IF W_NEXT_MONTH GE W_THIRD_MONTH. IF W_NEXT_MONTH+4(2) = '12'. " add 1 month W_NEXT_MONTH+4(2) = '01'. W_NEXT_MONTH(4) = W_NEXT_MONTH(4) + '0001'. ELSE. W_NEXT_MONTH+4(2) = W_NEXT_MONTH+4(2) + '01'. ENDIF. * W_NEXT_MONTH = W_NEXT_MONTH + 28. * IF W_NEXT_MONTH+4(2) = FORECAST-DATE+4(2). * W_NEXT_MONTH = W_NEXT_MONTH + 7. * ENDIF. ELSE. * add 1 week W_NEXT_MONTH = W_NEXT_MONTH + 7. ENDIF. FORECAST-DATE = W_NEXT_MONTH. ENDIF. IF FORECAST-DATE GE W_THIRD_MONTH. FORECAST-DATE+6(2) = '01'. "set start day to 1 FORECAST-WEEK_MON = '2'. ELSE. FORECAST-WEEK_MON = '1'. ENDIF. * year complete? IF FORECAST-DATE+4(2) = W_START_MONTH+4(2) AND FORECAST-DATE(4) >
W_START_MONTH(4).

W_END_DATE = FORECAST-DATE.

EXIT.

ENDIF.

APPEND FORECAST.

ENDDO.

*———————————————————————–

* Start of selection processing

*———————————————————————–

* 4.7 select records from Purchasing Source list

*———————————————————————–

SELECT MATNR WERKS LIFNR FROM EORD INTO TABLE PRODUCTS

WHERE LIFNR IN P_LIFNR

AND FLIFN = ‘X’

AND VDATU LE SY-DATUM

AND BDATU GE SY-DATUM.

* check within selection range

* CHECK P_LIFNR.

* add to table

* APPEND PRODUCTS.

*ENDSELECT.

* delete duplicates products

* table already in product code sequence

DELETE ADJACENT DUPLICATES FROM PRODUCTS COMPARING MATNR.

*———————————————————————–

* process selected vendors materials

*———————————————————————–

LOOP AT PRODUCTS.

*————————————–

* 4.7 access material master

*————————————–

SELECT SINGLE * FROM MARC

WHERE MATNR = PRODUCTS-MATNR

AND WERKS = PRODUCTS-WERKS .

CHECK MARC-DISMM = ‘PD’ OR MARC-DISMM = ‘P3’

OR MARC-DISMM = ‘ZD’ OR MARC-DISMM = ‘Z3’.

*————————————–

* 4.8 access purchasing info record

*————————————–

SELECT SINGLE * FROM EINA

WHERE MATNR = PRODUCTS-MATNR

AND LIFNR = PRODUCTS-LIFNR.

* record found?

CHECK SY-SUBRC = 0.

* vendor’s material number begins with 45?

CHECK EINA-IDNLF(2) = ’45’.

*————————————–

* 4.10 clear forecast quantities

*————————————–

LOOP AT FORECAST.

FORECAST-QTY = 0.

MODIFY FORECAST TRANSPORTING QTY.

ENDLOOP.

*————————————–

* 4.10

*————————————–

* calculate start & end dates

W_COMP_DATE = W_END_DATE + 9.

* W_BEG_DATE = W_START_MONTH + MARC-WEBAZ + 9.

* read all matching material records from planned orders table PLAF

SELECT GSMNG PEDTR FROM PLAF INTO CORRESPONDING FIELDS OF TABLE T_PLAF

WHERE MATNR = PRODUCTS-MATNR

AND PEDTR <> W_BEG_DATE.

*————————————–

* 4.11 process any records found

*————————————–

IF SY-SUBRC = 0.

LOOP AT T_PLAF.

W_DESP_DATE = T_PLAF-PEDTR – 9.

* IF date is < w_index =" 1."> despatch date.

LOOP AT FORECAST

WHERE DATE GE W_DESP_DATE.

W_INDEX = SY-TABIX.

EXIT.

ENDLOOP.

* read previous entry.

W_INDEX = W_INDEX – 1.

READ TABLE FORECAST INDEX W_INDEX.

ENDIF.

* convert to purchasing unit of measure

IF EINA-UMREZ NE 0.

T_PLAF-GSMNG = T_PLAF-GSMNG * EINA-UMREN / EINA-UMREZ.

ENDIF.

*

FORECAST-QTY = FORECAST-QTY + T_PLAF-GSMNG.

MODIFY FORECAST INDEX W_INDEX.

ENDLOOP.

ENDIF.

*————————————–

* 4.12 read all matching material records from planned orders table EBAN

*————————————–

SELECT MENGE LFDAT FROM EBAN INTO CORRESPONDING FIELDS OF TABLE T_EBAN

WHERE MATNR = PRODUCTS-MATNR

AND LFDAT <> W_BEG_DATE.

*————————————–

* 4.13 process any records found

*————————————–

IF SY-SUBRC = 0.

LOOP AT T_EBAN.

W_DESP_DATE = T_EBAN-LFDAT – 9.

* IF date is < w_index =" 1."> despatch date.

LOOP AT FORECAST

WHERE DATE GE W_DESP_DATE.

W_INDEX = SY-TABIX.

EXIT.

ENDLOOP.

* read previous entry.

W_INDEX = W_INDEX – 1.

READ TABLE FORECAST INDEX W_INDEX.

ENDIF.

* convert to purchasing unit of measure

IF EINA-UMREZ NE 0.

T_EBAN-MENGE = T_EBAN-MENGE * EINA-UMREN / EINA-UMREZ.

ENDIF.

* add to table

FORECAST-QTY = FORECAST-QTY + T_EBAN-MENGE.

MODIFY FORECAST INDEX W_INDEX.

ENDLOOP.

ENDIF.

*———————————————————————–

* 4.14 total all forecast buckets

*————————————–

W_TOTAL = 0.

LOOP AT FORECAST.

W_TOTAL = W_TOTAL + FORECAST-QTY.

ENDLOOP.

CHECK W_TOTAL NE 0.

*————————————–

* create idocs for material forecast

*————————————–

W_ITEM_NUMBER = W_ITEM_NUMBER + 1.

IF W_ITEM_NUMBER > 80.

W_ITEM_NUMBER = 1.

PERFORM IDOC_CREATE.

ENDIF.

*————————————–

* 4.14.3 create idoc E1EDP01

*————————————–

W_E1EDP01_DATA-POSEX = W_ITEM_NUMBER.

WRITE W_TOTAL TO W_E1EDP01_DATA-MENGE DECIMALS 0.

* EDIDD-SDATA = W_E1EDP01_DATA.

T_EDIDD-SDATA = W_E1EDP01_DATA.

W_SDATA = W_E1EDP01_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDP01’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDP01’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*————————————–

* 4.14.4 create idoc E1EDP20

*————————————–

LOOP AT FORECAST.

IF FORECAST-QTY NE 0.

WRITE FORECAST-QTY TO W_E1EDP20_DATA-WMENG DECIMALS 0.

W_E1EDP20_DATA-AMENG = FORECAST-WEEK_MON.

W_E1EDP20_DATA-EDATU = FORECAST-DATE.

* EDIDD-SDATA = W_E1EDP20_DATA.

T_EDIDD-SDATA = W_E1EDP20_DATA.

W_SDATA = W_E1EDP20_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDP20’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDP20’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*————————————–

* write record to $ delimited file

*————————————–

OUTREC-MATNR = PRODUCTS-MATNR.

OUTREC-IDNLF = EINA-IDNLF.

OUTREC-WEEK_MON = FORECAST-WEEK_MON.

OUTREC-PERIOD = FORECAST-DATE.

WRITE FORECAST-QTY TO OUTREC-QTY DECIMALS 0.

TRANSFER OUTREC TO P_FILE.

ENDIF.

ENDLOOP.

* 4.14.5 End of this product

*————————————–

W_E1EDP19_DATA-IDTNR = EINA-IDNLF.

* EDIDD-SDATA = W_E1EDP19_DATA.

T_EDIDD-SDATA = W_E1EDP19_DATA.

W_SDATA = W_E1EDP19_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDP19’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDP19’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

ENDLOOP.

*————————————–

* end of all products

*———————————————————————–

* REPLACE WITH MASTER_IDOC_DISTRIBUTE

* CALL FUNCTION ‘L_IDOC_SEND’

* TABLES

* T_COMM_IDOC = COMM_IDOC_CONTROL

* EXCEPTIONS

* ERROR_DISTRIBUTE_IDOC = 1

* OTHERS = 2.

READ TABLE T_BDI_MODEL INDEX 1. ” maximum 1 recipient

MOVE ‘ORDERS’ TO L_EDIDC-MESTYP.

MOVE ‘ORDERS01’ TO L_EDIDC-IDOCTP.

MOVE ‘LS’ TO L_EDIDC-RCVPRT.

* MOVE T_BDI_MODEL-RCVSYSTEM TO L_EDIDC-RCVPRN.

* partner profile parameter

MOVE P_PART TO L_EDIDC-RCVPRN.

*- Distribute the iDoc

CALL FUNCTION ‘MASTER_IDOC_DISTRIBUTE’ IN UPDATE TASK

EXPORTING

MASTER_IDOC_CONTROL = L_EDIDC

TABLES

COMMUNICATION_IDOC_CONTROL = COMM_IDOC_CONTROL

MASTER_IDOC_DATA = T_EDIDD

EXCEPTIONS

ERROR_IN_IDOC_CONTROL = 01

ERROR_WRITING_IDOC_STATUS = 02

ERROR_IN_IDOC_DATA = 03

SENDING_LOGICAL_SYSTEM_UNKNOWN = 04.

COMMIT WORK.

*———————————————————————–

END-OF-SELECTION.

CLOSE DATASET P_FILE.

*———————————————————————–

FORM IDOC_CREATE.

*———————————————————————–

* 4.2 Create idoc segment E1EDK01

W_E1EDK01_DATA-BELNR = ‘EDI FORECAST’.

* EDIDD-SDATA = W_E1EDK01_DATA.

T_EDIDD-SDATA = W_E1EDK01_DATA.

W_SDATA = W_E1EDK01_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDK01’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDK01’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*————————————–

* 4.3 Create idoc segments E1EDK03

*————————————–

W_E1EDK03_DATA-IDDAT = ‘002’.

W_E1EDK03_DATA-DATUM = SY-DATUM.

* EDIDD-SDATA = W_E1EDK03_DATA.

T_EDIDD-SDATA = W_E1EDK03_DATA.

W_SDATA = W_E1EDK03_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDK03’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDK03’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*————————————–

* 4.4 Create idco E1EDKA1

*————————————–

W_E1EDKA1_DATA-PARVW = ‘LI’.

W_E1EDKA1_DATA-PARTN = P_PART.

* EDIDD-SDATA = W_E1EDKA1_DATA.

T_EDIDD-SDATA = W_E1EDKA1_DATA.

W_SDATA = W_E1EDKA1_DATA. “????

T_EDIDD-SEGNAM = ‘E1EDKA1’.

APPEND T_EDIDD.

* CALL FUNCTION ‘L_IDOC_SEGMENT_CREATE’

* EXPORTING

* I_SEGNAM = ‘E1EDKA1’

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

ENDFORM.