2007 Aug 02 5:19 PM
Hi,
I have written the most of the performance objects but my program is still taking more time can any one tell me how to improve my code performance .
below is the code
Thanks in Advance
************************************************************************
&----
REPORT Zbach NO STANDARD PAGE HEADING
LINE-SIZE 132.
INCLUDE ZBATCH_BDC.
INCLUDE ZBATCH_DAT.
START-OF-SELECTION.
select the deliveries that match the selection-criteria
IF P_ORI EQ 'X'. "DEVK940953
PERFORM 0100_SELECT_DATA.
ELSE. "DEVK940953
PERFORM 0110_SELECT_DATA. "DEVK940953
ENDIF. "DEVK940953
IF NOT ITAB[] IS INITIAL.
process the selected deliveries
LOOP AT ITAB.
CLEAR ITAB_CNT.
READ TABLE itab_cnt WITH KEY vbeln = itab-vbeln. "DEVK940953
READ TABLE ITAB_CNT WITH KEY VBELN = ITAB-VBELN "DEVK940953
BINARY SEARCH. "DEVK940953
IF ITAB_CNT-CNT NE 0.
PERFORM 0200_CHANGE_DELIVERY_DOC.
ENDIF.
CLEAR ITAB.
ENDLOOP.
PERFORM CLOSE_GROUP.
write error messages on the screen , if any
IF NOT ERRORTAB[] IS INITIAL.
LOOP AT ERRORTAB.
IF SY-TABIX EQ 1.
WRITE:/ 'Delivery', 20 'Reason for failure'.
ULINE.
ENDIF.
WRITE:/ ERRORTAB-VBELN, 20 ERRORTAB-ERROR_TEXT.
ENDLOOP.
ELSE.
LEAVE SCREEN.
ENDIF.
ENDIF.
&----
*& Form 0100_select_data
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0100_SELECT_DATA.
CLEAR ITAB.
REFRESH ITAB.
select the deliveries based on selection-criteria.
Select POS and Offstore deliveries.
Exclude Return deliveries in this program
SELECT VBELN LFART INTO TABLE ITAB FROM LIKP
WHERE VBELN IN S_VBELN
AND VSTEL IN S_VSTEL
AND WADAT IN S_WADAT
AND LFART IN ('ZJO','ZJRT','ZJLF'). "DEVK929268
select deliveries for which Goods issue is already done
IF NOT ITAB[] IS INITIAL.
SELECT VBELN FROM VBUK INTO TABLE ITAB_DEL
FOR ALL ENTRIES IN ITAB
WHERE VBELN = ITAB-VBELN
AND WBSTK = 'C'.
ENDIF.
delete deliveries in ITAB for which goods issue is done
LOOP AT ITAB_DEL.
DELETE ITAB WHERE VBELN = ITAB_DEL-VBELN.
ENDLOOP.
select the deliveries for which batch determination has already done
CLEAR ITAB_DEL.
REFRESH ITAB_DEL.
IF NOT ITAB[] IS INITIAL.
SELECT VBELN FROM LIPS INTO TABLE ITAB_DEL
FOR ALL ENTRIES IN ITAB
WHERE VBELN = ITAB-VBELN
AND CHARG NE SPACE.
ENDIF.
delete deliveries in ITAB for which batch determination is done
LOOP AT ITAB_DEL.
DELETE ITAB WHERE VBELN = ITAB_DEL-VBELN.
ENDLOOP.
select the number of items available for these deliveries
IF NOT ITAB[] IS INITIAL.
LOOP AT ITAB.
CLEAR V_CNT.
SELECT SINGLE COUNT( * ) INTO V_CNT FROM LIPS
WHERE VBELN = ITAB-VBELN.
ITAB_CNT-VBELN = ITAB-VBELN.
ITAB_CNT-CNT = V_CNT.
APPEND ITAB_CNT.
ENDLOOP.
ELSE.
WRITE:/ 'No deliveries found for the entered selection-criteria'.
ENDIF.
ENDFORM. " 0100_select_data
&----
*& Form 0110_select_data
&----
FORM 0110_SELECT_DATA.
DATA: LOCL_TABIX TYPE SYTABIX,
LOCL_INDEX TYPE SYTABIX,
LOCL_TFILL TYPE SYTFILL,
LOCL_SUBRC TYPE SYSUBRC.
SELECT T1~VBELN
T3~POSNR
T3~CHARG
T1~LFART
FROM LIKP AS T1
INNER JOIN VBUK AS T2
ON T1VBELN EQ T2VBELN
INNER JOIN LIPS AS T3
ON T1VBELN EQ T3VBELN
INTO TABLE GTBL_CHARG
WHERE T1~VBELN IN S_VBELN
AND T1~VSTEL IN S_VSTEL
AND T1~WADAT IN S_WADAT
AND T1~LFART IN ('ZJO','ZJRT','ZJLF')
AND T2~WBSTK NE 'C'
%_HINTS ORACLE 'index(likp "Z1")'.
GTAB_CHARG[] = GTBL_CHARG[].
DELETE GTAB_CHARG WHERE CHARG EQ ' '.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
READ TABLE GTAB_CHARG INTO GSTU_CHARG
WITH KEY VBELN = GSTR_CHARG-VBELN
BINARY SEARCH.
IF SY-SUBRC EQ 0.
DELETE GTBL_CHARG.
ENDIF.
ENDLOOP.
GTAB_CHARG[] = GTBL_CHARG[].
DELETE ADJACENT DUPLICATES FROM GTBL_CHARG
COMPARING VBELN.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
CLEAR: V_CNT.
READ TABLE GTAB_CHARG INTO GSTU_CHARG
WITH KEY VBELN = GSTR_CHARG-VBELN
BINARY SEARCH.
LOCL_SUBRC = SY-SUBRC.
LOCL_INDEX = SY-TABIX.
WHILE LOCL_SUBRC EQ 0.
V_CNT = V_CNT + 1.
LOCL_INDEX = LOCL_INDEX + 1.
READ TABLE GTAB_CHARG INTO GSTU_CHARG INDEX LOCL_INDEX.
LOCL_SUBRC = SY-SUBRC.
IF SY-SUBRC EQ 0.
IF GSTR_CHARG-VBELN NE GSTU_CHARG-VBELN.
LOCL_SUBRC = 4.
ENDIF.
ENDIF.
ENDWHILE.
ITAB_CNT-VBELN = GSTR_CHARG-VBELN.
ITAB_CNT-CNT = V_CNT.
APPEND ITAB_CNT.
ENDLOOP.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
MOVE-CORRESPONDING GSTR_CHARG TO ITAB.
APPEND ITAB.
ENDLOOP.
IF ITAB[] IS INITIAL. "DEVK940953
WRITE:/ 'No deliveries found for the entered selection-criteria'.
ENDIF. "DEVK940953
ENDFORM. " 0110_select_data
&----
*& Form 0200_change_delivery_doc
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0200_CHANGE_DELIVERY_DOC.
PERFORM 0210_PROCESS_INITIAL_SCREENS.
CLEAR CNTR.
WHILE CNTR LT ITAB_CNT-CNT.
CNTR = CNTR + 1.
CNTR_TEXT = CNTR.
PERFORM 0220_PROCESS_ITEM_DATA.
ENDWHILE.
PERFORM 0230_PROCESS_LAST_SCREENS.
ENDFORM. " 0200_change_delivery_doc
&----
*& Form 0210_process_initial_screens
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0210_PROCESS_INITIAL_SCREENS.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '0101'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'LIKP-VBELN'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=UEKO'.
PERFORM BDC_FIELD USING 'LIKP-VBELN'
ITAB-VBELN.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '0220'.
ENDFORM. " 0210_process_initial_screens
&----
*& Form 0220_process_item_data
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0220_PROCESS_ITEM_DATA.
perform bdc_field using 'BDC_OKCODE'
'=POPO'.
perform bdc_field using 'BDC_CURSOR'
'LIKP-BTGEW'.
perform bdc_dynpro using 'SAPMV50A' '0111'.
perform bdc_field using 'BDC_CURSOR'
'RV50A-POSNR'.
perform bdc_field using 'BDC_OKCODE'
'=POPO'.
perform bdc_field using 'RV50A-POSNR'
CNTR_TEXT.
perform bdc_dynpro using 'SAPMV50A' '0220'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-POSNR(01)'.
perform bdc_field using 'BDC_OKCODE'
'=CHSP'.
perform bdc_field using 'RV50A-LIPS_SELKZ(01)'
'X'.
perform bdc_dynpro using 'SAPMV50A' '0250'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-CHARG(01)'.
perform bdc_field using 'BDC_OKCODE'
'=CHSL'.
perform bdc_dynpro using 'SAPLBATC' '0001'.
perform bdc_field using 'BDC_CURSOR'
'LBATC-MATNR'.
perform bdc_field using 'BDC_OKCODE'
'=PICK'.
perform bdc_dynpro using 'SAPMV50A' '0250'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-LFIMG(01)'.
perform bdc_field using 'BDC_OKCODE'
'=BACK'.
perform bdc_dynpro using 'SAPMV50A' '0220'.
ENDFORM. " 0220_process_item_data
&----
*& Form 0230_process_last_screens
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0230_PROCESS_LAST_SCREENS.
IF ITAB-LFART EQ 'ZJRT' OR ITAB-LFART EQ 'ZJLF'. "DEVK929268
For Offstore deliveries, just save the delivery document
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=SICH'.
ELSEIF ITAB-LFART EQ 'ZJO'.
For POS deliveries, post the goods issue document. This automatically
saves the delivery document
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=WABU'.
ENDIF.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'LIKP-BTGEW'.
PERFORM BDC_TRANSACTION USING 'VL02'.
ENDFORM. " 0230_process_last_screens
----
Start new transaction according to parameters *
----
FORM BDC_TRANSACTION USING TCODE.
DATA: L_MSTRING(480).
DATA: L_SUBRC LIKE SY-SUBRC.
REFRESH MESSTAB.
CALL TRANSACTION TCODE USING BDCDATA
MODE CTUMODE
UPDATE CUPDATE
MESSAGES INTO MESSTAB.
L_SUBRC = SY-SUBRC.
IF L_SUBRC NE 0.
CLEAR V_IND.
LOOP AT MESSTAB.
SELECT SINGLE * FROM T100 WHERE SPRSL = MESSTAB-MSGSPRA
AND ARBGB = MESSTAB-MSGID
AND MSGNR = MESSTAB-MSGNR.
IF SY-SUBRC = 0.
L_MSTRING = T100-TEXT.
IF L_MSTRING CS '&1'.
REPLACE '&1' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&2' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&3' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&4' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ELSE.
REPLACE '&' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ENDIF.
CONDENSE L_MSTRING.
write: / messtab-msgtyp, l_mstring(250).
IF MESSTAB-MSGTYP = 'E'.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = L_MSTRING.
APPEND ERRORTAB.
V_IND = 'X'.
ENDIF.
ELSE.
write: / messtab.
IF MESSTAB-MSGTYP = 'E'.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = 'Unknown'.
APPEND ERRORTAB.
V_IND = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
IF V_IND IS INITIAL.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = 'Unknown'.
APPEND ERRORTAB.
ENDIF.
ELSE.
write:/ 'Goods issue document created successfully for ', itab-vbeln.
ENDIF.
SKIP.
Erzeugen fehlermappe ************************************************
IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
IF E_GROUP_OPENED = ' '.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = E_GROUP
USER = E_USER
KEEP = E_KEEP
HOLDDATE = E_HDATE.
E_GROUP_OPENED = 'X'.
ENDIF.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TCODE
TABLES
DYNPROTAB = BDCDATA.
ENDIF.
REFRESH BDCDATA.
ENDFORM.
Hi,
I have written the most of the performance objects but my program is still taking more time can any one tell me how to improve my code performance .
below is the code
Thanks in Advance
************************************************************************
&----
REPORT Zbach NO STANDARD PAGE HEADING
LINE-SIZE 132.
INCLUDE ZBATCH_BDC.
INCLUDE ZBATCH_DAT.
START-OF-SELECTION.
select the deliveries that match the selection-criteria
IF P_ORI EQ 'X'. "DEVK940953
PERFORM 0100_SELECT_DATA.
ELSE. "DEVK940953
PERFORM 0110_SELECT_DATA. "DEVK940953
ENDIF. "DEVK940953
IF NOT ITAB[] IS INITIAL.
process the selected deliveries
LOOP AT ITAB.
CLEAR ITAB_CNT.
READ TABLE itab_cnt WITH KEY vbeln = itab-vbeln. "DEVK940953
READ TABLE ITAB_CNT WITH KEY VBELN = ITAB-VBELN "DEVK940953
BINARY SEARCH. "DEVK940953
IF ITAB_CNT-CNT NE 0.
PERFORM 0200_CHANGE_DELIVERY_DOC.
ENDIF.
CLEAR ITAB.
ENDLOOP.
PERFORM CLOSE_GROUP.
write error messages on the screen , if any
IF NOT ERRORTAB[] IS INITIAL.
LOOP AT ERRORTAB.
IF SY-TABIX EQ 1.
WRITE:/ 'Delivery', 20 'Reason for failure'.
ULINE.
ENDIF.
WRITE:/ ERRORTAB-VBELN, 20 ERRORTAB-ERROR_TEXT.
ENDLOOP.
ELSE.
LEAVE SCREEN.
ENDIF.
ENDIF.
&----
*& Form 0100_select_data
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0100_SELECT_DATA.
CLEAR ITAB.
REFRESH ITAB.
select the deliveries based on selection-criteria.
Select POS and Offstore deliveries.
Exclude Return deliveries in this program
SELECT VBELN LFART INTO TABLE ITAB FROM LIKP
WHERE VBELN IN S_VBELN
AND VSTEL IN S_VSTEL
AND WADAT IN S_WADAT
AND LFART IN ('ZJO','ZJRT','ZJLF'). "DEVK929268
select deliveries for which Goods issue is already done
IF NOT ITAB[] IS INITIAL.
SELECT VBELN FROM VBUK INTO TABLE ITAB_DEL
FOR ALL ENTRIES IN ITAB
WHERE VBELN = ITAB-VBELN
AND WBSTK = 'C'.
ENDIF.
delete deliveries in ITAB for which goods issue is done
LOOP AT ITAB_DEL.
DELETE ITAB WHERE VBELN = ITAB_DEL-VBELN.
ENDLOOP.
select the deliveries for which batch determination has already done
CLEAR ITAB_DEL.
REFRESH ITAB_DEL.
IF NOT ITAB[] IS INITIAL.
SELECT VBELN FROM LIPS INTO TABLE ITAB_DEL
FOR ALL ENTRIES IN ITAB
WHERE VBELN = ITAB-VBELN
AND CHARG NE SPACE.
ENDIF.
delete deliveries in ITAB for which batch determination is done
LOOP AT ITAB_DEL.
DELETE ITAB WHERE VBELN = ITAB_DEL-VBELN.
ENDLOOP.
select the number of items available for these deliveries
IF NOT ITAB[] IS INITIAL.
LOOP AT ITAB.
CLEAR V_CNT.
SELECT SINGLE COUNT( * ) INTO V_CNT FROM LIPS
WHERE VBELN = ITAB-VBELN.
ITAB_CNT-VBELN = ITAB-VBELN.
ITAB_CNT-CNT = V_CNT.
APPEND ITAB_CNT.
ENDLOOP.
ELSE.
WRITE:/ 'No deliveries found for the entered selection-criteria'.
ENDIF.
ENDFORM. " 0100_select_data
&----
*& Form 0110_select_data
&----
FORM 0110_SELECT_DATA.
DATA: LOCL_TABIX TYPE SYTABIX,
LOCL_INDEX TYPE SYTABIX,
LOCL_TFILL TYPE SYTFILL,
LOCL_SUBRC TYPE SYSUBRC.
SELECT T1~VBELN
T3~POSNR
T3~CHARG
T1~LFART
FROM LIKP AS T1
INNER JOIN VBUK AS T2
ON T1VBELN EQ T2VBELN
INNER JOIN LIPS AS T3
ON T1VBELN EQ T3VBELN
INTO TABLE GTBL_CHARG
WHERE T1~VBELN IN S_VBELN
AND T1~VSTEL IN S_VSTEL
AND T1~WADAT IN S_WADAT
AND T1~LFART IN ('ZJO','ZJRT','ZJLF')
AND T2~WBSTK NE 'C'
%_HINTS ORACLE 'index(likp "Z1")'.
GTAB_CHARG[] = GTBL_CHARG[].
DELETE GTAB_CHARG WHERE CHARG EQ ' '.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
READ TABLE GTAB_CHARG INTO GSTU_CHARG
WITH KEY VBELN = GSTR_CHARG-VBELN
BINARY SEARCH.
IF SY-SUBRC EQ 0.
DELETE GTBL_CHARG.
ENDIF.
ENDLOOP.
GTAB_CHARG[] = GTBL_CHARG[].
DELETE ADJACENT DUPLICATES FROM GTBL_CHARG
COMPARING VBELN.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
CLEAR: V_CNT.
READ TABLE GTAB_CHARG INTO GSTU_CHARG
WITH KEY VBELN = GSTR_CHARG-VBELN
BINARY SEARCH.
LOCL_SUBRC = SY-SUBRC.
LOCL_INDEX = SY-TABIX.
WHILE LOCL_SUBRC EQ 0.
V_CNT = V_CNT + 1.
LOCL_INDEX = LOCL_INDEX + 1.
READ TABLE GTAB_CHARG INTO GSTU_CHARG INDEX LOCL_INDEX.
LOCL_SUBRC = SY-SUBRC.
IF SY-SUBRC EQ 0.
IF GSTR_CHARG-VBELN NE GSTU_CHARG-VBELN.
LOCL_SUBRC = 4.
ENDIF.
ENDIF.
ENDWHILE.
ITAB_CNT-VBELN = GSTR_CHARG-VBELN.
ITAB_CNT-CNT = V_CNT.
APPEND ITAB_CNT.
ENDLOOP.
LOOP AT GTBL_CHARG INTO GSTR_CHARG.
MOVE-CORRESPONDING GSTR_CHARG TO ITAB.
APPEND ITAB.
ENDLOOP.
IF ITAB[] IS INITIAL. "DEVK940953
WRITE:/ 'No deliveries found for the entered selection-criteria'.
ENDIF. "DEVK940953
ENDFORM. " 0110_select_data
&----
*& Form 0200_change_delivery_doc
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0200_CHANGE_DELIVERY_DOC.
PERFORM 0210_PROCESS_INITIAL_SCREENS.
CLEAR CNTR.
WHILE CNTR LT ITAB_CNT-CNT.
CNTR = CNTR + 1.
CNTR_TEXT = CNTR.
PERFORM 0220_PROCESS_ITEM_DATA.
ENDWHILE.
PERFORM 0230_PROCESS_LAST_SCREENS.
ENDFORM. " 0200_change_delivery_doc
&----
*& Form 0210_process_initial_screens
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0210_PROCESS_INITIAL_SCREENS.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '0101'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'LIKP-VBELN'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=UEKO'.
PERFORM BDC_FIELD USING 'LIKP-VBELN'
ITAB-VBELN.
PERFORM BDC_DYNPRO USING 'SAPMV50A' '0220'.
ENDFORM. " 0210_process_initial_screens
&----
*& Form 0220_process_item_data
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0220_PROCESS_ITEM_DATA.
perform bdc_field using 'BDC_OKCODE'
'=POPO'.
perform bdc_field using 'BDC_CURSOR'
'LIKP-BTGEW'.
perform bdc_dynpro using 'SAPMV50A' '0111'.
perform bdc_field using 'BDC_CURSOR'
'RV50A-POSNR'.
perform bdc_field using 'BDC_OKCODE'
'=POPO'.
perform bdc_field using 'RV50A-POSNR'
CNTR_TEXT.
perform bdc_dynpro using 'SAPMV50A' '0220'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-POSNR(01)'.
perform bdc_field using 'BDC_OKCODE'
'=CHSP'.
perform bdc_field using 'RV50A-LIPS_SELKZ(01)'
'X'.
perform bdc_dynpro using 'SAPMV50A' '0250'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-CHARG(01)'.
perform bdc_field using 'BDC_OKCODE'
'=CHSL'.
perform bdc_dynpro using 'SAPLBATC' '0001'.
perform bdc_field using 'BDC_CURSOR'
'LBATC-MATNR'.
perform bdc_field using 'BDC_OKCODE'
'=PICK'.
perform bdc_dynpro using 'SAPMV50A' '0250'.
perform bdc_field using 'BDC_CURSOR'
'LIPS-LFIMG(01)'.
perform bdc_field using 'BDC_OKCODE'
'=BACK'.
perform bdc_dynpro using 'SAPMV50A' '0220'.
ENDFORM. " 0220_process_item_data
&----
*& Form 0230_process_last_screens
&----
text
----
--> p1 text
<-- p2 text
----
FORM 0230_PROCESS_LAST_SCREENS.
IF ITAB-LFART EQ 'ZJRT' OR ITAB-LFART EQ 'ZJLF'. "DEVK929268
For Offstore deliveries, just save the delivery document
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=SICH'.
ELSEIF ITAB-LFART EQ 'ZJO'.
For POS deliveries, post the goods issue document. This automatically
saves the delivery document
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=WABU'.
ENDIF.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'LIKP-BTGEW'.
PERFORM BDC_TRANSACTION USING 'VL02'.
ENDFORM. " 0230_process_last_screens
----
Start new transaction according to parameters *
----
FORM BDC_TRANSACTION USING TCODE.
DATA: L_MSTRING(480).
DATA: L_SUBRC LIKE SY-SUBRC.
REFRESH MESSTAB.
CALL TRANSACTION TCODE USING BDCDATA
MODE CTUMODE
UPDATE CUPDATE
MESSAGES INTO MESSTAB.
L_SUBRC = SY-SUBRC.
IF L_SUBRC NE 0.
CLEAR V_IND.
LOOP AT MESSTAB.
SELECT SINGLE * FROM T100 WHERE SPRSL = MESSTAB-MSGSPRA
AND ARBGB = MESSTAB-MSGID
AND MSGNR = MESSTAB-MSGNR.
IF SY-SUBRC = 0.
L_MSTRING = T100-TEXT.
IF L_MSTRING CS '&1'.
REPLACE '&1' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&2' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&3' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&4' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ELSE.
REPLACE '&' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ENDIF.
CONDENSE L_MSTRING.
write: / messtab-msgtyp, l_mstring(250).
IF MESSTAB-MSGTYP = 'E'.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = L_MSTRING.
APPEND ERRORTAB.
V_IND = 'X'.
ENDIF.
ELSE.
write: / messtab.
IF MESSTAB-MSGTYP = 'E'.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = 'Unknown'.
APPEND ERRORTAB.
V_IND = 'X'.
ENDIF.
ENDIF.
ENDLOOP.
IF V_IND IS INITIAL.
ERRORTAB-VBELN = ITAB-VBELN.
ERRORTAB-ERROR_TEXT = 'Unknown'.
APPEND ERRORTAB.
ENDIF.
ELSE.
write:/ 'Goods issue document created successfully for ', itab-vbeln.
ENDIF.
SKIP.
Erzeugen fehlermappe ************************************************
IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
IF E_GROUP_OPENED = ' '.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = E_GROUP
USER = E_USER
KEEP = E_KEEP
HOLDDATE = E_HDATE.
E_GROUP_OPENED = 'X'.
ENDIF.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TCODE
TABLES
DYNPROTAB = BDCDATA.
ENDIF.
REFRESH BDCDATA.
ENDFORM.
2007 Aug 02 6:47 PM
The code generally looks OK. (I especially like the way you are using binary searches and indexed reads. Where'd you hear about that;)
A few ideas - make sure s_vbeln is populated before using it in SELECTs.
You're not asking, but I don't think the following code works:
* select deliveries for which Goods issue is already done
IF NOT itab[] IS INITIAL.
SELECT vbeln FROM vbuk INTO TABLE itab_del
FOR ALL ENTRIES IN itab
WHERE vbeln = itab-vbeln
AND wbstk = 'C'.
ENDIF.
* delete deliveries in ITAB for which goods issue is done
LOOP AT itab_del.
DELETE itab WHERE vbeln = itab_del-vbeln.
ENDLOOP.
This will only delete entries from itab where vbeln = itab_del-vbeln (the value in the header area - <b>not</b> all entries in the table).
I wouldn't be surprised if most of the time is taken up with the CALL TRANSACTION. If so, it's out of your hands.
Have you done a performance trace (ST05) to see where the bottleneck is?
Rob
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |