*-------------------------------------------------------------------*
* Report Name: ZORAPOLI
* Generated At: Monday, May 02, 2005 15:15:59
* CPI-C Special Notes:
* 1) To execute this job, user type must be CPI-c.
* 2) Add communication partner in TXCOM using SM54.
*-------------------------------------------------------------------*


REPORT ZORAPOLI.


* Step 1. Declare Table
TABLES:
     EKKO,
     EKPO,
     EKKN,
     SKA1.


* Step 2. Declare Internal table
DATA:  BEGIN OF IT_EKKO OCCURS 0.
         INCLUDE STRUCTURE EKKO.
DATA:  END OF IT_EKKO.


DATA:  BEGIN OF IT_EKPO OCCURS 0.
         INCLUDE STRUCTURE EKPO.
DATA:  END OF IT_EKPO.


DATA:  BEGIN OF IT_EKKN OCCURS 0.
         INCLUDE STRUCTURE EKKN.
DATA:  END OF IT_EKKN.


DATA:  BEGIN OF IT_SKA1 OCCURS 0.
         INCLUDE STRUCTURE SKA1.
DATA:  END OF IT_SKA1.


* Step 3. Declare Structure
DATA:  BEGIN OF ST_1 OCCURS 1,
         F_1(12) TYPE C, " For EKKO-ERNAM,
         F_2(4) TYPE C, " For EKKO-BUKRS,
         F_3(1) TYPE C, " For EKKO-SPRAS,
         F_4(5) TYPE C, " For EKKO-WAERS,
         F_5(10) TYPE C, " For EKKO-EBELN,
         F_6(8) TYPE C, " For EKKO-AEDAT,
         F_7(10) TYPE C, " For EKKO-LIFNR,
         F_8(40) TYPE C, " For EKPO-TXZ01,
         F_9(18) TYPE C, " For EKPO-MATNR,
         F_10(5) TYPE C, " For EKPO-EBELP,
         F_11(9) TYPE C, " For EKPO-MATKL,
         F_12(15) TYPE C, " For EKPO-MENGE,
         F_13(3) TYPE C, " For EKPO-MEINS,
         F_14(13) TYPE C, " For EKPO-NETPR,
         F_15(2) TYPE C, " For EKKN-ZEKKN,
         F_16(10) TYPE C, " For EKKN-SAKTO,
         F_17(10) TYPE C, " For EKKN-KOSTL,
         F_18(4) TYPE C, " For SKA1-KTOPL,
         F_19(10) TYPE C, " For SKA1-BILKT,
         F_20(10) TYPE C, " For SKA1-SAKNR,
END OF ST_1.
DATA:  IT_1 LIKE ST_1 OCCURS 0 WITH HEADER LINE.


* Step 4. Table and structure for CPI-C
TABLES:  TCPIC.
INCLUDE: RSCPICDF.


* Step 5. Declare CPI-C communication variables
DATA:  COM_ID(8)     TYPE C,    " Communication ID
       COM_IN(100)   TYPE C,    " Init signal buffer
       COM_D(4)      TYPE X,    " Dataset Info
       COM_S(4)      TYPE X,    " Status Info
       COM_L(4)      TYPE X,    " Buffer Length
       D_PACK(32000) TYPE C,    " CPI-C Data Pack
       D_OFFSET      TYPE I,    " Offset
       D_LEN         TYPE I.    " Next Pack Length


DATA: PARAM_1 LIKE EKKO-AEDAT. " For DS_JOB_PARAM@FromPOCreationDate
DATA: PARAM_2 LIKE EKKO-AEDAT. " For DS_JOB_PARAM@ToPOCreationDate


EXIT.


*-------------------------------------------------------------------*
* Form CPIC is a dynamic call and will be used by                    
* communication partner like DataStage.                              
*-------------------------------------------------------------------*


FORM CPIC.
* Step 6. CPI-C Initialization
*-------------------------------------------------------------------*
* Establish communication, get communication ID                      
*-------------------------------------------------------------------*
COMMUNICATION ACCEPT ID COM_ID.
IF SY-SUBRC <> 0.
    EXIT.
ENDIF.




PERFORM RECEIVE_PARAMETER.


D_PACK = ''.
D_OFFSET = 0.
D_LEN = D_OFFSET + 199.
CLEAR IT_1.
REFRESH IT_1.
CLEAR IT_EKKO.
REFRESH IT_EKKO.
CLEAR IT_EKPO.
REFRESH IT_EKPO.
CLEAR IT_EKKN.
REFRESH IT_EKKN.
CLEAR IT_SKA1.
REFRESH IT_SKA1.
SELECT
    ERNAM
    BUKRS
    SPRAS
    WAERS
    EBELN
    AEDAT
    LIFNR
INTO (IT_EKKO-ERNAM,
      IT_EKKO-BUKRS,
      IT_EKKO-SPRAS,
      IT_EKKO-WAERS,
      IT_EKKO-EBELN,
      IT_EKKO-AEDAT,
      IT_EKKO-LIFNR)
FROM EKKO
WHERE
AEDAT >= PARAM_1 AND

AEDAT <= PARAM_2 AND

BSART IN ('NB').
SELECT
    TXZ01
    MATNR
    EBELP
    MATKL
    MENGE
    MEINS
    NETPR
    EBELN
INTO (IT_EKPO-TXZ01,
      IT_EKPO-MATNR,
      IT_EKPO-EBELP,
      IT_EKPO-MATKL,
      IT_EKPO-MENGE,
      IT_EKPO-MEINS,
      IT_EKPO-NETPR,
      IT_EKPO-EBELN)
FROM EKPO
WHERE
EBELN = IT_EKKO-EBELN.
SELECT
    ZEKKN
    SAKTO
    KOSTL
INTO (IT_EKKN-ZEKKN,
      IT_EKKN-SAKTO,
      IT_EKKN-KOSTL)
FROM EKKN
WHERE
EBELN = IT_EKPO-EBELN AND

EBELP = IT_EKPO-EBELP.
SELECT
    KTOPL
    BILKT
    SAKNR
INTO (IT_SKA1-KTOPL,
      IT_SKA1-BILKT,
      IT_SKA1-SAKNR)
FROM SKA1
WHERE
SAKNR = IT_EKKN-SAKTO.
    IT_1-F_1 = IT_EKKO-ERNAM.
    IT_1-F_2 = IT_EKKO-BUKRS.
    IT_1-F_3 = IT_EKKO-SPRAS.
    IT_1-F_4 = IT_EKKO-WAERS.
    IT_1-F_5 = IT_EKKO-EBELN.
    IT_1-F_6 = IT_EKKO-AEDAT.
    IT_1-F_7 = IT_EKKO-LIFNR.
    IT_1-F_8 = IT_EKPO-TXZ01.
    IT_1-F_9 = IT_EKPO-MATNR.
    IT_1-F_10 = IT_EKPO-EBELP.
    IT_1-F_11 = IT_EKPO-MATKL.
    IT_1-F_12 = IT_EKPO-MENGE.
    IT_1-F_13 = IT_EKPO-MEINS.
    IT_1-F_14 = IT_EKPO-NETPR.
    IT_1-F_15 = IT_EKKN-ZEKKN.
    IT_1-F_16 = IT_EKKN-SAKTO.
    IT_1-F_17 = IT_EKKN-KOSTL.
    IT_1-F_18 = IT_SKA1-KTOPL.
    IT_1-F_19 = IT_SKA1-BILKT.
    IT_1-F_20 = IT_SKA1-SAKNR.
      IF D_LEN < 32000.
         D_PACK+D_OFFSET(199) = IT_1.
         D_OFFSET = D_OFFSET + 199.
         D_LEN = D_OFFSET + 199.
         CLEAR IT_1.
         REFRESH IT_1.
      ELSE.
         PERFORM SEND_RECORD USING D_PACK.
         D_PACK = IT_1.
         D_OFFSET = 199.
         D_LEN = D_OFFSET + 199.
      ENDIF.
CLEAR IT_SKA1.
REFRESH IT_SKA1.
ENDSELECT.
CLEAR IT_EKKN.
REFRESH IT_EKKN.
ENDSELECT.
CLEAR IT_EKPO.
REFRESH IT_EKPO.
ENDSELECT.
CLEAR IT_EKKO.
REFRESH IT_EKKO.
ENDSELECT.
PERFORM SEND_RECORD USING D_PACK.


ENDFORM.


*-------------------------------------------------------------------*
* Send one record to communication partner                          
*-------------------------------------------------------------------*
FORM SEND_RECORD USING P_REC_BUF.
    COMMUNICATION SEND ID COM_ID BUFFER P_REC_BUF LENGTH D_OFFSET.
    IF SY-SUBRC <> 0.
        COMMUNICATION DEALLOCATE ID COM_ID.
        EXIT.
    ENDIF.
ENDFORM.


*-------------------------------------------------------------------*
* Receive parameter sent from DataStage side                         
*-------------------------------------------------------------------*
FORM RECEIVE_PARAMETER.
DATA: PARAM(10)  TYPE C.
DATA: VALUE(100) TYPE C.
DATA: POS        TYPE I.
    COM_S = 0.
    WHILE COM_S = 0.
      COM_IN = ''.
      COMMUNICATION RECEIVE ID COM_ID BUFFER COM_IN DATAINFO COM_D
                    STATUSINFO COM_S
                    RECEIVED   COM_L.
      IF SY-SUBRC <> CM_OK AND SY-SUBRC <> CM_DEALLOCATED_NORMAL.
         EXIT.
      ENDIF.
      SEARCH COM_IN FOR '='.
      IF SY-SUBRC = 0.
         POS = SY-FDPOS.
         PARAM = COM_IN+0(POS).
         POS = POS + 1.
         VALUE = COM_IN+POS.
         IF PARAM = 'PARAM_1' OR PARAM = 'PARAM_1 '.
            PARAM_1 = VALUE.
         ENDIF.
         IF PARAM = 'PARAM_2' OR PARAM = 'PARAM_2 '.
            PARAM_2 = VALUE.
         ENDIF.
     ENDIF.
     ENDWHILE.
ENDFORM.
