You are on page 1of 17

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_COMP_DATE.
* 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 < first date add to first date
READ TABLE FORECAST INDEX 1.
IF FORECAST-DATE GE W_DESP_DATE.
W_INDEX = 1.
ELSE.
* find first slot where date > 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_COMP_DATE.
* 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 < first date add to first date
READ TABLE FORECAST INDEX 1.
IF FORECAST-DATE GE W_DESP_DATE.
W_INDEX = 1.
ELSE.
* find first slot where date > 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.

You might also like