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


REPORT ZORAINV.


* Step 1. Declare Table
TABLES:
     RBKP,
     RSEG,
     RBCO,
     EKPO.


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


DATA:  BEGIN OF IT_RSEG OCCURS 0.
         INCLUDE STRUCTURE RSEG.
DATA:  END OF IT_RSEG.


DATA:  BEGIN OF IT_RBCO OCCURS 0.
         INCLUDE STRUCTURE RBCO.
DATA:  END OF IT_RBCO.


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


* Step 3. Declare Structure
DATA:  BEGIN OF ST_1 OCCURS 1,
         F_1(15) TYPE C, " For RBKP-RMWWR,
         F_2(2) TYPE C, " For RBKP-BLART,
         F_3(10) TYPE C, " For RBKP-BELNR,
         F_4(4) TYPE C, " For RBKP-GJAHR,
         F_5(8) TYPE C, " For RBKP-BLDAT,
         F_6(8) TYPE C, " For RBKP-BUDAT,
         F_7(12) TYPE C, " For RBKP-USNAM,
         F_8(4) TYPE C, " For RBKP-BUKRS,
         F_9(10) TYPE C, " For RBKP-LIFNR,
         F_10(5) TYPE C, " For RBKP-WAERS,
         F_11(4) TYPE C, " For RBKP-ZTERM,
         F_12(25) TYPE C, " For RBKP-BKTXT,
         F_13(10) TYPE C, " For RSEG-BELNR,
         F_14(3) TYPE C, " For RSEG-MANDT,
         F_15(6) TYPE C, " For RSEG-BUZEI,
         F_16(10) TYPE C, " For RSEG-EBELN,
         F_17(5) TYPE C, " For RSEG-EBELP,
         F_18(2) TYPE C, " For RSEG-ZEKKN,
         F_19(18) TYPE C, " For RSEG-MATNR,
         F_20(4) TYPE C, " For RSEG-BUKRS,
         F_21(4) TYPE C, " For RSEG-WERKS,
         F_22(15) TYPE C, " For RSEG-WRBTR,
         F_23(15) TYPE C, " For RSEG-MENGE,
         F_24(3) TYPE C, " For RSEG-MEINS,
         F_25(4) TYPE C, " For RSEG-GJAHR,
         F_26(10) TYPE C, " For RSEG-LFBNR,
         F_27(3) TYPE C, " For RSEG-BSTME,
         F_28(4) TYPE C, " For RBCO-KOKRS,
         F_29(10) TYPE C, " For RBCO-KOSTL,
         F_30(10) TYPE C, " For RBCO-SAKNR,
         F_31(50) TYPE C, " For RBCO-SGTXT,
         F_32(15) TYPE C, " For RBCO-MENGE,
         F_33(2) TYPE C, " For RBCO-ZEKKN,
         F_34(9) TYPE C, " For EKPO-MATKL,
         F_35(18) TYPE C, " For EKPO-MATNR,
END OF ST_1.
DATA:  IT_1 LIKE ST_1 OCCURS 0 WITH HEADER LINE.
DATA:  IT_2 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 RBKP-BUDAT. " For DS_JOB_PARAM@FromInvoicePostingDate
DATA: PARAM_2 LIKE RBKP-BUDAT. " For DS_JOB_PARAM@ToInvoicePostingDate


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 + 337.
SELECT
    RMWWR
    BLART
    BELNR
    GJAHR
    BLDAT
    BUDAT
    USNAM
    BUKRS
    LIFNR
    WAERS
    ZTERM
    BKTXT
INTO (IT_RBKP-RMWWR,
      IT_RBKP-BLART,
      IT_RBKP-BELNR,
      IT_RBKP-GJAHR,
      IT_RBKP-BLDAT,
      IT_RBKP-BUDAT,
      IT_RBKP-USNAM,
      IT_RBKP-BUKRS,
      IT_RBKP-LIFNR,
      IT_RBKP-WAERS,
      IT_RBKP-ZTERM,
      IT_RBKP-BKTXT)
FROM RBKP
WHERE
BUDAT >= PARAM_1 AND

BUDAT <= PARAM_2.
    SELECT
        BELNR
        MANDT
        BUZEI
        EBELN
        EBELP
        ZEKKN
        MATNR
        BUKRS
        WERKS
        WRBTR
        MENGE
        MEINS
        GJAHR
        LFBNR
        BSTME
    INTO (IT_RSEG-BELNR,
          IT_RSEG-MANDT,
          IT_RSEG-BUZEI,
          IT_RSEG-EBELN,
          IT_RSEG-EBELP,
          IT_RSEG-ZEKKN,
          IT_RSEG-MATNR,
          IT_RSEG-BUKRS,
          IT_RSEG-WERKS,
          IT_RSEG-WRBTR,
          IT_RSEG-MENGE,
          IT_RSEG-MEINS,
          IT_RSEG-GJAHR,
          IT_RSEG-LFBNR,
          IT_RSEG-BSTME)
    FROM RSEG
    WHERE
    BELNR = IT_RBKP-BELNR AND

GJAHR = IT_RBKP-GJAHR.
    SELECT
        KOKRS
        KOSTL
        SAKNR
        SGTXT
        MENGE
        ZEKKN
    INTO (IT_RBCO-KOKRS,
          IT_RBCO-KOSTL,
          IT_RBCO-SAKNR,
          IT_RBCO-SGTXT,
          IT_RBCO-MENGE,
          IT_RBCO-ZEKKN)
    FROM RBCO
    WHERE
    BELNR = IT_RSEG-BELNR AND

GJAHR = IT_RSEG-GJAHR AND

BUZEI = IT_RSEG-BUZEI.
        IT_2-F_1 = IT_RBKP-RMWWR.
        IT_2-F_2 = IT_RBKP-BLART.
        IT_2-F_3 = IT_RBKP-BELNR.
        IT_2-F_4 = IT_RBKP-GJAHR.
        IT_2-F_5 = IT_RBKP-BLDAT.
        IT_2-F_6 = IT_RBKP-BUDAT.
        IT_2-F_7 = IT_RBKP-USNAM.
        IT_2-F_8 = IT_RBKP-BUKRS.
        IT_2-F_9 = IT_RBKP-LIFNR.
        IT_2-F_10 = IT_RBKP-WAERS.
        IT_2-F_11 = IT_RBKP-ZTERM.
        IT_2-F_12 = IT_RBKP-BKTXT.
        IT_2-F_13 = IT_RSEG-BELNR.
        IT_2-F_14 = IT_RSEG-MANDT.
        IT_2-F_15 = IT_RSEG-BUZEI.
        IT_2-F_16 = IT_RSEG-EBELN.
        IT_2-F_17 = IT_RSEG-EBELP.
        IT_2-F_18 = IT_RSEG-ZEKKN.
        IT_2-F_19 = IT_RSEG-MATNR.
        IT_2-F_20 = IT_RSEG-BUKRS.
        IT_2-F_21 = IT_RSEG-WERKS.
        IT_2-F_22 = IT_RSEG-WRBTR.
        IT_2-F_23 = IT_RSEG-MENGE.
        IT_2-F_24 = IT_RSEG-MEINS.
        IT_2-F_25 = IT_RSEG-GJAHR.
        IT_2-F_26 = IT_RSEG-LFBNR.
        IT_2-F_27 = IT_RSEG-BSTME.
        IT_2-F_28 = IT_RBCO-KOKRS.
        IT_2-F_29 = IT_RBCO-KOSTL.
        IT_2-F_30 = IT_RBCO-SAKNR.
        IT_2-F_31 = IT_RBCO-SGTXT.
        IT_2-F_32 = IT_RBCO-MENGE.
        IT_2-F_33 = IT_RBCO-ZEKKN.
        APPEND IT_2.
    ENDSELECT.
    SELECT
        MATKL
        MATNR
    INTO (IT_EKPO-MATKL,
          IT_EKPO-MATNR)
    FROM EKPO
    WHERE
    EBELN = IT_RSEG-EBELN AND

EBELP = IT_RSEG-EBELP.
        LOOP AT IT_2.
          IT_1 = IT_2.
          IT_1-F_34 = IT_EKPO-MATKL.
          IT_1-F_35 = IT_EKPO-MATNR.
      IF D_LEN < 32000.
              D_PACK+D_OFFSET(337) = IT_1.
              D_OFFSET = D_OFFSET + 337.
              D_LEN = D_OFFSET + 337.
              CLEAR IT_1.
              REFRESH IT_1.
           ELSE.
              PERFORM SEND_RECORD USING D_PACK.
              D_PACK = IT_1.
         D_OFFSET = 337.
              D_LEN = D_OFFSET + 337.
           ENDIF.
        ENDLOOP.
    ENDSELECT.
    ENDSELECT.
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.
