*-------------------------------------------------------------------*
* Report Name: ZGLDESC
* Generated At: Thursday, April 21, 2005 11:38:06
* CPI-C Special Notes:
* 1) To execute this job, user type must be CPI-c.
* 2) Add communication partner in TXCOM using SM54.
*-------------------------------------------------------------------*


REPORT ZGLDESC.


* Step 1. Declare Table
TABLES:
     SKAT.


* Step 2. Declare Structure
DATA:  BEGIN OF ST_1 OCCURS 1,
         F_1(4) TYPE C, " For SKAT~KTOPL,
         F_2(10) TYPE C, " For SKAT~SAKNR,
         F_3(50) TYPE C, " For SKAT~TXT50,
END OF ST_1.
DATA:  IT_1 LIKE ST_1 OCCURS 0 WITH HEADER LINE.


* Declare Structure for INTO clause
DATA:  BEGIN OF ST_2 OCCURS 1,
         F_1 LIKE SKAT-KTOPL, " For SKAT~KTOPL,
         F_2 LIKE SKAT-SAKNR, " For SKAT~SAKNR,
         F_3 LIKE SKAT-TXT50, " For SKAT~TXT50,
END OF ST_2.


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


* Step 4. 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 SKAT-SPRAS. " For DS_JOB_PARAM@SAPExtractLangCode


EXIT.


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


FORM CPIC.
* Step 5. 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 + 64.
CLEAR IT_1.
REFRESH IT_1.
SELECT

      SKAT~KTOPL 

      SKAT~SAKNR 

      SKAT~TXT50

INTO (ST_2-F_1,
      ST_2-F_2,
      ST_2-F_3)
FROM

SKAT AS SKAT

WHERE

SKAT~SPRAS = PARAM_1.
 IT_1-F_1 = ST_2-F_1. 
 IT_1-F_2 = ST_2-F_2. 
 IT_1-F_3 = ST_2-F_3. 
      IF D_LEN < 32000.
         D_PACK+D_OFFSET(64) = IT_1.
         D_OFFSET = D_OFFSET + 64.
         D_LEN = D_OFFSET + 64.
         CLEAR IT_1.
         REFRESH IT_1.
      ELSE.
         PERFORM SEND_RECORD USING D_PACK.
         D_PACK = IT_1.
         D_OFFSET = 64.
         D_LEN = D_OFFSET + 64.
      ENDIF.
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.
     ENDIF.
     ENDWHILE.
ENDFORM.
