Posted: Tue Sep 09, 2008 4:52 pm Post subject: Adding Comment Lines to a Delivery Document
Explode Load Items on a Delivery - for purpose of adding Comment Lines to a Delivery Document
Code:
REPORT ZPROJDEL MESSAGE-ID ZZ NO STANDARD PAGE HEADING
LINE-SIZE 132 LINE-COUNT 65.
TABLES: LIKP, LIPS, MAST, MAKT, MARA, MVKE.
PARAMETERS: DELNOTE LIKE LIKP-VBELN MATCHCODE OBJECT VMVL.
*Select Text 'E' Delivery Note Number
DATA: BEGIN OF MATTAB OCCURS 100.
INCLUDE STRUCTURE STPO_API02.
DATA: END OF MATTAB.
DATA: BEGIN OF TAB OCCURS 100,
ITEMNO TYPE P,
LEVELNO TYPE P,
MATNR LIKE LIPS-MATNR,
VKORG LIKE LIKP-VKORG,
VTWEG LIKE LIPS-VTWEG,
WERKS LIKE LIPS-WERKS,
QTY LIKE LIPS-LFIMG,
COMMENT(20),
ALREADY-EXPLODED,
END OF TAB.
DATA: BEGIN OF TAB2 OCCURS 100.
INCLUDE STRUCTURE TAB.
DATA: END OF TAB2.
DATA: BEGIN OF PROCESSTAB OCCURS 100,
MATNR LIKE TAB-MATNR,
QTY LIKE TAB-QTY,
END OF PROCESSTAB.
DATA: TLINE(130).
DATA: OFFSET(3) TYPE N.
DATA: LEVELNO LIKE TAB-LEVELNO VALUE 0.
DATA: ITEMNO LIKE TAB-ITEMNO VALUE 0.
DATA: EXPLODE-AGAIN VALUE 'Y'.
DATA: NUMLINES TYPE P.
DATA: MARKFIELD.
DATA: REC_COUNT TYPE P.
DATA: REC_PROCESSED LIKE REC_COUNT.
DATA: REC_ERRORS LIKE REC_COUNT.
DATA: SESNAME(12) VALUE ' '.
DATA: SESNAME_ERR(12) VALUE 'PROJDEL'.
DATA: TMODE_BD VALUE ' '.
DATA: TMODE_CT VALUE 'X'.
DATA: DSPL-DATE(10).
DATA: TCODE(4),
TMP-MATNR LIKE LIPS-MATNR,
SPECIALVAL(4) VALUE 'ZDLX',
BAD-RECORD(1) VALUE 'N',
UPMODE VALUE 'N',
COMMIT_FREQUENCY TYPE I VALUE 100,
COMMIT_CHECK TYPE I,
LOAD_MODE_BD TYPE I VALUE 1,
LOAD_MODE_CT TYPE I VALUE 2,
LOAD_MODE TYPE N.
DATA: BEGIN OF COUNTS OCCURS 200,
TYPE(30),
INPUT LIKE REC_COUNT,
GOOD LIKE REC_COUNT,
BAD LIKE REC_COUNT,
END OF COUNTS.
SELECTION-SCREEN SKIP.
PARAMETERS:
UPMODE_N RADIOBUTTON GROUP UPMD,
*SELTEXT*E* "Screen MODE - See NOTHING"
UPMODE_A RADIOBUTTON GROUP UPMD,
*SELTEXT*E* "Screen MODE - See ALL"
UPMODE_E DEFAULT 'X' RADIOBUTTON GROUP UPMD.
*SELTEXT*E* "Screen MODE - ERRORS Only"
DATA: BEGIN OF BDC_TAB OCCURS 10.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDC_TAB.
AT SELECTION-SCREEN.
IF SESNAME IS INITIAL AND TMODE_BD EQ 'X'.
MESSAGE E999 WITH
'BDC Flag set but no BDC Session Name provided.'.
EXIT.
ENDIF.
IF SESNAME GT SPACE AND TMODE_CT EQ 'X'.
CLEAR SESNAME.
MESSAGE W999 WITH
'Call Trans Flag set. BDC Session Name ignored.'.
EXIT.
ENDIF.
START-OF-SELECTION.
*---------------------------------------------------------------------*
* perform check-tcode-authority using 'SE38'.
IF UPMODE_A EQ 'X'.
UPMODE = 'A'. " If CALL Transaction - Show All Screens
ELSEIF UPMODE_N EQ 'X'.
UPMODE = 'N'. " - Show Nothing
ELSEIF UPMODE_E EQ 'X'.
UPMODE = 'E'. " - Show Only Errors
ENDIF.
if not sy-batch is initial.
move 'N' to upmode.
endif.
if sesname is initial.
load_mode = load_mode_ct.
else.
load_mode = load_mode_bd.
endif.
PERFORM CREATE-REPORT.
*---------------------------------------------------------------------*
* FORM CREATE-REPORT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM CREATE-REPORT.
SELECT SINGLE * FROM LIKP WHERE VBELN EQ DELNOTE.
IF SY-SUBRC NE 0.
MESSAGE E999 WITH 'Delivery Note' DELNOTE 'Does Not Exist'.
ENDIF.
REFRESH TAB.
SELECT * FROM LIPS WHERE VBELN EQ LIKP-VBELN.
IF LIPS-PSTYV EQ SPECIALVAL.
MESSAGE E999 WITH 'Delivery Line' DELNOTE LIPS-POSNR
'is prepared for Packing'.
ENDIF.
CLEAR TAB.
MOVE LIPS-MATNR TO TAB-MATNR.
MOVE LIPS-WERKS TO TAB-WERKS.
MOVE LIKP-VKORG TO TAB-VKORG.
MOVE LIPS-VTWEG TO TAB-VTWEG.
MOVE LIPS-LFIMG TO TAB-QTY.
MOVE 1 TO TAB-ITEMNO.
MOVE 1 TO TAB-LEVELNO.
MOVE 'N' TO TAB-ALREADY-EXPLODED.
IF NOT TAB-MATNR IS INITIAL.
APPEND TAB.
ENDIF.
ENDSELECT.
WHILE EXPLODE-AGAIN EQ 'Y'.
REFRESH TAB2.
MOVE 'N' TO EXPLODE-AGAIN.
LOOP AT TAB.
REFRESH MATTAB.
SELECT * FROM MAST WHERE MATNR EQ TAB-MATNR "Determine if BOM
AND WERKS EQ LIPS-WERKS " in Current Plant
AND STLAN EQ '1'
AND STLAL EQ '01'.
MOVE LIPS-WERKS TO TAB-WERKS.
ENDSELECT.
IF SY-SUBRC NE 0.
SELECT * FROM MAST WHERE MATNR EQ TAB-MATNR "If NOT -
AND STLAN EQ '1' "get a Plant
AND STLAL EQ '01'.
MOVE MAST-WERKS TO TAB-WERKS.
EXIT.
ENDSELECT.
ENDIF.
IF TAB-ALREADY-EXPLODED EQ 'N'.
WRITE TAB-MATNR TO TMP-MATNR.
CALL FUNCTION 'CSAP_MAT_BOM_READ'
EXPORTING
MATERIAL = TMP-MATNR
PLANT = TAB-WERKS
BOM_USAGE = '1'
ALTERNATIVE = ' '
TABLES
T_STPO = MATTAB
EXCEPTIONS
ERROR = 1
OTHERS = 2.
DESCRIBE TABLE MATTAB LINES NUMLINES.
IF NUMLINES NE 0.
MOVE 'Y' TO EXPLODE-AGAIN.
ENDIF.
ENDIF.
CLEAR TAB2.
MOVE-CORRESPONDING TAB TO TAB2.
TAB2-ITEMNO = TAB2-ITEMNO + 1.
MOVE 'Y' TO TAB2-ALREADY-EXPLODED.
APPEND TAB2.
LOOP AT MATTAB.
CLEAR TAB2.
MOVE-CORRESPONDING TAB TO TAB2.
* move mattab-component to tab2-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = MATTAB-COMPONENT
IMPORTING
OUTPUT = TAB2-MATNR
EXCEPTIONS
OTHERS = 1.
TAB2-QTY = TAB2-QTY * MATTAB-COMP_QTY.
TAB2-LEVELNO = TAB2-LEVELNO + 1.
ITEMNO = ITEMNO + 1.
MOVE ITEMNO TO TAB2-ITEMNO.
MOVE 'N' TO TAB2-ALREADY-EXPLODED.
IF NOT TAB2-MATNR IS INITIAL.
APPEND TAB2.
ENDIF.
ENDLOOP.
ENDLOOP.
REFRESH TAB.
LOOP AT TAB2.
MOVE-CORRESPONDING TAB2 TO TAB.
APPEND TAB.
ENDLOOP.
ENDWHILE.
LOOP AT TAB2.
CLEAR MARA.
CLEAR MARKFIELD.
SELECT SINGLE * FROM MARA WHERE MATNR EQ TAB2-MATNR.
IF MARA-MAGRV EQ '9001'. "Only for SPECIAL Types
SELECT SINGLE * FROM MVKE WHERE MATNR EQ TAB2-MATNR
AND VKORG EQ TAB2-VKORG
AND VTWEG EQ TAB2-VTWEG.
IF SY-SUBRC EQ 0.
PERFORM PRINT-TLINE.
MOVE 'X' TO MARKFIELD.
WRITE: / MARKFIELD AS CHECKBOX, TLINE.
HIDE TAB2-MATNR.
HIDE TAB2-QTY.
ELSE.
MOVE 'NOT SALEABLE' TO TAB2-COMMENT.
PERFORM PRINT-TLINE.
WRITE: / ' ', TLINE.
HIDE TAB2-MATNR.
HIDE TAB2-QTY.
ENDIF.
ELSE.
PERFORM PRINT-TLINE.
WRITE: / ' ', TLINE.
HIDE TAB2-MATNR.
HIDE TAB2-QTY.
ENDIF.
SKIP.
ENDLOOP.
SET PF-STATUS 'BASE'.
ENDFORM.
*---------------------------------------------------------------------*
* FORM PRINT-TLINE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM PRINT-TLINE.
CLEAR TLINE.
CLEAR OFFSET.
DO TAB2-LEVELNO TIMES.
WRITE ' ' TO TLINE+OFFSET(1).
ADD 1 TO OFFSET.
ENDDO.
WRITE TAB2-MATNR TO TLINE+OFFSET(18).
MOVE 65 TO OFFSET.
WRITE TAB2-QTY TO TLINE+OFFSET(17).
ADD 17 TO OFFSET.
CLEAR MAKT.
SELECT SINGLE * FROM MAKT WHERE MATNR EQ TAB2-MATNR
AND SPRAS EQ SY-LANGU.
WRITE MAKT-MAKTX TO TLINE+OFFSET(40).
ADD 17 TO OFFSET.
WRITE TAB2-COMMENT TO TLINE+OFFSET(20).
ADD 20 TO OFFSET.
ENDFORM.
*---------------------------------------------------------------------*
* FORM MAINLINE_INPUT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM MAINLINE_INPUT.
if load_mode eq load_mode_bd.
perFORM open_bdc_session using sesname.
endif.
PERFORM PROCESS_DATA.
if not sesname is INITIAL.
perform close_bdc_session.
endif.
NEW-PAGE.
ULINE.
IF LOAD_MODE EQ LOAD_MODE_BD.
WRITE: / 'Data loaded into BDC Session'.
ELSE.
WRITE: / 'Data loaded using Call Transaction'.
ENDIF.
ULINE.
WRITE: / REC_COUNT, 'Generated SAP Change records'.
WRITE: / REC_PROCESSED, 'Records Processed'.
WRITE: / REC_ERRORS, 'Records processed in ERROR'.
IF LOAD_MODE EQ LOAD_MODE_BD.
WRITE: / 'MUST MANUALLY Process Batch Input Session=', SESNAME.
ENDIF.
IF REC_ERRORS GT 0.
WRITE: / '****************************************'.
WRITE: / 'Not ALL of the Data Process Successfully'.
WRITE: / 'You can MANUALLY Process Batch Input Session=',
SESNAME_ERR.
WRITE: / 'To Update the Remaining Unprocessed Data'.
WRITE: / '****************************************'.
ENDIF.
ULINE.
ENDFORM.
*---------------------------------------------------------------------*
* FORM PROCESS_DATA *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM PROCESS_DATA.
DATA:
COMMIT_CHECK TYPE I.
LOOP AT PROCESSTAB.
PERFORM PROCESS-REC.
COMMIT_CHECK = REC_COUNT MOD COMMIT_FREQUENCY.
IF COMMIT_CHECK EQ 0.
COMMIT WORK.
ENDIF.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM PROCESS-REC *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM PROCESS-REC.
ADD 1 TO REC_COUNT.
MOVE 'VL02' TO TCODE.
PERFORM GENERATE_BDC.
PERFORM PROCESS_BDC_DATA.
IF LOAD_MODE EQ LOAD_MODE_CT.
IF SY-SUBRC NE 0.
WRITE: / 'Did not Process in BDC',
'Material', PROCESSTAB-MATNR.
PERFORM WRITE_TRANSACTION_MSG.
PERFORM PROCES_CALL_TRANSACTION_ERROR.
ADD 1 TO REC_ERRORS.
ELSE.
PERFORM WRITE_TRANSACTION_MSG.
ADD 1 TO REC_PROCESSED.
ENDIF.
ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* FORM GENERATE_BDC *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM GENERATE_BDC.
DATA: TMP-MATNR LIKE MARA-MATNR.
DATA: TMP-QTY(17).
REFRESH BDC_TAB.
PERFORM ADD_BDC_SCREEN USING 'SAPMV50A' '0101' 'X'.
PERFORM ADD_BDC_FIELD USING 'LIKP-VBELN' LIKP-VBELN.
PERFORM ADD_BDC_OKCODE USING 'UELG'.
PERFORM ADD_BDC_SCREEN USING 'SAPMV50A' '0210' 'X'.
PERFORM ADD_BDC_OKCODE USING 'POAN'.
PERFORM ADD_BDC_SCREEN USING 'SAPMV50A' '0210' 'X'.
WRITE PROCESSTAB-MATNR TO TMP-MATNR.
PERFORM ADD_BDC_FIELD USING 'LIPS-MATNR(5)' TMP-MATNR.
WRITE PROCESSTAB-QTY TO TMP-QTY.
PERFORM ADD_BDC_FIELD USING 'LIPSD-G_LFIMG(5)' TMP-QTY.
PERFORM ADD_BDC_FIELD USING 'LIPS-PSTYV(5)' SPECIALVAL.
PERFORM ADD_BDC_OKCODE USING '/11'.
PERFORM ADD_BDC_SCREEN USING 'SAPMV50A' '0210' 'X'.
PERFORM ADD_BDC_OKCODE USING 'SICH'.
ENDFORM.
AT USER-COMMAND.
CASE SY-UCOMM.
WHEN 'PROC'.
REFRESH PROCESSTAB.
SET PF-STATUS 'PROC'.
DO.
CLEAR MARKFIELD.
CLEAR TAB2-MATNR.
CLEAR TAB2-QTY.
READ LINE SY-INDEX FIELD VALUE MARKFIELD.
IF SY-SUBRC > 0.
EXIT.
ENDIF.
CHECK MARKFIELD NE SPACE.
MOVE TAB2-MATNR TO PROCESSTAB-MATNR.
MOVE TAB2-QTY TO PROCESSTAB-QTY.
COLLECT PROCESSTAB.
MODIFY CURRENT LINE
FIELD VALUE
MARKFIELD FROM SPACE.
ENDDO.
PERFORM MAINLINE_INPUT.
WHEN 'SALL'.
DO.
CLEAR MARKFIELD.
READ LINE SY-INDEX FIELD VALUE MARKFIELD.
IF SY-SUBRC > 0.
EXIT.
ENDIF.
MODIFY CURRENT LINE
FIELD VALUE
MARKFIELD FROM 'X'.
ENDDO.
WHEN 'UALL'.
DO.
CLEAR MARKFIELD.
READ LINE SY-INDEX FIELD VALUE MARKFIELD.
IF SY-SUBRC > 0.
EXIT.
ENDIF.
MODIFY CURRENT LINE
FIELD VALUE
MARKFIELD FROM SPACE.
ENDDO.
WHEN 'REFR'.
PERFORM CREATE-REPORT.
WHEN OTHERS.
SET PF-STATUS 'BASE'.
ENDCASE.
INCLUDE ZCONINC5.
INCLUDE ZCONINC3.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.