Go on link..

link us with ...

Showing posts with label BDC Report. Show all posts
Showing posts with label BDC Report. Show all posts

Monday, January 3, 2011

BDC with TCODE f-02

Please refer the program RFBISA00. And also attaching a sample code for that.
REPORT Zf02 MESSAGE-ID Z1.
TABLES: T001, "Company Codes SKB1, "GL Account Master (Company Code)
AUFK, "Order Master data BKPF, "Document Header Table
ZMETA, "Meta Table used for messaging
TCURC, "Currency Check Table TGSB, "Check table for business area
T100. "Message Table ************************************************************************ *
Input table to load Interface File
DATA: BEGIN OF INFILE OCCURS 0,
REC_TYPE(01) TYPE C,
POST_KEY(02) TYPE C,
FILL_01(08) TYPE C, ACCNT(10) TYPE C, FILL_02(04) TYPE C, AMOUNT(16) TYPE C, BUSINESS_AREA(03) TYPE C, FILL_03(06) TYPE C, SPECIAL_GL(01) TYPE C, FILL_04(05) TYPE C, ORDER(10) TYPE C, FILL_05(25) TYPE C, TEXT(50) TYPE C, FILL_07(65) TYPE C, DUE_ON_DATE(8) TYPE C, DOLLAR_AMT TYPE P DECIMALS 2, SORT_FIELD(13) TYPE C, FILL_06(05) TYPE C, END OF INFILE. DATA: BEGIN OF BA_CNT_TAB OCCURS 5, BUSINESS_AREA(04) TYPE C, REC_CNT TYPE I, DOLLAR_AMT TYPE P DECIMALS 2, DEBIT_ACCUM TYPE P DECIMALS 2, CREDIT_ACCUM TYPE P DECIMALS 2, END OF BA_CNT_TAB. DATA: BEGIN OF BDC_TAB OCCURS 100. INCLUDE STRUCTURE BDCDATA. DATA: END OF BDC_TAB. DATA: BEGIN OF HEADER, REC_TYPE(01) TYPE C, DOC_MDY(10) TYPE C, POST_MDY(10) TYPE C, DOC_TYPE(02) TYPE C, FILL03(18) TYPE C, COMPANY_CODE(04) TYPE C, FILL04(05) TYPE C, PERIOD(02) TYPE C, FILL05(04) TYPE C, CURRENCY(05) TYPE C, FILL06(10) TYPE C, REFERENCE_DOC(16) TYPE C, FILL09(04) TYPE C, TEXT(25) TYPE C, FILL07(25) TYPE C, END OF HEADER. DATA: BEGIN OF IN_TRAILER, RECORD_TYPE(01) TYPE C, INTERFACE_ID(04) TYPE C, FILL_02(06) TYPE C, REC_CNT(06) TYPE N, FILL_03(04) TYPE C, TOT_AMOUNT(20) TYPE N, DR_CR_IND(01) TYPE C, DATE(08) TYPE C, TIME(06) TYPE C, FILE_NAME(15) TYPE C, END OF IN_TRAILER. DATA: BEGIN OF GROUP_NAME, FILLER(01) TYPE C VALUE 'Z', INF_ID(04) TYPE C VALUE 'AR01', "Interface Id INF_NAME(07) TYPE C VALUE 'GEN_AR ', END OF GROUP_NAME. DATA: EXECUTION(15) TYPE C VALUE 'DEAMON', BEGIN(01) TYPE C VALUE 'X', WORK_DOC_DATE(08) TYPE C, FILE(45) TYPE C, PREV_PK(02) TYPE C, PREV_BUSINESS_AREA LIKE INFILE-BUSINESS_AREA, PREV_AMOUNT LIKE INFILE-AMOUNT, PREV_DOLLAR_AMT LIKE INFILE-DOLLAR_AMT, PREV_ORDER LIKE INFILE-ORDER, PREV_TEXT LIKE INFILE-TEXT, PREV_DUE_ON_DATE LIKE INFILE-DUE_ON_DATE, POSTING_KEY(02) TYPE C, FIRST_TIME(05) TYPE C VALUE 'TRUE ', NEW_BDC(05) TYPE C VALUE 'TRUE ', ABEND_JOB(05) TYPE C VALUE 'FALSE', BDC_OPENNED(05) TYPE C VALUE 'FALSE', TRAILER_PRESENT(05) TYPE C VALUE 'FALSE', BDC_TAB_CREATED(05) TYPE C VALUE 'FALSE', BAD_FILE(05) TYPE C VALUE 'FALSE', EOJ(05) TYPE C VALUE 'FALSE', CHAR_DATA(16) TYPE C, DISPLAY_DEBIT(16) TYPE C, DISPLAY_CREDIT(16) TYPE C, FULL_FIL_NAME(40) TYPE C, NUMERIC_10(10) TYPE N, CHAR_12(12) TYPE C, NUMERIC_12(12) TYPE N, NUMERIC_2(02) TYPE N, BDC_TRANS_CNT TYPE I, TOTAL_RECS TYPE I, DETAIL_REC_CNT TYPE I, PHANTOM_ACCUM TYPE P DECIMALS 2, AMT_DEBIT_ADDED TYPE P DECIMALS 2, NUM_DATA TYPE P DECIMALS 2, AMT_CREDIT_ADDED TYPE P DECIMALS 2, TOT_AMOUNT TYPE P DECIMALS 2, TOT_DEBIT TYPE P DECIMALS 2, TOT_CREDIT TYPE P DECIMALS 2. DATA NO_BA_FLG(1) TYPE C. CONSTANTS: DEFAULT_FILENAME(15) TYPE C VALUE 'ar_upload ', HEADER_REC(01) TYPE C VALUE 'H', DETAIL_REC(01) TYPE C VALUE 'D', TRAILER_REC(01) TYPE C VALUE 'T', POST(03) TYPE C VALUE '/11', PHANTOM_ACCNT(10) TYPE C VALUE '199997', DEBIT_PK01(02) TYPE C VALUE '01', DEBIT_PK09(02) TYPE C VALUE '09', DEBIT_PK40(02) TYPE C VALUE '40', CREDIT_PK19(02) TYPE C VALUE '19', CREDIT_PK50(02) TYPE C VALUE '50', CREDIT_PK11(02) TYPE C VALUE '11', NUMERIC_DATA(10) TYPE C VALUE '0123456789', NUMERIC_DATA_SPACE(11) TYPE C VALUE ' 0123456789', TRANS_CODE(20) TYPE C VALUE 'F-02', COMMA_DATA(01) TYPE C VALUE ','. INCLUDE ZI000001. ************************************************************************ * PARAMETERS ************************************************************************ PARAMETERS: FIL_NAME(15) DEFAULT 'ar_upload' LOWER CASE, FIL_PATH(40) DEFAULT '/data/work/' LOWER CASE, *To submit the bdc session for automatic processing submit AS CHECKBOX DEFAULT 'X'. ************************************************************************ *----------------------------------------------------------------------- * Main Program *----------------------------------------------------------------------- ************************************************************************ * Entry point for manual execution *----------------------------------------------------------------------- EXECUTION = 'ONLINE'. PERFORM MAINLINE_ROUTINE USING FIL_NAME FIL_PATH ABEND_JOB. *----------------------------------------------------------------------- * Entry point for execution by DEAMON *----------------------------------------------------------------------- FORM MAINLINE_ROUTINE USING FILENAME PATH ABORT. MOVE FILENAME TO FULL_FIL_NAME. PERFORM PROCESS_INPUT_FILE USING FILENAME PATH. IF ABEND_JOB = FALSE. PERFORM PREPARE_DATA. IF BAD_FILE = FALSE. PERFORM PROCESS_TRAILER. ENDIF. ENDIF. * This creates the BDC. IF ABEND_JOB = FALSE. PERFORM PROCESS_INFILE. ENDIF. PERFORM EOJ_ROUTINE. MOVE: ABEND_JOB TO ABORT. ENDFORM. *----------------------------------------------------------------------* *** END OF MAIN ROUTINE *----------------------------------------------------------------------* FORM PROCESS_INPUT_FILE USING FILENAME PATH. CONCATENATE PATH FILENAME INTO FILE. TRANSLATE FILE TO LOWER CASE. MOVE: DEFAULT_FILENAME TO IN_TRAILER-FILE_NAME. OPEN DATASET FILE FOR INPUT IN TEXT MODE. IF SY-SUBRC NE 0. MOVE: TRUE TO ABEND_JOB. ELSE. DO. READ DATASET FILE INTO INFILE. IF SY-SUBRC NE 0. TOTAL_RECS = SY-INDEX - 3. EXIT. ENDIF. APPEND INFILE. ENDDO. CLOSE DATASET FILE. ENDIF. ENDFORM. ************************************************************************ * Load input data to work table(s) FORM PREPARE_DATA. SORT INFILE BY REC_TYPE DESCENDING BUSINESS_AREA. SY-SUBRC = 0. LOOP AT INFILE. IF SY-SUBRC NE 0. EXIT. ENDIF. CASE INFILE-REC_TYPE. "Use field that is to be used to "determine type of record WHEN HEADER_REC. MOVE: INFILE TO HEADER. DELETE INFILE INDEX SY-TABIX. WHEN DETAIL_REC. IF INFILE-AMOUNT CA COMMA_DATA. MOVE TRUE TO ABEND_JOB. ELSE. IF INFILE-POST_KEY = DEBIT_PK01 OR INFILE-POST_KEY = DEBIT_PK09 OR INFILE-POST_KEY = DEBIT_PK40. INFILE-DOLLAR_AMT = INFILE-AMOUNT. ELSEIF INFILE-POST_KEY = CREDIT_PK19 OR INFILE-POST_KEY = CREDIT_PK11 OR INFILE-POST_KEY = CREDIT_PK50. INFILE-DOLLAR_AMT = INFILE-AMOUNT * -1. ELSE. MOVE: TRUE TO ABEND_JOB, TRUE TO BAD_FILE. ENDIF. MODIFY INFILE INDEX SY-TABIX. ENDIF. WHEN TRAILER_REC. MOVE: INFILE TO IN_TRAILER, TRUE TO TRAILER_PRESENT. DELETE INFILE INDEX SY-TABIX. * PERFORM CHECK_DATE_CONTROL_FILE. IF ABEND_JOB = TRUE. EXIT. ENDIF. WHEN OTHERS. ENDCASE. ENDLOOP. ENDFORM. * PROCESS TRAILER RECORD *----------------------------------------------------------------------- FORM PROCESS_TRAILER. *----------------------------------------------------------------------- IF TOTAL_RECS = 0. MOVE: TRUE TO ABEND_JOB. EXIT. ELSEIF TRAILER_PRESENT = FALSE. MOVE: TRUE TO ABEND_JOB. EXIT. ENDIF. ENDFORM. *---------------------------------------------------------------------* * FORM PROCESS_INFILE * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM PROCESS_INFILE. *----------------------------------------------------------------------- * This routine loops through the Infile Table created from the input * file and creates the appropriate BDC transactions necessary to * input the data into SAP *----------------------------------------------------------------------- MOVE: 0 TO SY-SUBRC. SORT INFILE BY BUSINESS_AREA AMOUNT POST_KEY. LOOP AT INFILE. PERFORM CREATE_BDC. ENDLOOP. * Handle the last break occurring because at end of file IF ABEND_JOB = FALSE. MOVE: TRUE TO EOJ. PERFORM FORMAT_SCRN_0300_LAST. PERFORM INSERT_BDCDATA. ENDIF. ENDFORM. ************************************************************************ * Create BDC FORM CREATE_BDC. *----------------------------------------------------------------------- * Include logic applicable to Interface that is necessary to format * the necessary BDC screens. *----------------------------------------------------------------------- SY-SUBRC = 0. IF NEW_BDC EQ TRUE. PERFORM OPEN_BDC. IF ABEND_JOB = TRUE. EXIT. ENDIF. ENDIF. IF FIRST_TIME = TRUE. CLEAR BA_CNT_TAB. PERFORM FORMAT_SCRN_0100. PERFORM FORMAT_BREAK_FIELDS. ELSEIF INFILE-BUSINESS_AREA NE PREV_BUSINESS_AREA OR DETAIL_REC_CNT = 49. PERFORM FORMAT_SCRN_0300_LAST. PERFORM INSERT_BDCDATA. IF ABEND_JOB = FALSE. MOVE: TRUE TO BDC_TAB_CREATED. PERFORM FORMAT_SCRN_0100. PERFORM FORMAT_BREAK_FIELDS. ENDIF. ELSE. PERFORM FORMAT_SCRN_0300_DETAIL. PERFORM FORMAT_BREAK_FIELDS. ENDIF. IF ABEND_JOB = FALSE. IF FIRST_TIME = TRUE. MOVE: TRUE TO BDC_TAB_CREATED, FALSE TO FIRST_TIME. ENDIF. ELSE. EXIT. ENDIF. ENDFORM. ************************************************************************ * Format Break Fields FORM FORMAT_BREAK_FIELDS. *----------------------------------------------------------------------- * This form format fields necessary for breaking logic and postions * the BA_CNT_TAB at the Business Area being processed. MOVE: INFILE-BUSINESS_AREA TO PREV_BUSINESS_AREA, INFILE-POST_KEY TO PREV_PK, INFILE-AMOUNT TO PREV_AMOUNT, INFILE-DOLLAR_AMT TO PREV_DOLLAR_AMT, INFILE-ORDER TO PREV_ORDER, INFILE-TEXT TO PREV_TEXT, INFILE-DUE_ON_DATE TO PREV_DUE_ON_DATE. ENDFORM. ************************************************************************ * format screen 0100 FORM FORMAT_SCRN_0100. *----------------------------------------------------------------------- * This form contains the logic to create screen 0100 SY-SUBRC = 0. IF BA_CNT_TAB-BUSINESS_AREA NE INFILE-BUSINESS_AREA. * Position BA_CNT_TAB at business area currently processing. LOOP AT BA_CNT_TAB. IF BA_CNT_TAB-BUSINESS_AREA = INFILE-BUSINESS_AREA. EXIT. ENDIF. ENDLOOP. ENDIF. PERFORM DYNPRO_SAPMF05A_0100 USING INFILE-POST_KEY INFILE-ACCNT. ENDFORM. ************************************************************************ * FORMAT SCREEN 0300 FOR LAST DETAIL FORM FORMAT_SCRN_0300_LAST. *----------------------------------------------------------------------- * This form formats the last detail screen 0300 and a phantom entry * if needed. Screen 0002 is also formatted for each 0300. ADD: PREV_DOLLAR_AMT TO PHANTOM_ACCUM, 1 TO DETAIL_REC_CNT. IF PREV_DOLLAR_AMT GT 0. ADD: PREV_DOLLAR_AMT TO AMT_DEBIT_ADDED. ELSE. ADD: PREV_DOLLAR_AMT TO AMT_CREDIT_ADDED. ENDIF. IF DETAIL_REC_CNT LT BA_CNT_TAB-REC_CNT. IF PHANTOM_ACCUM LT 0. * Reverse posting key since being posted as an offset to the accumulated * Amount. MOVE DEBIT_PK40 TO POSTING_KEY. NUM_DATA = PHANTOM_ACCUM * -1. ELSE. MOVE CREDIT_PK50 TO POSTING_KEY. NUM_DATA = PHANTOM_ACCUM. ENDIF. PERFORM DYNPRO_SAPMF05A_0300 USING PREV_AMOUNT PREV_TEXT PREV_DUE_ON_DATE POSTING_KEY PHANTOM_ACCNT ' '. IF PREV_PK = '40' OR PREV_PK = '50'. PERFORM DYNPRO_SAPLKACB_0002 USING PREV_BUSINESS_AREA PREV_ORDER. ENDIF. MOVE: NUM_DATA TO CHAR_DATA, POSTING_KEY TO PREV_PK. PERFORM DYNPRO_SAPMF05A_0300 USING CHAR_DATA '' '' '' '' ''. PERFORM BDC_VALUE USING 'BDC_OKCODE' POST. PERFORM DYNPRO_SAPLKACB_0002 USING PREV_BUSINESS_AREA ' '. ELSE. PERFORM DYNPRO_SAPMF05A_0300 USING PREV_AMOUNT PREV_TEXT PREV_DUE_ON_DATE '' '' ''. PERFORM BDC_VALUE USING 'BDC_OKCODE' POST. IF PREV_PK = '40' OR PREV_PK = '50'. PERFORM DYNPRO_SAPLKACB_0002 USING PREV_BUSINESS_AREA PREV_ORDER. ENDIF. ENDIF. CLEAR: DETAIL_REC_CNT, PHANTOM_ACCUM. ENDFORM. ************************************************************************ * FORMAT DETAIL FOR SCREEN 0300 FORM FORMAT_SCRN_0300_DETAIL. *----------------------------------------------------------------------- * This FORM formats screen 0300 for a detail record along with its * screen 0002 ADD: PREV_DOLLAR_AMT TO PHANTOM_ACCUM. PERFORM DYNPRO_SAPMF05A_0300 USING PREV_AMOUNT PREV_TEXT PREV_DUE_ON_DATE INFILE-POST_KEY INFILE-ACCNT INFILE-SPECIAL_GL. IF PREV_PK = '40' OR PREV_PK = '50'. PERFORM DYNPRO_SAPLKACB_0002 USING PREV_BUSINESS_AREA PREV_ORDER. ENDIF. IF PREV_DOLLAR_AMT LT 0. ADD: PREV_DOLLAR_AMT TO AMT_CREDIT_ADDED. ELSE. ADD: PREV_DOLLAR_AMT TO AMT_DEBIT_ADDED. ENDIF. ADD: 1 TO DETAIL_REC_CNT. ENDFORM. ************************************************************************ * Dynpro for program SAPMF05A Screen 0100 FORM DYNPRO_SAPMF05A_0100 USING POST_KEY POST_ACCNT. *----------------------------------------------------------------------- * This FORM formats SCREEN 0100 *----------------------------------------------------------------------- * This PERFORM is done once for each screen. PERFORM BDC_DYNPRO USING 'SAPMF05A' '0100'. * This PERFORM is done as many times as there are fields to be * populated for the screen being processed. PERFORM BDC_VALUE USING 'BKPF-BLDAT' HEADER-DOC_MDY. PERFORM BDC_VALUE USING 'BKPF-BUDAT' HEADER-POST_MDY. PERFORM BDC_VALUE USING 'BKPF-BLART' HEADER-DOC_TYPE. PERFORM BDC_VALUE USING 'BKPF-BUKRS' HEADER-COMPANY_CODE. PERFORM BDC_VALUE USING 'BKPF-MONAT' HEADER-PERIOD. PERFORM BDC_VALUE USING 'BKPF-WAERS' HEADER-CURRENCY. PERFORM BDC_VALUE USING 'BKPF-XBLNR' HEADER-REFERENCE_DOC. PERFORM BDC_VALUE USING 'BKPF-BKTXT' HEADER-TEXT. PERFORM BDC_VALUE USING 'RF05A-NEWBS' POST_KEY. PERFORM BDC_VALUE USING 'RF05A-NEWKO' POST_ACCNT. PERFORM BDC_VALUE USING 'RF05A-NEWUM' INFILE-SPECIAL_GL. ENDFORM. ************************************************************************ * Dynpro for program SAPMF05A Screen 0300 FORM DYNPRO_SAPMF05A_0300 USING AMOUNT TEXT DUE_ON_DATE POST_KEY POST_ACCNT SPECIAL_GL. *----------------------------------------------------------------------- * This FORM formats SCREEN 0300 *----------------------------------------------------------------------- * This PERFORM is done once for each screen. IF PREV_PK = '01' OR PREV_PK = '11'. PERFORM BDC_DYNPRO USING 'SAPMF05A' '0301'. ELSEIF PREV_PK = '09' OR PREV_PK = '19'. PERFORM BDC_DYNPRO USING 'SAPMF05A' '0303'. PERFORM BDC_VALUE USING 'BSEG-ZFBDT' HEADER-DOC_MDY. ELSE. PERFORM BDC_DYNPRO USING 'SAPMF05A' '0300'. ENDIF. * This PERFORM is done as many times as there are fields to be * populated for the screen being processed. PERFORM BDC_VALUE USING 'BSEG-WRBTR' AMOUNT. PERFORM BDC_VALUE USING 'RF05A-NEWBS' POST_KEY. PERFORM BDC_VALUE USING 'RF05A-NEWKO' POST_ACCNT. PERFORM BDC_VALUE USING 'RF05A-NEWUM' SPECIAL_GL. IF TEXT NE SPACE. PERFORM BDC_VALUE USING 'BSEG-SGTXT' TEXT. ENDIF. IF DUE_ON_DATE NE SPACE. PERFORM BDC_VALUE USING 'BSEG-ZFBDT' DUE_ON_DATE. ENDIF. IF NO_BA_FLG = 'N'. IF PREV_PK = '09' OR PREV_PK = '19' OR PREV_PK = '11' OR PREV_PK = '01'. PERFORM BDC_VALUE USING 'BSEG-GSBER' PREV_BUSINESS_AREA. ENDIF. ENDIF. ENDFORM. ************************************************************************ * Dynpro for program SAPLKACB Screen 0002 FORM DYNPRO_SAPLKACB_0002 USING BUSINESS_AREA ORDER. *----------------------------------------------------------------------- * This FORM formats SCREEN 0002 WHICH IS A POP-UP SCREEN * THAT DOES NOT APPEAR DURING ON-LINE PROCESSING *----------------------------------------------------------------------- * This PERFORM is done once for each screen. PERFORM BDC_DYNPRO USING 'SAPLKACB' '0002'. * This PERFORM is done as many times as there are fields to be * populated for the screen being processed. IF BUSINESS_AREA NE '700'. PERFORM BDC_VALUE USING 'COBL-GSBER' BUSINESS_AREA. ENDIF. IF ORDER NE SPACE. PERFORM BDC_VALUE USING 'COBL-AUFNR' ORDER. ENDIF. ENDFORM. ************************************************************************ * BDC Dynpro FORM BDC_DYNPRO USING PGM SCRN. *----------------------------------------------------------------------- * This FORM formats the transaction that tells the BDC which screen is * to be populated. *----------------------------------------------------------------------- CLEAR BDC_TAB. MOVE: PGM TO BDC_TAB-PROGRAM, SCRN TO BDC_TAB-DYNPRO, BEGIN TO BDC_TAB-DYNBEGIN. APPEND BDC_TAB. ENDFORM. ************************************************************************ * BDC Value FORM BDC_VALUE USING FIELD VAL. *----------------------------------------------------------------------- * This FORM tells the BDC which field is to be populated and the value * to use. *----------------------------------------------------------------------- CLEAR BDC_TAB. MOVE: FIELD TO BDC_TAB-FNAM, VAL TO BDC_TAB-FVAL. APPEND BDC_TAB. ENDFORM. ************************************************************************ FORM OPEN_BDC. *----------------------------------------------------------------------- * This routine opens the BDC data file *----------------------------------------------------------------------- SY-SUBRC = 0. CALL FUNCTION 'BDC_OPEN_GROUP' EXPORTING CLIENT = SY-MANDT GROUP = GROUP_NAME KEEP = 'X' USER = SY-UNAME EXCEPTIONS CLIENT_INVALID = 1 DESTINATION_INVALID = 2 GROUP_INVALID = 3 GROUP_IS_LOCKED = 4 HOLDDATE_INVALID = 5 INTERNAL_ERROR = 6 QUEUE_ERROR = 7 RUNNING = 8 SYSTEM_LOCK_ERROR = 9 USER_INVALID = 10 OTHERS = 11. IF SY-SUBRC NE 0. MOVE: TRUE TO ABEND_JOB. CASE SY-SUBRC. WHEN 01. PERFORM PROCESS_MSG USING '109' SY-MANDT 'BDC OPEN' ''. WHEN 02. PERFORM PROCESS_MSG USING '109' 'BDC OPEN' '' ''. WHEN 03. PERFORM PROCESS_MSG USING '111' 'BDC OPEN' '' ''. WHEN 04. PERFORM PROCESS_MSG USING '124' 'BDC OPEN' '' ''. WHEN 05. PERFORM PROCESS_MSG USING '112' 'BDC OPEN' '' ''. WHEN 06. PERFORM PROCESS_MSG USING '113' 'BDC OPEN' '' ''. WHEN 07. PERFORM PROCESS_MSG USING '114' 'BDC OPEN' '' ''. WHEN 08. PERFORM PROCESS_MSG USING '115' 'BDC OPEN' '' ''. WHEN 09. PERFORM PROCESS_MSG USING '125' 'BDC OPEN' '' ''. WHEN 10. PERFORM PROCESS_MSG USING '116' 'BDC OPEN' '' ''. WHEN 11. PERFORM PROCESS_MSG USING '126' 'BDC OPEN' '' ''. ENDCASE. ELSE. MOVE: TRUE TO BDC_OPENNED, FALSE TO NEW_BDC. ENDIF. ENDFORM. ************************************************************************ * Insert BDC data FORM INSERT_BDCDATA. *----------------------------------------------------------------------- * This routine inserts a scenario into the BDC batch session. * Add the actual value of the particular Transaction code relevant * to the scenario being processed for the constant TRANS_CODE. *----------------------------------------------------------------------- SY-SUBRC = 0. CALL FUNCTION 'BDC_INSERT' EXPORTING TCODE = TRANS_CODE TABLES DYNPROTAB = BDC_TAB EXCEPTIONS INTERNAL_ERROR = 1 NOT_OPEN = 2 QUEUE_ERROR = 3 TCODE_INVALID = 4 OTHERS = 5. IF SY-SUBRC NE 0. MOVE: TRUE TO ABEND_JOB. CASE SY-SUBRC. WHEN 01. PERFORM PROCESS_MSG USING '113' 'BDC INSERT' '' ''. WHEN 02. PERFORM PROCESS_MSG USING '117' 'BDC INSERT' '' ''. WHEN 03. PERFORM PROCESS_MSG USING '114' 'BDC INSERT' '' ''. WHEN 04. PERFORM PROCESS_MSG USING '118' 'BDC INSERT' '' ''. WHEN 05. PERFORM PROCESS_MSG USING '126' 'BDC INSERT' '' ''. ENDCASE. ELSE. BDC_TRANS_CNT = BDC_TRANS_CNT + 1. ENDIF. * Initialize table after inserting the processed BDC Transactions * for one scenario REFRESH BDC_TAB. ENDFORM. ************************************************************************ * End of Job Routine FORM EOJ_ROUTINE. IF BDC_OPENNED = TRUE. PERFORM CLOSE_BDC. IF BDC_TAB_CREATED = TRUE AND ABEND_JOB = FALSE. TRANSLATE SUBMIT TO UPPER CASE. IF SUBMIT = 'X'. PERFORM SUBMIT_BDC_TO_BATCH. ENDIF. ENDIF. ENDIF. IF ABEND_JOB = TRUE. PERFORM ABEND_JOB. PERFORM ALERT_CHECK. ELSE. WRITE: /1 ' End of Job Run'. TRANSLATE IN_TRAILER-INTERFACE_ID TO UPPER CASE. IF IN_TRAILER-INTERFACE_ID NE 'AR01'. SELECT UNIX_NAME PRINTER CONTACT INTO (TEMP_UNIX_NAME, TEMP_PRINTER, TEMP_CONTACT) FROM ZMETA WHERE ID EQ IN_TRAILER-INTERFACE_ID. ENDSELECT. IF SY-SUBRC NE 0. SY-SUBRC = 0. ENDIF. ENDIF. TRANSLATE TEMP_UNIX_NAME TO LOWER CASE. SHIFT FULL_FIL_NAME UP TO TEMP_UNIX_NAME+0(9). SUBMIT ZUXMV WITH FILENAME EQ FULL_FIL_NAME WITH FROMPATH EQ TEMP_UNIX_PATH WITH TO_PATH EQ TEMP_ARC_PATH AND RETURN. ENDIF. SUBMIT ZUXLP WITH FILENAME = TEMP_LOG_NAME WITH PATH = TEMP_LOG_PATH WITH PRINTER = TEMP_PRINTER AND RETURN. IF ABEND_JOB = TRUE. IF EXECUTION = 'ONLINE'. MESSAGE A100 WITH IN_TRAILER-INTERFACE_ID. ENDIF. ENDIF. CLOSE DATASET LOGFILE. ENDFORM. * Close BDC data FORM CLOSE_BDC. *----------------------------------------------------------------------- * This routine closes the BDC batch session. *----------------------------------------------------------------------- SY-SUBRC = 0. CALL FUNCTION 'BDC_CLOSE_GROUP' EXCEPTIONS NOT_OPEN = 1 QUEUE_ERROR = 2 OTHERS = 3. IF SY-SUBRC NE 0. MOVE: TRUE TO ABEND_JOB. CASE SY-SUBRC. WHEN 01. PERFORM PROCESS_MSG USING '117' 'BDC CLOSE' '' ''. WHEN 02. PERFORM PROCESS_MSG USING '114' 'BDC CLOSE' '' ''. WHEN 03. PERFORM PROCESS_MSG USING '126' 'BDC CLOSE' '' ''. ENDCASE. ENDIF. ENDFORM. ************************************************************************ * Abend Job FORM ABEND_JOB. *----------------------------------------------------------------------- * This form updates the Interface Date/Time Control File with a status * of 'A' to indicate that this Interface has abended. The Date/Time * stamp on the Control file will not be updated with the date/time * from the current file. The parameter FILE_OPERATION OF '3' initiates * this process. Any time Operation '3' is used with the * Date/Time Control File, the calling program must abend using an 'A' * Message. A generic abend message of 100 has been set up in the * T100 table. *----------------------------------------------------------------------- CALL FUNCTION 'Z_PROCESS_INTERFACE_CTL_TABLE' EXPORTING FILE_ID = IN_TRAILER-INTERFACE_ID FILE_NAME = IN_TRAILER-FILE_NAME FILE_DATE = IN_TRAILER-DATE FILE_TIME = IN_TRAILER-TIME FILE_OPERATION = '3' EXCEPTIONS DUP_FILE_ERROR = 1 FILE_ID_NOT_FOUND = 2 TABLE_NOT_UPDATED = 3 OTHERS = 4. IF SY-SUBRC NE 0. CASE SY-SUBRC. WHEN 01. PERFORM PROCESS_MSG USING '127' IN_TRAILER-INTERFACE_ID IN_TRAILER-FILE_NAME 'OPERATION 3'. WHEN 02. PERFORM PROCESS_MSG USING '128' IN_TRAILER-INTERFACE_ID IN_TRAILER-FILE_NAME 'OPERATION 3'. WHEN 03. PERFORM PROCESS_MSG USING '129' 'ZTAG' 'OPERATION 3' ''. WHEN 04. PERFORM PROCESS_MSG USING '126' 'OPERATION 3' '' ''. ENDCASE. ENDIF. PERFORM PROCESS_MSG USING '100' IN_TRAILER-INTERFACE_ID '' ''. ENDFORM. ************************************************************************ * Submit BDC to Batch FORM SUBMIT_BDC_TO_BATCH. *----------------------------------------------------------------------- * This FORM submits the completed BDC Table to Batch to be processed * for all the transactions processed from the Interface input file. *----------------------------------------------------------------------- SUBMIT RSBDCSUB WITH MAPPE EQ GROUP_NAME AND RETURN. ENDFORM. INCLUDE ZI000002.

Step-by-Step approach to write a BDC program



BDCs are one of the most important objects of an implementation project and they usually give shivers to young (junior) ABAPers. They are used to populate the R/3 database with legacy data. BDCs are an efficient way to populate large amounts of R/3 data using minimum resources and time. BDC programs also (must) ensure that data populated is accurate as the whole application/module runs on that data.

Before starting to code the BDC program, it is a must to understand the transaction into which data is to be populated. Flat files with data need to be studied well for the order, format and accuracy of data. The best way to do it is to have a functional consultant record the transaction (using SHDB - Transaction recorder) entering all the data that needs to get into the transaction. Another way is to do the recording ourselves by entering all the data given to us in the flat file. Once the recording is ready with a simulation of the transaction to be populated, the ABAPer can start writing code to populate the transaction.

Here is a sample BDC for uploading Material Master data (MM01). It gives the users options to choose the upload method (Session/Call Txn), and also accepts files in DAT, XLS, TXT format, with header lines. Feel free to use it. What's more important to me is your suggestions. So do write back :)


REPORT ZKRP_BDC_MM01
NO STANDARD PAGE HEADING
LINE-SIZE 132
LINE-COUNT 65
MESSAGE-ID ZKRP_MSGCLS.

*&-------------------------------------------------------------------&*
* THIS PROGRAM SERVES AS A REUSABLE TEMPLATE AND IS FREE FOR USE *
* HOWEVER, USERS ARE REQUESTED TO PRESERVE THIS PART *
*&-------------------------------------------------------------------&*
* Program Name : ZKRP_BDC_MM01 *
* Description : Material Master (MM01 BDC) *
* Developer : Karthik Potharaju *
* Package : ZKAR *
* Description : *
* *
* PROGRAM FLOW *
* 1. Read input file *
* 2. Check the mandatory fields and if any one of them is missing *
* move the record to error file. *
* 3. Fill the bdcdata and call MM01 transaction *
* 4. If any errors format the message and send it for reporting *
* 5. If any errors, it downloads the error file *
* 6. Based on user input, this program does the following *
* a) Call transaction and in case of errors add to a session *
* b) Create session *
* 7. Display the Audit report *
*&-------------------------------------------------------------------&*

*&-------------------------------------------------------------------&*
* INTERNAL TABLE & STRUCTURE DEFINITIONS
*&-------------------------------------------------------------------&*
*- Internal table for input file for ASCII data load
*&-------------------------------------------------------------------&*
* The ASCII file is uploaded and the lines in it are read as strings *
* Later on, they are converted by separating fields using offsets *
*&-------------------------------------------------------------------&*

DATA:
BEGIN OF I_INFILE_ASC OCCURS 0,
STRING(1300) TYPE C,
END OF I_INFILE_ASC.

DATA:
*- Internal table to store messages from Call Transaction
I_BDCMSGCOLL TYPE STANDARD TABLE OF BDCMSGCOLL WITH HEADER LINE,
*- Internal table for BDC data
IT_BDCTAB TYPE BDCDATA OCCURS 0 WITH HEADER LINE,
*- Internal table to hold standard text (for long text)
I_TDLINES LIKE TLINE OCCURS 0 WITH HEADER LINE.

*- Internal to hold converted records from the text file for BDC data

*- upload (typical structure for MM01)
DATA :
BEGIN OF IT_DATA OCCURS 10,
MATNR(18), " Material Code
MBRSH(1), " Industry sector
MTART(4), " Material Type
WERKS(4), " Plant
LGORT(4), " Storage Location
MAKTX(40), " Material Description
MEINS(3), " Base unit of Measure
MATKL(9), " Material Group
BISMT(18), " Old Material Number
EKGRP(3), " Purchase grp
MFRPN(40), " Manufacturer part number
LGPBE(10), " Storage bin
DISMM(2), " MRP Type
DISPO(3), " MRP controller
MINBE(13), " Reorder Point
DISLS(2), " Lot size (materials planning)
MABST(17), " Maximum stock level
BESKZ(1), " Procurement type
PLIFZ(3), " Planned delivery time in days
FHORI(3), " Scheduling Margin Key for Floats
MTVFP(2), " Availability check
BKLAS(4), " Valuation Class
VPRSV(1), " Price Control
EKALR(1), " Mat. Is Costed with Qty Structure
HKMAT(1), " Material-related origin
LTEXT(1000), " Variable to hold Long Text
END OF IT_DATA.

*- Internal table to hold the long text
DATA:
BEGIN OF IT_LTEXT OCCURS 0,
MATNR(18),
LTEXT(982),
END OF IT_LTEXT.

*- Internal table to hold the error records
DATA:
BEGIN OF IT_ERROR OCCURS 0.
INCLUDE STRUCTURE IT_DATA.
DATA:
MESSAGE(80) TYPE C,
END OF IT_ERROR.

*- Internal table for session names
DATA:
BEGIN OF IT_SESSION OCCURS 0,
NAME(12),
END OF IT_SESSION.

*- Internal table to hold Collecting messages in the SAP System
DATA:
IT_MSG LIKE BDCMSGCOLL OCCURS 10 WITH HEADER LINE.

*- Internal table to hold error records to be downloaded
DATA:
BEGIN OF I_FINAL OCCURS 0,
STRING(1300),
END OF I_FINAL.

*- Internal table for session names
DATA:
BEGIN OF I_SESSION OCCURS 0,
NAME(12),
END OF I_SESSION.

DATA:
IT_INTERN TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.

*- Parameter string for runtime of CALL TRANSACTION USING..
DATA:
X_OPTIONS TYPE CTU_PARAMS.

*&-------------------------------------------------------------------&*
* CONSTANTS
*&-------------------------------------------------------------------&*

CONSTANTS:
C_FILETYPE LIKE RLGRAP-FILETYPE VALUE 'DAT', " File type
C_TCODE LIKE TSTC-TCODE VALUE 'MM01', " Transaction
C_MODE(1) VALUE 'A', " Mode
C_UPDATE(1) VALUE 'S', " Update
C_SESS(12) TYPE C VALUE 'MAT_SESS'. " Session Name

*&-------------------------------------------------------------------&*
* GLOBAL VARIABLES
*&-------------------------------------------------------------------&*


DATA:
GV_TABIX LIKE SY-TABIX, " Table Index
GV_MESG(80), " Message
GV_ERROR TYPE I, " Errors
GV_SUCCESS TYPE I, " Successes
GV_BDC_SESS TYPE APQI-GROUPID VALUE 'UPLOAD',
GV_MAX TYPE I VALUE '900', " Max records
GV_LINES TYPE I, " N.of records
GV_INSERT TYPE I,
GV_COUNTER(2) TYPE N, " Sessions
GF_OPENSESSION TYPE C,
GV_RECORDS TYPE I,
GV_EMPTY TYPE I, " Empty records
GV_TOTAL TYPE I, " Records with data
GV_SESSION TYPE APQI-GROUPID, " Session name
GV_DEL TYPE X VALUE '09', " Dat Delimiter
GV_SFILE(255), " File path
GV_EXT(3). " File Extension

*&-------------------------------------------------------------------&*
* SELECTION SCREEN.
*&-------------------------------------------------------------------&*


SELECTION-SCREEN BEGIN OF BLOCK SCR1 WITH FRAME TITLE TEXT-111.
PARAMETER:
P_FILE TYPE RLGRAP-FILENAME OBLIGATORY DEFAULT 'C:\MM01.TXT',
P_ERR TYPE RLGRAP-FILENAME OBLIGATORY DEFAULT 'C:\MM01_ERR.TXT',
P_FTYPE LIKE RLGRAP-FILETYPE DEFAULT 'DAT'.
SELECTION-SCREEN END OF BLOCK SCR1.

SELECTION-SCREEN BEGIN OF BLOCK MODE WITH FRAME TITLE TEXT-222.
PARAMETER:
P_CT RADIOBUTTON GROUP BDC, " Call Trans
P_BDC RADIOBUTTON GROUP BDC DEFAULT 'X'. " Create BDC sess

PARAMETER:
P_SESS1 TYPE APQI-GROUPID OBLIGATORY DEFAULT C_SESS.
" Session name
PARAMETER:
P_MAX(4) OBLIGATORY DEFAULT '100'. " Max. recs in a session
PARAMETERS:
P_HEADER TYPE I DEFAULT 0. " Header Lines
P_BEGCOL TYPE I DEFAULT 1 NO-DISPLAY,
P_BEGROW TYPE I DEFAULT 1 NO-DISPLAY,
P_ENDCOL TYPE I DEFAULT 100 NO-DISPLAY,
P_ENDROW TYPE I DEFAULT 32000 NO-DISPLAY,
P_TEST AS CHECKBOX DEFAULT 'X'. " Test mode

SELECTION-SCREEN END OF BLOCK MODE.

*&-------------------------------------------------------------------&*
* AT SELECTION SCREEN.
*&-------------------------------------------------------------------&*

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
*- Input File help (for upload path)
PERFORM FILE_HELP USING P_FILE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_ERR.
*- Error File help (for download path)
PERFORM FILE_HELP USING P_ERR.

*&-------------------------------------------------------------------&*
* START-OF-SELECTION
*&-------------------------------------------------------------------&*

START-OF-SELECTION.

*- Perform to store the data to an internal table
PERFORM READ_INPUT_DATA.

*- Process data in non test mode only
IF P_TEST = SPACE.
IF NOT IT_DATA[] IS INITIAL.
PERFORM PROCESS_DATA.
ELSE.
MESSAGE S003(ZKRP_MSGCLS).
*- Setting flag to stop processing incase of data insufficiency
F_STOP = 'X'.
STOP.
ENDIF.
ENDIF.
*-------------------------------------------------------------------*
* END OF SELECTION.
*-------------------------------------------------------------------*

END-OF-SELECTION.

IF F_STOP = SPACE.
*- Perform to display the selection screen report
PERFORM DISPLAY_SEL_SCR_REPORT.
*- Perform to display the no.of records,success and error records
PERFORM DISPLAY_SUMMARY_REPORT.
*- Perform to display the session report
PERFORM SESSION_REPORT.
*- Downloading error records.
PERFORM DOWNLOAD_ERROR_FILES.
*- Perform to display the error records
PERFORM DISPLAY_ERROR_RECORDS.

ENDIF.

*-------------------------------------------------------------------*
* Form : FILE_HELP
*-------------------------------------------------------------------*
* Description : To provide F4 help for file if read from PC
*-------------------------------------------------------------------*

FORM FILE_HELP USING F_FILE TYPE RLGRAP-FILENAME.

*- The FM 'KD_GET_FILENAME_ON_F4' opens up a “browse for file” window

*- to select the input file
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
CHANGING
FILE_NAME = F_FILE
EXCEPTIONS
MASK_TOO_LONG = 1
OTHERS = 2.

IF SY-SUBRC <> 0.
MESSAGE S010(ZKRP_MSGCLS). " 'Error in getting filename'.
ENDIF.

ENDFORM. " FILE_HELP

*&amp;amp;amp;amp;amp;--------------------------------------------------------------------*
*& Form READ_INPUT_DATA
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*

FORM READ_INPUT_DATA.

*- Splitting the filename and its extension
PERFORM SPLIT_FILENAME_EXT.

CASE GV_EXT.

WHEN 'XLS'.
*- Perform to convert the Excel data into an internal table
PERFORM CONVERT_XLS_ITAB.
WHEN 'TXT'.
IF P_FTYPE = 'ASC'.
*- Uploading the data from server
PERFORM READ_INPUTFILE TABLES I_INFILE_ASC
USING P_FILE P_FTYPE.
*- Perform Formating ASC type data
PERFORM FORMAT_ASC_DATA.
ELSEIF P_FTYPE = 'DAT'.
*- Uploading the data from server
PERFORM READ_INPUTFILE TABLES IT_DATA
USING P_FILE P_FTYPE.
ENDIF.
WHEN OTHERS.
MESSAGE S000(ZKRP_MSGCLS).
F_STOP = 'X'.
STOP.
ENDCASE.
IF NOT IT_DATA[] IS INITIAL.
*- Perform to delete Header lines
PERFORM DELETE_HEADER_EMPTY_RECS.
ENDIF.

ENDFORM. " READ_INPUT_DATA
*&--------------------------------------------------------------------*
*& Form SPLIT_FILENAME_EXT
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*

FORM SPLIT_FILENAME_EXT.

MOVE P_FILE TO GV_SFILE.
*- To get the extensions of the file
CALL FUNCTION 'CV120_SPLIT_FILE'
EXPORTING
PF_FILE = GV_SFILE
IMPORTING
PFX_EXTENSION = GV_EXT
.
*- Checking the case of file extension
IF GV_EXT NA SY-ABCDE.
TRANSLATE GV_EXT TO UPPER CASE.
ENDIF.


ENDFORM. " SPLIT_FILENAME_EXT

*&--------------------------------------------------------------------*
*& Form CONVER_XLS_ITAB
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*

FORM CONVERT_XLS_ITAB.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = P_FILE
I_BEGIN_COL = P_BEGCOL
I_BEGIN_ROW = P_BEGROW
I_END_COL = P_ENDCOL
I_END_ROW = P_ENDROW
TABLES
INTERN = IT_INTERN
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

*- Perform to move the data into an internal data
PERFORM MOVE_DATA.

ENDFORM. " CONVERT_XLS_ITAB

*&--------------------------------------------------------------------*
*& Form MOVE_DATA
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*

FORM MOVE_DATA.

DATA : LV_INDEX TYPE I.
FIELD-SYMBOLS .
*- Sorting the internal table
SORT IT_INTERN BY ROW COL.
CLEAR IT_INTERN.

LOOP AT IT_INTERN.
MOVE IT_INTERN-COL TO LV_INDEX.
*- Assigning the each record to an internal table row
ASSIGN COMPONENT LV_INDEX OF STRUCTURE IT_DATA TO .
*- Asigning the field value to a field symbol
MOVE IT_INTERN-VALUE TO .
AT END OF ROW.
APPEND IT_DATA.
CLEAR IT_DATA.
ENDAT.
ENDLOOP.

ENDFORM. " MOVE_DATA

*-------------------------------------------------------------------*
* Form : Read_inputfile
*-------------------------------------------------------------------*
* Description : To upload the data into internal table
*-------------------------------------------------------------------*

FORM READ_INPUTFILE TABLES F_INFILE
USING F_FILE TYPE RLGRAP-FILENAME
F_FILTYP TYPE RLGRAP-FILETYPE.
DATA : LV_DEL TYPE CHAR01,
LV_FILE TYPE STRING.
CLEAR F_INFILE.
REFRESH F_INFILE.
LV_FILE = F_FILE.

*- Function module to upload the input file
IF F_FILTYP = 'DAT'.
LV_DEL = ''.
ENDIF.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = LV_FILE
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = LV_DEL
TABLES
DATA_TAB = F_INFILE
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.

IF SY-SUBRC <> 0.
MESSAGE I011(ZKRP_MSGCLS). " 'Error in uploading the file'.
F_STOP = 'X'.
STOP.
ENDIF.

ENDFORM. "Read_inputfile
*&--------------------------------------------------------------------*
*& Form FORMAT_ASC_DATA
*&--------------------------------------------------------------------*
* To format the ASCII data
*---------------------------------------------------------------------*

FORM FORMAT_ASC_DATA.

LOOP AT I_INFILE_ASC.

IT_DATA-MATNR = I_INFILE_ASC-STRING+0(18).
IT_DATA-MBRSH = I_INFILE_ASC-STRING+18(1).
IT_DATA-MTART = I_INFILE_ASC-STRING+19(4).
IT_DATA-WERKS = I_INFILE_ASC-STRING+23(4).
IT_DATA-LGORT = I_INFILE_ASC-STRING+27(4).
IT_DATA-MAKTX = I_INFILE_ASC-STRING+31(40).
IT_DATA-MEINS = I_INFILE_ASC-STRING+71(3).
IT_DATA-MATKL = I_INFILE_ASC-STRING+74(9).
IT_DATA-BISMT = I_INFILE_ASC-STRING+83(18).
IT_DATA-EKGRP = I_INFILE_ASC-STRING+101(3).
IT_DATA-MFRPN = I_INFILE_ASC-STRING+104(40).
IT_DATA-LGPBE = I_INFILE_ASC-STRING+144(10).
IT_DATA-DISMM = I_INFILE_ASC-STRING+154(2).
IT_DATA-DISPO = I_INFILE_ASC-STRING+156(3).
IT_DATA-MINBE = I_INFILE_ASC-STRING+159(13).
IT_DATA-DISLS = I_INFILE_ASC-STRING+172(2).
IT_DATA-MABST = I_INFILE_ASC-STRING+174(17).
IT_DATA-BESKZ = I_INFILE_ASC-STRING+191(1).
IT_DATA-PLIFZ = I_INFILE_ASC-STRING+192(3).
IT_DATA-FHORI = I_INFILE_ASC-STRING+195(3).
IT_DATA-MTVFP = I_INFILE_ASC-STRING+198(2).
IT_DATA-BKLAS = I_INFILE_ASC-STRING+200(4).
IT_DATA-VPRSV = I_INFILE_ASC-STRING+204(1).
IT_DATA-EKALR = I_INFILE_ASC-STRING+205(1).
IT_DATA-HKMAT = I_INFILE_ASC-STRING+206(1).
IT_DATA-LTEXT = I_INFILE_ASC-STRING+207(1000).

ENDLOOP.

ENDFORM. " FORMAT_ASC_DATA

*-------------------------------------------------------------------*
* Form FILE_VALIDATION
*-------------------------------------------------------------------*
* To validate data
*-------------------------------------------------------------------*

FORM FILE_VALIDATION.

DATA: LGV_TABIX LIKE SY-TABIX,
LV_FLAG(1).

LOOP AT IT_DATA.
CLEAR GV_MESG.
*- check for the mandatory fields
IF IT_DATA-MAKTX IS INITIAL
OR IT_DATA-MEINS IS INITIAL
OR IT_DATA-MATKL IS INITIAL
OR IT_DATA-EKGRP IS INITIAL
OR IT_DATA-DISMM IS INITIAL
OR IT_DATA-VPRSV IS INITIAL .


LGV_TABIX = SY-TABIX.
GV_MESG = 'Mandatory fields missing'(002).
*- Perform to store the error record
PERFORM ERROR_PROCESSING. " USING IT_DATA GV_MESG.
*- Deleting the record which is initial
DELETE IT_DATA INDEX LV_TABIX.
ENDIF.
ENDLOOP.
CLEAR GV_MESG.

ENDFORM. " DATA_VALIDATION
*&--------------------------------------------------------------------*
*& Form error_processing
*&--------------------------------------------------------------------*
* To process the error records
*---------------------------------------------------------------------*

FORM ERROR_PROCESSING.

GV_ERROR = GV_ERROR + 1.
IT_ERROR = IT_DATA.
IT_ERROR-MESSAGE = GV_MESG.
APPEND IT_ERROR.
CLEAR IT_ERROR.

ENDFORM. " error_processing
*-------------------------------------------------------------------*
* Form : process_data
*-------------------------------------------------------------------*
* --- Populating the BDC Data
*-------------------------------------------------------------------*

FORM PROCESS_DATA .

LOOP AT IT_DATA.

CLEAR :IT_BDCTAB,
I_BDCMSGCOLL.
REFRESH:IT_BDCTAB,
I_BDCMSGCOLL.
*- To fill the data from the text file
PERFORM FILL_BDCDATA.
IF P_CT EQ 'X'.
*- Posts data using call transaction method.
PERFORM CALL_TRANSACTION.
ELSE.
*- Posts data using session method.
PERFORM CALL_SESSION USING C_TCODE P_MAX P_SESS1.
ENDIF.

ENDLOOP.
IF GF_OPENSESSION = 'X'.
PERFORM CLOSE_SESSION.
ENDIF.

ENDFORM. " PROCESS_DATA

*&amp;amp;amp;amp;amp;--------------------------------------------------------------------*
*& Form FILL_BDCDATA
*&--------------------------------------------------------------------*
* To populate the data
*-------------------------------------------------------------------*

FORM FILL_BDCDATA.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=AUSW'.
PERFORM BDC_FIELD USING 'RMMG1-MATNR' IT_DATA-MATNR.
PERFORM BDC_FIELD USING 'RMMG1-MBRSH' IT_DATA-MBRSH.
PERFORM BDC_FIELD USING 'RMMG1-MTART' IT_DATA-MTART.

*- MM01 view selection
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(15)'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '/00'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(02)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(03)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(05)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(06)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(07)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(08)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(09)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(10)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(11)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(12)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(13)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(14)' 'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(15)' 'X'.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0080'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'RMMG1-LGORT'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=ENTR'.
PERFORM BDC_FIELD USING 'RMMG1-WERKS' IT_DATA-WERKS.
PERFORM BDC_FIELD USING 'RMMG1-LGORT' IT_DATA-LGORT.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP02'.
PERFORM BDC_FIELD USING 'MAKT-MAKTX' IT_DATA-MAKTX.
PERFORM BDC_FIELD USING 'MARA-BISMT' IT_DATA-BISMT.
PERFORM BDC_FIELD USING 'MARA-MEINS' IT_DATA-MEINS.
PERFORM BDC_FIELD USING 'MARA-MATKL' IT_DATA-MATKL.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP09'.

PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP11'.
PERFORM BDC_FIELD USING 'MARC-EKGRP' IT_DATA-EKGRP.
PERFORM BDC_FIELD USING 'MARA-MFRPN' IT_DATA-MFRPN.

IF NOT IT_DATA-LTEXT IS INITIAL.
*- Perform to populate Long text
PERFORM POPULATE_LONG_TEXT.
ENDIF.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4040'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP12'.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP13'.
PERFORM BDC_FIELD USING 'MARC-DISMM' IT_DATA-DISMM.
PERFORM BDC_FIELD USING 'MARC-MINBE' IT_DATA-MINBE.
PERFORM BDC_FIELD USING 'MARC-DISPO' IT_DATA-DISPO.
PERFORM BDC_FIELD USING 'MARC-DISLS' IT_DATA-DISLS.
PERFORM BDC_FIELD USING 'MARC-MABST' IT_DATA-MABST.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP14'.
PERFORM BDC_FIELD USING 'MARC-PLIFZ' IT_DATA-PLIFZ.
PERFORM BDC_FIELD USING 'MARC-FHORI' IT_DATA-FHORI.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP15'.
PERFORM BDC_FIELD USING 'MARC-MTVFP' IT_DATA-MTVFP.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP19'.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP20'.
PERFORM BDC_FIELD USING 'MARD-LGPBE' IT_DATA-LGPBE.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP24'.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MBEW-BKLAS'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP25'.
PERFORM BDC_FIELD USING 'MBEW-BKLAS' IT_DATA-BKLAS.
PERFORM BDC_FIELD USING 'MBEW-VPRSV' IT_DATA-VPRSV.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP26'.

*- MM01 first screen

PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=SP27'.
PERFORM BDC_FIELD USING 'MBEW-EKALR' IT_DATA-EKALR.
PERFORM BDC_FIELD USING 'MBEW-HKMAT' IT_DATA-HKMAT.

*- MM01 first screen
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4000'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'MAKT-MAKTX'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BU'.

ENDFORM. " FILL_BDCDATA

*-------------------------------------------------------------------*
* Form : call_transaction *
*-------------------------------------------------------------------*
*- Posts data using call transaction method. *
*-------------------------------------------------------------------*

FORM CALL_TRANSACTION .

CLEAR: V_LINES,
GV_MESG.
CLEAR X_OPTIONS.
X_OPTIONS-DISMODE = C_MODE.
X_OPTIONS-UPDMODE = C_UPDATE.
X_OPTIONS-DEFSIZE = 'X'.

*- call transaction method to upload data
CALL TRANSACTION C_TCODE USING IT_BDCTAB
OPTIONS FROM X_OPTIONS
MESSAGES INTO I_BDCMSGCOLL.

IF SY-SUBRC <> 0.
DESCRIBE TABLE I_BDCMSGCOLL LINES V_LINES.
READ TABLE I_BDCMSGCOLL INDEX GV_LINES TRANSPORTING ALL FIELDS.
*- Formats message returned by Call transaction.
PERFORM FORMAT_MESSAGE.
*- Perform to process error processing
PERFORM ERROR_PROCESSING." USING IT_DATA GV_MESG.
PERFORM CALL_SESSION USING C_TCODE P_MAX P_SESS1.
ELSE. "If call transaction is successful.
GV_SUCCESS = GV_SUCCESS + 1.
ENDIF.

ENDFORM. " call_transaction
*&--------------------------------------------------------------------*
*& Form format_message
*&--------------------------------------------------------------------*
*-----Reading messages
*---------------------------------------------------------------------*

FORM FORMAT_MESSAGE.
CLEAR GV_MESG.
*- Function module to get the message.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
ID = I_BDCMSGCOLL-MSGID
LANG = SY-LANGU
NO = I_BDCMSGCOLL-MSGNR
V1 = I_BDCMSGCOLL-MSGV1
V2 = I_BDCMSGCOLL-MSGV2
V3 = I_BDCMSGCOLL-MSGV3
V4 = I_BDCMSGCOLL-MSGV4
IMPORTING
MSG = GV_MESG.

ENDFORM. " format_message
*-------------------------------------------------------------------*
* Form : call_session
*-------------------------------------------------------------------*
* Description : To call the session either for FSP0 or FSP2
*-------------------------------------------------------------------*

FORM CALL_SESSION USING FP_TCODE TYPE ANY
F_MAX TYPE ANY
F_SESS1 TYPE ANY.
*- To open the session
PERFORM OPEN_SESSION USING F_MAX F_SESS1.
*- Perform Insert BDC Session
PERFORM BDC_INSERT USING FP_TCODE.
*- To close the session
IF GV_INSERT = F_MAX .
PERFORM CLOSE_SESSION.
ENDIF.
ENDFORM. " call_session
*-------------------------------------------------------------------*
* Form : open_session
*-------------------------------------------------------------------*
* Description : Form to open BDC open group.
*-------------------------------------------------------------------*

FORM OPEN_SESSION USING F_MAX TYPE ANY
F_SESS1 TYPE ANY.

IF GV_INSERT = F_MAX OR GF_OPENSESSION = SPACE.
GV_COUNTER = GV_COUNTER + 1.
CLEAR GV_SESSION.
CONCATENATE F_SESS1 '_' GV_COUNTER INTO GV_SESSION.
* Opening the BDC Session
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = GV_SESSION
KEEP = 'X'
USER = SY-UNAME
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
IF SY-SUBRC <> 0.
MESSAGE I007(ZKRP_MSGCLS). " 'Error in Opening the Session'.
EXIT.
ELSE.
CLEAR V_INSERT.
GF_OPENSESSION = 'X'.
ENDIF.
ENDIF.
ENDFORM. " open_session
*-------------------------------------------------------------------*
* Form : bdc_insert
*-------------------------------------------------------------------*
* Description : Form to Insert data.
*-------------------------------------------------------------------*

FORM BDC_INSERT USING FP_TCODE TYPE ANY.
* Inserting BDC
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = FP_TCODE
TABLES
DYNPROTAB = IT_BDCTAB
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
MESSAGE I008(ZKRP_MSGCLS). " 'Error in inserting the record'.
ELSE.
GV_INSERT = GV_INSERT + 1.
ENDIF.
ENDFORM. " bdc_insert
*-------------------------------------------------------------------*
* Form : close_session
*-------------------------------------------------------------------*
* Description : To close the session
*-------------------------------------------------------------------*
FORM CLOSE_SESSION.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.

IF SY-SUBRC <> 0.
MESSAGE I009(ZKRP_MSGCLS). " 'Session cannot be closed'.
ELSE.
I_SESSION-NAME = GV_SESSION.
APPEND I_SESSION.
CLEAR I_SESSION.
CLEAR F_OPENSESSION.
ENDIF.
ENDFORM. " close_session
*&--------------------------------------------------------------------*
*& Form DISPLAY_SUCCESS_ERROR_DATA
*&--------------------------------------------------------------------*
* To display the no.of records,success and error records
*-------------------------------------------------------------------*
FORM DISPLAY_SUMMARY_REPORT.

SKIP 3.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE :/1(132) SY-ULINE.
WRITE :/1(1) SY-VLINE,
65 'SUMMARY REPORT'(003),
132(1) SY-VLINE.
FORMAT INTENSIFIED OFF.
PERFORM COLOR_FILL.
WRITE :/1(132) SY-ULINE.
WRITE :/1(1) SY-VLINE,
2(24) 'Processed Records'(004),
27(2) ' : ',
30 GV_TOTAL ,
132(1) SY-VLINE.
PERFORM COLOR_FILL.
WRITE :/1(1) SY-VLINE,
2(24) 'Successfully Uploaded'(005),
27(2) ' : ',
30 V_SUCCESS,
132(1) SY-VLINE.
PERFORM COLOR_FILL.
WRITE :/1(1) SY-VLINE,
2(24) 'Error Records'(006),
27(2) ' : ',
30 V_ERROR,
132(1) SY-VLINE.
PERFORM COLOR_FILL.
WRITE :/1(1) SY-VLINE,
2(24) 'Empty Records'(007),
27(2) ' : ',
30 GV_EMPTY,
132(1) SY-VLINE.
WRITE :/1(132) SY-ULINE.

ENDFORM. " DISPLAY_SUCCESS_ERROR_DATA

*&--------------------------------------------------------------------*
*& Form DISPLAY_ERROR_RECORDS
*&--------------------------------------------------------------------*
* To display the error records
*-------------------------------------------------------------------*
FORM DISPLAY_ERROR_RECORDS.

IF GV_ERROR > 0.
*- Perform to display the error header
PERFORM DISPLAY_ERROR_HEADER.
*- Perform to display the error records
PERFORM DISPLAY_ERROR_DETAIL.
ENDIF.

ENDFORM. " DISPLAY_ERROR_RECORDS

*&--------------------------------------------------------------------*
*& Form DISPLAY_ERROR_HEADER
*&--------------------------------------------------------------------*
* To display the error header
*-------------------------------------------------------------------*
FORM DISPLAY_ERROR_HEADER.

SKIP.
WRITE :/1(132) SY-ULINE.
WRITE :/1(1) SY-VLINE,
40 'ERROR RECORDS'(008),
132(1) SY-VLINE.
WRITE :/1(132) SY-ULINE.
WRITE : /1(1) SY-VLINE,
2(18) 'Material Number'(009),
20(1) SY-VLINE,
21(4) 'Type'(010),
25(1) SY-VLINE,
26(5) 'Plant'(011),
31(1) SY-VLINE,
32(16) 'storage location'(012),
48(1) SY-VLINE,
49(80) 'Message'(013),
132(1) SY-VLINE.


WRITE :/1(132) SY-ULINE.

ENDFORM. " DISPLAY_ERROR_HEADER

*&--------------------------------------------------------------------*
*& Form DISPLAY_ERROR_DETAIL
*&--------------------------------------------------------------------*
* To display the error records
*-------------------------------------------------------------------*
FORM DISPLAY_ERROR_DETAIL.

LOOP AT IT_ERROR.
WRITE : /1(1) SY-VLINE,
2(18) IT_ERROR-MATNR,
20(1) SY-VLINE,
21(4) IT_ERROR-MTART,
25(1) SY-VLINE,
26(5) IT_ERROR-WERKS,
31(1) SY-VLINE,
32(16) IT_ERROR-LGORT,
48(1) SY-VLINE,
49(80) IT_ERROR-MESSAGE,
132(1) SY-VLINE.

ENDLOOP.
WRITE :/1(132) SY-ULINE.

ENDFORM. " DISPLAY_ERROR_DETAIL
*-------------------------------------------------------------------*
* Form DOWNLOAD_ERROR_FILES
*-------------------------------------------------------------------*
*- Downloading the error records to erro file
*-------------------------------------------------------------------*
FORM DOWNLOAD_ERROR_FILES.

DATA : LV_DEL TYPE CHAR01,
LV_FILE TYPE STRING.

IF NOT IT_ERROR[] IS INITIAL.
IF P_FTYPE = 'DAT'.
LOOP AT IT_ERROR.

CONCATENATE IT_ERROR-MATNR
IT_ERROR-MBRSH
IT_ERROR-MTART
IT_ERROR-WERKS
IT_ERROR-LGORT
IT_ERROR-MAKTX
IT_ERROR-MEINS
IT_ERROR-MATKL
IT_ERROR-BISMT
IT_ERROR-EKGRP
IT_ERROR-MFRPN
IT_ERROR-LGPBE
IT_ERROR-DISMM
IT_ERROR-DISPO
IT_ERROR-MINBE
IT_ERROR-DISLS
IT_ERROR-MABST
IT_ERROR-BESKZ
IT_ERROR-PLIFZ
IT_ERROR-FHORI
IT_ERROR-MTVFP
IT_ERROR-BKLAS
IT_ERROR-VPRSV
IT_ERROR-EKALR
IT_ERROR-HKMAT
IT_ERROR-LTEXT
INTO I_FINAL-STRING SEPARATED BY V_DEL.
APPEND I_FINAL.
CLEAR I_FINAL.
ENDLOOP.
CLEAR I_FINAL.
ELSEIF P_FTYPE = 'ASC'.
LOOP AT IT_ERROR.
I_FINAL-STRING+0(18) = IT_ERROR-MATNR.
I_FINAL-STRING+18(1) = IT_ERROR-MBRSH.
I_FINAL-STRING+19(4) = IT_ERROR-MTART.
I_FINAL-STRING+23(4) = IT_ERROR-WERKS.
I_FINAL-STRING+27(4) = IT_ERROR-LGORT.
I_FINAL-STRING+31(40) = IT_ERROR-MAKTX.
I_FINAL-STRING+71(3) = IT_ERROR-MEINS.
I_FINAL-STRING+74(9) = IT_ERROR-MATKL.
I_FINAL-STRING+83(18) = IT_ERROR-BISMT.
I_FINAL-STRING+101(3) = IT_ERROR-EKGRP.
I_FINAL-STRING+104(40) = IT_ERROR-MFRPN.
I_FINAL-STRING+144(10) = IT_ERROR-LGPBE.
I_FINAL-STRING+154(2) = IT_ERROR-DISMM.
I_FINAL-STRING+156(3) = IT_ERROR-DISPO.
I_FINAL-STRING+159(13) = IT_ERROR-MINBE.
I_FINAL-STRING+172(2) = IT_ERROR-DISLS.
I_FINAL-STRING+174(17) = IT_ERROR-MABST.
I_FINAL-STRING+191(1) = IT_ERROR-BESKZ.
I_FINAL-STRING+192(3) = IT_ERROR-PLIFZ.
I_FINAL-STRING+195(3) = IT_ERROR-FHORI.
I_FINAL-STRING+198(2) = IT_ERROR-MTVFP.
I_FINAL-STRING+200(4) = IT_ERROR-BKLAS.
I_FINAL-STRING+204(1) = IT_ERROR-VPRSV.
I_FINAL-STRING+205(1) = IT_ERROR-EKALR.
I_FINAL-STRING+206(1) = IT_ERROR-HKMAT.
I_FINAL-STRING+207(1000) = IT_ERROR-LTEXT.

APPEND I_FINAL.
CLEAR I_FINAL.
ENDLOOP.
ENDIF. "IF P_FTYPE = 'DAT'.

LV_FILE = P_ERR.

IF P_FTYPE = 'DAT'.
LV_DEL = ''.
ENDIF.

CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = LV_FILE
FILETYPE = 'ASC'
WRITE_FIELD_SEPARATOR = LV_DEL
TABLES
DATA_TAB = I_FINAL
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
MESSAGE I012(ZKRP_MSGCLS). " Error in downloading the file.
ENDIF.

ENDIF. "IF NOT I_FILE_ERROR[] IS INITIAL.

ENDFORM. " DOWNLOAD_ERROR_FILES

*&amp;amp;amp;amp;amp;--------------------------------------------------------------------*
*& Form POPULATE_LONG_TEXT
*&--------------------------------------------------------------------*
* text
*-------------------------------------------------------------------*
FORM POPULATE_LONG_TEXT .

DATA: LV_LNGTEXT(72).

DATA: LV_STRING(1000),
LEN TYPE I,
I_POS TYPE I,
LV_LNLEN TYPE I,
LV_LINE(2) TYPE N,
LV_FIRST,
LV_LNCNT TYPE I,
LV_FLAG.

LV_LNLEN = 72.
LV_STRING = IT_DATA-LTEXT.
LEN = STRLEN( LV_STRING ).
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4040'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=LTEX'.
LV_LINE = 2.
DO.
IF LV_FLAG = SPACE.
LEN = STRLEN( LV_STRING+I_POS ).
ENDIF.
IF LEN < lv_lnlen =" LEN." lv_lngtext =" LV_STRING+I_POS(LV_LNLEN)." lv_first =" SPACE." lv_first =" 'X'." lv_lnlen =" 72." lv_flag =" 'X'." i_pos =" I_POS" lv_lncnt =" LV_LNCNT" lv_line =" LV_LINE" gv_ext =" 'XLS'." p_err =" P_ERR(SY-FDPOS)." p_ftype =" 'DAT'." gv_del =" '2C'." gv_ext =" 'XLS'." p_ct =" 'X'." f_color =" SPACE." f_color =" 'X'."> 0 AND NOT IT_DATA IS INITIAL.
DELETE IT_DATA FROM 1 TO P_HEADER.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.

CLEAR IT_DATA.
*- To delete the empty lines from internal table
LOOP AT IT_DATA.
LGV_TABIX = SY-TABIX.
IF IT_DATA IS INITIAL.
GV_EMPTY = GV_EMPTY + 1.
DELETE IT_DATA INDEX LV_TABIX..
ENDIF.
ENDLOOP.

CLEAR IT_DATA.
*- Total no of recs in file
DESCRIBE TABLE IT_DATA LINES GV_TOTAL .
IF GV_TOTAL = 0.
MESSAGE I013(ZKRP_MSGCLS). " No records in the file
F_STOP = 'X'.
STOP.
ENDIF.

ENDFORM. " DELETE_HEADER_EMPTY_RECS

*-------------------------------------------------------------------*
* Start new screen *
*-------------------------------------------------------------------*
FORM BDC_DYNPRO USING F_PROGRAM F_DYNPRO.
CLEAR IT_BDCTAB.
IT_BDCTAB-PROGRAM = F_PROGRAM.
IT_BDCTAB-DYNPRO = F_DYNPRO.
IT_BDCTAB-DYNBEGIN = 'X'.
APPEND IT_BDCTAB.
ENDFORM. "BDC_DYNPRO

*-------------------------------------------------------------------*
* Insert field
*-------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF FVAL <> SPACE.
CLEAR IT_BDCTAB.
IT_BDCTAB-FNAM = FNAM.
IT_BDCTAB-FVAL = FVAL.
APPEND IT_BDCTAB.
ENDIF.

ENDFORM. "BDC_FIELD

MM02 BDC - Select Specific Material Master View

Creating a BDC of the MM02 will not be an easy task. As soon as we enter the material and hit enter it will ask us to choose the required Material master views. This popup contains the available material master views and they are not constant. Sometimes MRP1 comes at the 12th line and sometimes it comes to 6th line. This dynamic of the views are solely depended on the Status (MARA-VPSTA).

To overcome of this dynamics we need to get to know where exactly our required view will appear e.g. line 6 or line 10 or line 15. We will use the FM SELECTION_VIEWS_FIND to find out which view will come at which position.

In our BDC, we will follow these steps:
1. Always select the Basic Data 1
2. Get the respective user command for the tab by Executing the FM SELECTION_VIEWS_FIND.

Status (MARA-VPSTA) contains the combination of the View indicator. You can find the relation of the status indicator and view name in the documentation of the data element PSTAT_D or follow this table:

User department Maintenance status
Work scheduling A
Accounting B
Classification C
MRP D
Purchasing E
Production resources/tools F
Costing G
Basic data K
Storage L
Forecasting P
Quality management Q
Warehouse management S
Sales V
Plant stocks X
Storage location stocks Z


In this my test BDC, I want to update the MRP type. MRP type comes under the "MRP 1" view of the material master. So, I will first select the Basic Data and than move to MRP 1 view and update the MRP type.
Code Snippet to Select View in MM02
  
REPORT ztest_np_mm02
NO STANDARD PAGE HEADING LINE-SIZE 255.
*
* Local data
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
*
* Selection Screen
PARAMETERS: p_matnr TYPE mara-matnr OBLIGATORY,
p_werks TYPE marc-werks OBLIGATORY,
p_lgort TYPE rmmg1-lgort OBLIGATORY,
p_dismm TYPE marc-dismm OBLIGATORY.
*
*
START-OF-SELECTION.
*
* Material views ....................................................
DATA: l_vpsta LIKE t130m-pstat.
*
SELECT SINGLE vpsta
INTO l_vpsta
FROM mara
WHERE matnr = p_matnr.
*
* Get View sequence .................................................
DATA: l_bild LIKE t133a-bilds,
lt_bild LIKE mbildtab OCCURS 0 WITH HEADER LINE.
*
* Screen Sequence for Standard Industry tab pages in material master
l_bild = '21'.
*
* Get screen sequence
CALL FUNCTION 'SELECTION_VIEWS_FIND'
EXPORTING
bildsequenz = l_bild
pflegestatus = l_vpsta
TABLES
bildtab = lt_bild
EXCEPTIONS
call_wrong = 1
empty_selection = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*
* Get the Tab page for MRP1 .........................................
DATA: l_tab_mrp1 TYPE sy-ucomm.
*
* reading table with MRP view
READ TABLE lt_bild WITH KEY pstat = 'D'.
IF sy-subrc = 0.
l_tab_mrp1 = lt_bild-guifu.
ENDIF.
*
* make ok code for the MRP1
CONCATENATE '=' l_tab_mrp1 INTO l_tab_mrp1.
*
* BDC ...............................................................
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'RMMG1-MATNR'
p_matnr.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
*
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(01)'
'X'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
*
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE'
l_tab_mrp1.
*
PERFORM bdc_dynpro USING 'SAPLMGMM' '0081'.
PERFORM bdc_field USING 'RMMG1-WERKS'
p_werks.
PERFORM bdc_field USING 'RMMG1-LGORT'
p_lgort.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
*
PERFORM bdc_dynpro USING 'SAPLMGMM' '4000'.
PERFORM bdc_field USING 'MARC-DISMM'
p_dismm.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
*
PERFORM bdc_transaction USING 'MM02'.
*
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING p_program
p_screen.
*
MOVE: p_program TO bdcdata-program,
p_screen TO bdcdata-dynpro,
'X' TO bdcdata-dynbegin.
*
APPEND bdcdata.
CLEAR bdcdata.
*
ENDFORM. " BDC_DYNPRO
*
*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
FORM bdc_field USING p_field_name
p_field_value.
*
MOVE: p_field_name TO bdcdata-fnam,
p_field_value TO bdcdata-fval.
*
APPEND bdcdata.
CLEAR bdcdata.
*
ENDFORM. " BDC_FIELD
*
*
*&---------------------------------------------------------------------*
*& Form BDC_TRANSACTION
*&---------------------------------------------------------------------*
FORM bdc_transaction USING tcode.
DATA: l_mstring(480).
DATA: l_subrc LIKE sy-subrc.
* batch input session
REFRESH messtab.
CALL TRANSACTION tcode USING bdcdata
MODE 'A'
"A: show all dynpros
"E: show dynpro on error only
"N: do not display dynpro
*
UPDATE 'L'
MESSAGES INTO messtab.
REFRESH bdcdata.
ENDFORM. "BDC_TRANSACTION

Thursday, December 30, 2010

BDC Program for Transaction MI10

*---------------------------------------------------------------------*
* Report ZVVF_MR323_BDCMI10 *
*---------------------------------------------------------------------*
* *
* MODULE : Material Management *
* *
*---------------------------------------------------------------------*
* Objective : BDC Program for Transaction MI10.The Program will be *
* called from Module-pool Program ZVVF_MM032_PHYINV *
* when the user selects option 3)Posting Physical *
* Inventory Difference *
* Program : Update Tables (X) Download Data ( ) Outputs List ( )*
* Technical Specs No : *
* Date Created : *
* Author : *
* Location : *
* LDB : *
* *
*---------------------------------------------------------------------*
REPORT ZVVF_MR323_BDCMI10.

*---------------------------------------------------------------------*
* Structures Starts with WA_ *
*---------------------------------------------------------------------*
TYPES: BEGIN of WA_BDC,
ZLDAT(10) type c, " Count Date
BLDAT(10) type c, " Document Date
WERKS type werks_d, " Plant
LGORT type lgort_d, " Storage Location
MATNR type matnr_d, " Material
CHARG type charg_d, " Batch
ERFMG type menge_d, " Quantity
GRUND(4) type c, " Reason Movement
QUANTITY(13) TYPE C,
ERFME TYPE I_ERFME, " Unit of Entry
END of WA_BDC.

*---------------------------------------------------------------------*
* Internal Table Starts with IT_ *
*---------------------------------------------------------------------*
DATA: BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: IT_MSG TYPE TABLE OF BDCMSGCOLL.
DATA: IT_BDC TYPE WA_BDC OCCURS 0 WITH HEADER LINE.

*---------------------------------------------------------------------*
* Data Starts with W_ *
*---------------------------------------------------------------------*
DATA : EXT_PERIOD TYPE TPRG-PRGBZ,
INT_PERIOD TYPE TPRG-PRGRS VALUE 1.

*---------------------------------------------------------------------*
* Constants Starts with C_ *
*---------------------------------------------------------------------*
CONSTANTS : C_GRUND LIKE ISEG-GRUND VALUE '0004'.

*---------------------------------------------------------------------*
* START OF SELECTION *
*---------------------------------------------------------------------*
START-OF-SELECTION.

CALL FUNCTION 'PERIOD_AND_DATE_CONVERT_OUTPUT'
EXPORTING
* COUNTRY = ' '
INTERNAL_DATE = SY-DATUM
INTERNAL_PERIOD = INT_PERIOD
* LANGUAGE = SYST-LANGU
* I_PERIV =
* I_WERKS =
* I_MRPPP =
IMPORTING
EXTERNAL_DATE = IT_BDC-ZLDAT
EXTERNAL_PERIOD = EXT_PERIOD
* EXTERNAL_PRINTTEXT =
* EXCEPTIONS
* DATE_INVALID = 1
* PERIODE_INVALID = 2
* OTHERS = 3
.

it_bdc-bldat = IT_BDC-ZLDAT .

import matnr to it_bdc-matnr
charg to it_bdc-charg
menge to it_bdc-erfmg
lgort to it_bdc-lgort
werks to it_bdc-werks
meins to it_bdc-erfme
FROM MEMORY ID 'MM032_MI10'.

IT_BDC-QUANTITY = IT_BDC-ERFMG.
IT_BDC-GRUND = C_GRUND.

append it_bdc.

loop at it_bdc.

perform bdc_dynpro using 'SAPMM07I' '0700'.
perform bdc_field using 'BDC_CURSOR'
'IKPF-LGORT'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'RM07I-ZLDAT'
it_bdc-ZLDAT.
perform bdc_field using 'RM07I-BLDAT'
it_bdc-BLDAT.
perform bdc_field using 'IKPF-WERKS'
it_bdc-WERKS.
perform bdc_field using 'IKPF-LGORT'
it_bdc-LGORT.
perform bdc_dynpro using 'SAPMM07I' '0731'.
perform bdc_field using 'BDC_CURSOR'
'ISEG-GRUND(01)'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'ISEG-MATNR(01)'
it_bdc-MATNR.
perform bdc_field using 'ISEG-CHARG(01)'
it_bdc-CHARG.
perform bdc_field using 'ISEG-ERFMG(01)'
it_bdc-QUANTITY.
perform bdc_field using 'ISEG-GRUND(01)'
it_bdc-GRUND.
perform bdc_field using 'ISEG-ERFME(01)'
it_bdc-ERFME.

call transaction 'MI10' using BDCDATA mode 'E' update 'A'
MESSAGES INTO IT_MSG.

endloop.

*----------------------------------------------------------------------*
* FORM : Start new screen *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.

*----------------------------------------------------------------------*
* FORM : Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF FVAL <> ''.
CLEAR BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDIF.
ENDFORM.

BDC Program for Transaction MB1A

*---------------------------------------------------------------------*
* Report ZVVF_MR323_BDCMB1A *
*---------------------------------------------------------------------*
* *
* MODULE : Material Management *
* *
*---------------------------------------------------------------------*
* Objective : BDC Program for Transaction MB1A.The Program will be *
* called from Module-pool Program ZVVF_MM032_PHYINV *
* when the user selects option 1)Goods Issue to Process*
* order or 2)Return from Process Order. *
* Program : Update Tables (X) Download Data ( ) Outputs List ( )*
* Technical Specs No : *
* Date Created : *
* Author : *
* Location : *
* LDB : *
* *
*---------------------------------------------------------------------*
REPORT ZVVF_MR323_BDCMB1A.

*---------------------------------------------------------------------*
* Structures Starts with WA_ *
*---------------------------------------------------------------------*
DATA: BEGIN of WA_RECORD,
BLDAT(010), "Document Date
BUDAT(010), "Posting Date
BWARTWA(003), "Movement Type
WERKS(004), "Plant
LGORT(004), "Storage Location
XFULL,
AUFNR(012), "Process Order Number
XSELK(001) VALUE 'X', "CheckBox
ERFMG(013), "Quantity
ERFME(03), "Unit Of Entry
CHARG(010), "Batch
END of WA_RECORD.

DATA : BEGIN OF WA_GR,
AUFNR TYPE AUFNR,
CHARG TYPE CHARG_D,
INSMK TYPE MENGE_D,
MEINS TYPE MEINS,
END OF WA_GR.

*---------------------------------------------------------------------*
* Internal Table Starts with IT_ *
*---------------------------------------------------------------------*
DATA: IT_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: IT_RECORD LIKE WA_RECORD OCCURS 0 WITH HEADER LINE.
DATA: IT_MSG TYPE TABLE OF BDCMSGCOLL.
DATA: IT_GR LIKE WA_GR OCCURS 0 WITH HEADER LINE.

*---------------------------------------------------------------------*
* Data Starts with W_ *
*---------------------------------------------------------------------*
DATA: W_DATE(10) TYPE C,
W_EXTPERIOD TYPE TPRG-PRGBZ,
W_INTPERIOD TYPE TPRG-PRGRS VALUE 1,
W_MATNR TYPE MATNR,
W_BWART TYPE BWART,
W_WERKS TYPE WERKS_D,
W_LGORT TYPE LGORT_D.

*---------------------------------------------------------------------*
* START OF SELECTION *
*---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'PERIOD_AND_DATE_CONVERT_OUTPUT'
EXPORTING
* COUNTRY = ' '
INTERNAL_DATE = SY-DATUM
INTERNAL_PERIOD = W_INTPERIOD
* LANGUAGE = SYST-LANGU
* I_PERIV =
* I_WERKS =
* I_MRPPP =
IMPORTING
EXTERNAL_DATE = W_DATE
EXTERNAL_PERIOD = W_EXTPERIOD
* EXTERNAL_PRINTTEXT =
* EXCEPTIONS
* DATE_INVALID = 1
* PERIODE_INVALID = 2
* OTHERS = 3
.

IMPORT IT_GR FROM MEMORY ID 'MM032_TABLE'.
IMPORT MATNR TO W_MATNR
BWART TO W_BWART
WERKS TO W_WERKS
LGORT TO W_LGORT
FROM MEMORY ID 'MM032_MI10'.
import w_mtype to w_bwart from memory id 'MM032_MB1AD'.


LOOP AT IT_GR INTO WA_GR.
WA_RECORD-BLDAT = W_DATE.
WA_RECORD-BUDAT = W_DATE.
WA_RECORD-BWARTWA = W_BWART.
WA_RECORD-WERKS = W_WERKS.
WA_RECORD-LGORT = W_LGORT.
WA_RECORD-AUFNR = WA_GR-AUFNR.
WA_RECORD-XSELK = 'X'.
WA_RECORD-ERFMG = WA_GR-INSMK.
WA_RECORD-CHARG = WA_GR-CHARG.
WA_RECORD-ERFME = WA_GR-MEINS.
APPEND WA_RECORD TO IT_RECORD.
ENDLOOP.

LOOP AT IT_RECORD.
perform bdc_dynpro using 'SAPMM07M' '0400'.
perform bdc_field using 'BDC_CURSOR'
'RM07M-LGORT'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'MKPF-BLDAT'
IT_RECORD-BLDAT.
perform bdc_field using 'MKPF-BUDAT'
IT_RECORD-BUDAT.
perform bdc_field using 'RM07M-BWARTWA'
IT_RECORD-BWARTWA.
perform bdc_field using 'RM07M-WERKS'
IT_RECORD-WERKS.
perform bdc_field using 'RM07M-LGORT'
IT_RECORD-LGORT.
perform bdc_field using 'XFULL'
'X'.
perform bdc_field using 'RM07M-WVERS2'
'X'.

perform bdc_dynpro using 'SAPMM07M' '0421'.
perform bdc_field using 'BDC_CURSOR'
'MSEG-CHARG(01)'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'MSEG-MATNR(01)'
W_MATNR.
perform bdc_field using 'MSEG-ERFMG(01)'
IT_RECORD-ERFMG.
perform bdc_field using 'MSEG-ERFME(01)'
IT_RECORD-ERFME.
perform bdc_field using 'MSEG-CHARG(01)'
IT_RECORD-CHARG.

perform bdc_dynpro using 'SAPLKACB' '0002'.
perform bdc_field using 'BDC_OKCODE'
'=ENTE'.
perform bdc_field using 'COBL-AUFNR'
IT_RECORD-AUFNR.

perform bdc_dynpro using 'SAPLKACB' '0002'.
perform bdc_field using 'BDC_OKCODE'
'=ENTE'.
perform bdc_field using 'COBL-AUFNR'
IT_RECORD-AUFNR.

call transaction 'MB1A' using IT_bdcdata mode 'E' update 'A'
messages into it_msg.

ENDLOOP.

*----------------------------------------------------------------------*
* FORM Start new screen *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR IT_BDCDATA.
IT_BDCDATA-PROGRAM = PROGRAM.
IT_BDCDATA-DYNPRO = DYNPRO.
IT_BDCDATA-DYNBEGIN = 'X'.
APPEND IT_BDCDATA.
ENDFORM. "BDC_DYNPRO

*----------------------------------------------------------------------*
* FORM Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF FVAL <> ''.
CLEAR IT_BDCDATA.
IT_BDCDATA-FNAM = FNAM.
IT_BDCDATA-FVAL = FVAL.
APPEND IT_BDCDATA.
ENDIF.
ENDFORM. "BDC_FIELD

STOCK UPLOAD in MM Module

*&---------------------------------------------------------------------*
*& Report ZMB001_RM07MMBL_STOCK_UPLOAD *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT ZMB001_RM07MMBL_STOCK_UPLOAD NO STANDARD PAGE HEADING
LINE-SIZE 80.
*--------------------------sgp-----------------------------------------*
* MODULE : MM
*---------------------------------------------------------------------*
* Objective :..........................................

* Program : Updates Tables ( X ) Downloads data ( )
* Outputs List ( )
*
* Technical Spec No : ...............
* Functional Specifications :
* Date Created :
* Author :
* Location :
* Company :
*---------------------------------------------------------------------*
* External Dependencies *
*---------------------------------------------------------------------*
* Using Transaction : MB1C
*---------------------------------------------------------------------*
* Amendment History
*---------------------------------------------------------------------*
* Who Change ID Reason *
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ *
* XXXXXXXXX AADDMMYYYY Where XXXX = Developers Name................. *
* AA- Developers Initial ................................. *
* ........................................................ *
* ........................................................ *
*---------------------------------------------------------------------*

*---------------------------------------------------------------------*
* Includes *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
TABLES : T001W,
T148,
T157H,
LFA1,
MARA,
MBEW,
TGSB,
T030,
T134G,
T006,
MCH1,
SKAT,
MARD,
T001L,
MARC .
*---------------------------------------------------------------------*
* Types Begin with TY_
*---------------------------------------------------------------------*
*TYPES :
*---------------------------------------------------------------------*
* Constants Begin with C_
*---------------------------------------------------------------------*
*CONSTANTS:
*---------------------------------------------------------------------*
* Data Begin with W_
*---------------------------------------------------------------------*
DATA : WF_TOTAL_ERRORS TYPE I,
WF_ERFMG(13),
WF_EXWRT(13).
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Infotypes ( HR Module Specific)
*---------------------------------------------------------------------*
*INFOTYPES :
*---------------------------------------------------------------------*
* Internal tables Begin with IT_
*---------------------------------------------------------------------*
DATA : BEGIN OF IT_TAB OCCURS 0 ,
BLDAT(10),
BUDAT(10),
BWART LIKE RM07M-BWART,
WERKS LIKE RM07M-WERKS,
LGORT LIKE RM07M-LGORT,
SOBKZ LIKE RM07M-SOBKZ,
LIFNR LIKE LFA1-LIFNR,
GSBER LIKE COBL-GSBER,
MATNR LIKE MSEG-MATNR,
ERFMG LIKE MSEG-ERFMG,
ERFME LIKE MSEG-ERFME,
CHARG LIKE MSEG-CHARG,
EXWRT LIKE BMSEG-EXWRT,
BKTXT LIKE MKPF-BKTXT,
SGTXT LIKE MSEG-SGTXT.
* kdauf LIKE mseg-kdauf,
* kdpos LIKE mseg-kdpos.
DATA : END OF IT_TAB.

DATA : BEGIN OF IT_ACC OCCURS 0,
GSBER LIKE BSEG-GSBER,
WERKS LIKE BSEG-WERKS,
KONTS LIKE T030-KONTS,
EXWRT LIKE BSEG-WRBTR.
DATA : END OF IT_ACC.

DATA : BEGIN OF IT_BMSEG OCCURS 0 .
INCLUDE STRUCTURE BMSEG.
DATA : END OF IT_BMSEG.
*---------------------------------------------------------------------*
* Field Symbols Begin with FS_
*---------------------------------------------------------------------*
*FIELD-SYMBOLS:
*---------------------------------------------------------------------*
* Field Groups Begin with FG_
*---------------------------------------------------------------------*
*FIELD-GROUPS :
*---------------------------------------------------------------------*
* Insert
*---------------------------------------------------------------------*
*INSERT :
*---------------------------------------------------------------------*
* Controls Begin with TC_ for table controls
*---------------------------------------------------------------------*
*CONTROLS :
*---------------------------------------------------------------------*
* Select Options Begin with SO_
*---------------------------------------------------------------------*
*SELECT-OPTIONS :
*---------------------------------------------------------------------*
* Parameters Begin with PR_
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK MBLK0 WITH FRAME TITLE TEXT-001.
PARAMETERS : P_GROUP LIKE BGR00-GROUP OBLIGATORY DEFAULT 'OPENSTOCK',
P_XPROT LIKE BGR00-XKEEP DEFAULT 'X',
P_XSELK LIKE AM07M-XSELK.
SELECTION-SCREEN END OF BLOCK MBLK0.

SELECTION-SCREEN BEGIN OF BLOCK MBLK1 WITH FRAME TITLE TEXT-002.
PARAMETER P_FILE LIKE RLGRAP-FILENAME DEFAULT 'C:\mb1c.txt'.
SELECTION-SCREEN END OF BLOCK MBLK1.

SELECTION-SCREEN BEGIN OF BLOCK MBLKX WITH FRAME TITLE TEXT-006.
PARAMETERS : P_LOCAL RADIOBUTTON GROUP GRP1.
PARAMETER P_LOCLFN LIKE RLGRAP-FILENAME
DEFAULT 'C:\mmdata\openstock.txt'.
PARAMETERS : P_UNIX RADIOBUTTON GROUP GRP1.
PARAMETER P_UNIXFN LIKE RLGRAP-FILENAME
DEFAULT '/VVFuture/upload/mm/openstock.txt'.
PARAMETERS : P_RM07MM AS CHECKBOX.
PARAMETERS : P_LOGFIL LIKE FILENAME-FILEINTERN DEFAULT
'ZMM_OPEN_STOCK'.
*parameters: callmode like rfpdo-rfbifunct obligatory default 'B'.
SELECTION-SCREEN END OF BLOCK MBLKX.
PARAMETERS : P_QTYTOT AS CHECKBOX.
PARAMETERS : P_BUDAT LIKE BKPF-BUDAT OBLIGATORY DEFAULT '20040229'.
DATA : WF_TOTAL_QTY LIKE MSEG-MENGE,
WF_TOTAL_REC TYPE I,
WF_TOTAL_AMOUNT LIKE MSEG-DMBTR.
*---------------------------------------------------------------------*
* Initialisation
*---------------------------------------------------------------------*
*INITIALISATION :
*---------------------------------------------------------------------**
* At selection-screen
*---------------------------------------------------------------------*
*AT SELECTION-SCREEN.
************************************************************************
* S T A R T O F S E L E C T I O N
************************************************************************
START-OF-SELECTION.

PERFORM UPLOAD_DATA.
PERFORM CHECK_DATA.
* perform check_batch.
PERFORM DISPLAY_ACCOUNTING_INFORMATION.

IF WF_TOTAL_ERRORS = 0.
SKIP 2.
PERFORM FILL_RM07MMBL_FORMAT.
FORMAT COLOR = 7.
FORMAT COLOR OFF.
ELSE.
FORMAT COLOR = 6.
SKIP 2.
WRITE : /01 'Total Errors ', WF_TOTAL_ERRORS,
'File Not Generated for RM07MMBL', 132 ''.
FORMAT COLOR OFF.
ENDIF.
IF WF_TOTAL_ERRORS = 0.
IF P_LOCAL = 'X'.
PERFORM DOWNLOAD_DATA.
ELSE.
PERFORM SAVE_ON_UNIX_SERVE.
ENDIF.
ENDIF.
IF P_RM07MM = 'X' AND P_UNIX = 'X'.
IF WF_TOTAL_ERRORS = 0.
PERFORM CALLL_RM07MMBL.
ELSE.
SKIP 2.
WRITE : /01 'Session not created for RM07MMBL' COLOR COL_NEGATIVE.
ENDIF.
ENDIF.

END-OF-SELECTION.
************************************************************************
* E N D O F S E L E C T I O N
************************************************************************
*eject
*-----------------------------------------------------------------
* At line selection
*---------------------------------------------------------------------*
*AT LINE-SELECTION.
*---------------------------------------------------------------------*
* PF Key Processing
*---------------------------------------------------------------------*
*AT PFXX.
*---------------------------------------------------------------------*
* User Command Processing
*---------------------------------------------------------------------*
*AT USER-COMMAND.
*---------------------------------------------------------------------*
* Top Of Page
*---------------------------------------------------------------------*
*TOP-OF-PAGE.
*---------------------------------------------------------------------*
* End Of Page
*---------------------------------------------------------------------*
*END-OF-PAGE.*eject.
*----------------------------------------------------------------------*
* FORM Fnnn-xxxxxxxxxx.
*----------------------------------------------------------------------
* text
*----------------------------------------------------------------------
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------
*FORM FNNN-XXXXXXXX.
*----------------------------------------------------------------------*
* Local variables must begin with L, followed by the naming convention
* for the corresponding variable type eg. LW_, LIT_
*----------------------------------------------------------------------
*ENDFORM.*eject.*Any declarations for classes, methods and interfaces.

***********************---------------------****************************
* E N D O F A B A P
***********************---------------------****************************
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_DATA.
LOOP AT IT_TAB.

PERFORM CHECK_BWART. "Movement Type
PERFORM CHECK_WERKS. "Plant.
PERFORM CHECK_PLANT_FOR_MATERIAL.
PERFORM CHECK_LGORT. "Storage Location.
PERFORM CHECK_SOBKZ. "Special Stock Type
PERFORM CHECK_LIFNR. "Vendor Code
PERFORM CHECK_AND_GSBER. "Business Area
PERFORM CHECK_MATNR. "Material Code
PERFORM CHECK_ERFMG. "Quantity
PERFORM CHECK_ERFME. "Unit of Measurement
* PERFORM check_charg. "Batch No
PERFORM CHECK_EXWRT. "Amount.
PERFORM CHECK_SGTXT. "Text
PERFORM CHECK_BUDAT. "Posting Date
* PERFORM check_sales_order.
PERFORM FILL_ACCOUNTING_INFORMATION.
WF_TOTAL_QTY = WF_TOTAL_QTY + IT_TAB-ERFMG.
WF_TOTAL_AMOUNT = WF_TOTAL_AMOUNT + IT_TAB-EXWRT.
ADD 1 TO WF_TOTAL_REC.
ENDLOOP.
IF P_QTYTOT = 'X'.
WRITE : /01 'Total Records',15(10) WF_TOTAL_REC,
30 'Quantity ',41(13) WF_TOTAL_QTY DECIMALS 3,
55 'Amount :', 65(13) WF_TOTAL_AMOUNT DECIMALS 2.
ENDIF.
ENDFORM. " check_data
*&---------------------------------------------------------------------*
*& Form check_bwart
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_BWART.

IF NOT (
IT_TAB-BWART = '561' OR
IT_TAB-BWART = '563' OR
IT_TAB-BWART = '565' ).

PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-BWART
'Movement Type Should be 561'.
ENDIF.
ENDFORM. " check_bwart
*&---------------------------------------------------------------------*
*& Form write_error
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_TAB_MATNR text
* -->P_0099 text
*----------------------------------------------------------------------*
FORM WRITE_ERROR USING P_MATNR
P_FIELD
P_ERROR.
ADD 1 TO WF_TOTAL_ERRORS.
WRITE : /01 P_MATNR,
20 P_FIELD,
40 P_ERROR.
ENDFORM. " write_error
*&---------------------------------------------------------------------*
*& Form check_WERKS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_WERKS.
SELECT SINGLE * FROM T001W CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND WERKS = IT_TAB-WERKS.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-WERKS
'Invalid Plant'.
ENDIF.
ENDFORM. " check_WERKS
*&---------------------------------------------------------------------*
*& Form check_LGORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_LGORT.

IF NOT
( IT_TAB-BWART EQ '561' AND IT_TAB-SOBKZ EQ 'O' ) .
SELECT SINGLE * FROM T001L CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND WERKS = IT_TAB-WERKS
AND LGORT = IT_TAB-LGORT.

IF SY-SUBRC <> 0 .
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-LGORT
'Invalid storage Location for plant'.
ENDIF.
SELECT SINGLE * FROM MARD CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR
AND WERKS = IT_TAB-WERKS
AND LGORT = IT_TAB-LGORT.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-LGORT
'Invalid storage Location Material'.
ENDIF.
ENDIF.

ENDFORM. " check_LGORT
*&---------------------------------------------------------------------*
*& Form check_SOBKZ
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_SOBKZ.
IF NOT IT_TAB-SOBKZ IS INITIAL.
SELECT SINGLE * FROM T148 CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND SOBKZ = IT_TAB-SOBKZ.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-SOBKZ
'Special Stock Indicator'.
ENDIF.
SELECT SINGLE * FROM T157H CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND SPRAS = SY-LANGU
AND TCODE = 'MB1C'
AND BWART = IT_TAB-BWART
AND SOBKZ = IT_TAB-SOBKZ.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-SOBKZ
'Special Stock Indicator for Movement Type'.
ENDIF.

ENDIF.
ENDFORM. " check_SOBKZ
*&---------------------------------------------------------------------*
*& Form check_lifnr
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_LIFNR.
IF NOT IT_TAB-SOBKZ IS INITIAL.
CHECK IT_TAB-SOBKZ NE 'E'.
SELECT SINGLE * FROM LFA1 CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND LIFNR = IT_TAB-LIFNR.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-LIFNR
'Invalid Vendor Code'.
ENDIF.
ENDIF.
ENDFORM. " check_lifnr
*&---------------------------------------------------------------------*
*& Form check_gsber
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_AND_GSBER.
SELECT SINGLE * FROM MARA CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR.

SELECT SINGLE * FROM T134G CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND WERKS = IT_TAB-WERKS
AND SPART = MARA-SPART.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-GSBER
'Check Business Area detarmination for Plant'.
ELSE.
IT_TAB-GSBER = T134G-GSBER.
modify it_tab.
ENDIF.
ENDFORM. " check_gsber
*&---------------------------------------------------------------------*
*& Form check_matnr
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_MATNR.
SELECT SINGLE * FROM MARA CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR ' '
'Invalid Material Code'.
ENDIF.
ENDFORM. " check_matnr
*&---------------------------------------------------------------------*
*& Form check_ERFMG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_ERFMG.
IF IT_TAB-ERFMG IS INITIAL OR
IT_TAB-ERFMG < 0.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-ERFMG
'Quantity is zero or < zero'.
ENDIF.
ENDIF.
ENDFORM. " check_ERFMG
*&---------------------------------------------------------------------*
*& Form check_ERFME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_ERFME.

IF MARA-MEINS <> IT_TAB-ERFME.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-ERFME
'Invalid UOM for Material'.
ENDIF.

CHECK IT_TAB-ERFME NE 'CRT' OR IT_TAB-ERFME NE 'KI'.

SELECT SINGLE * FROM T006 CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MSEHI = IT_TAB-ERFME.
IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-ERFME
'Invalid UOM'.
ENDIF.
ENDFORM. " check_ERFME
*&---------------------------------------------------------------------*
*& Form check_CHARG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_CHARG.
IF NOT IT_TAB-CHARG IS INITIAL.
SELECT SINGLE * FROM MCH1 CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR
AND CHARG = IT_TAB-CHARG.
* as batches are already created in case of BFL,
IF SY-SUBRC NE 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-CHARG
'Batch no does not exist for this material'.
ENDIF.


ENDIF.
ENDFORM. " check_CHARG
*&---------------------------------------------------------------------*
*& Form check_exwrt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_EXWRT.
DATA : WF_DMBTR LIKE MSEG-DMBTR.

WF_DMBTR = IT_TAB-EXWRT.

IF IT_TAB-EXWRT < 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-EXWRT
'Amount can not be zero'.
ENDIF.

* IF it_tab-exwrt = 0.

IF WF_DMBTR = 0.
SELECT SINGLE * FROM MBEW CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR
AND BWKEY = IT_TAB-WERKS.
IF SY-SUBRC = 0 AND NOT MBEW-VERPR IS INITIAL.
PERFORM WRITE_ERROR USING IT_TAB-MATNR MBEW-VERPR
'Please reset Moving average price for material'.
ENDIF.
ENDIF.
ENDFORM. " check_exwrt
*&---------------------------------------------------------------------*
*& Form check_sgtxt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_SGTXT.
IF IT_TAB-SGTXT IS INITIAL.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-SGTXT
'Text can not be blank'.
ENDIF.
ENDFORM. " check_sgtxt
*&---------------------------------------------------------------------*
*& Form check_batch
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_BATCH.
DATA : BEGIN OF IT_BATCH OCCURS 0 ,
MATNR LIKE MSEG-MATNR,
CHARG LIKE MSEG-CHARG,
CTR TYPE I.
DATA : END OF IT_BATCH.
LOOP AT IT_TAB WHERE CHARG <> SPACE.
IT_BATCH-MATNR = IT_TAB-MATNR.
IT_BATCH-CHARG = IT_TAB-CHARG.
IT_BATCH-CTR = 1.
COLLECT IT_BATCH.
ENDLOOP.

LOOP AT IT_BATCH WHERE CTR > 1.
PERFORM WRITE_ERROR USING IT_BATCH-MATNR IT_BATCH-CHARG
'Duplicate batch no for This Material'.
ENDLOOP.
ENDFORM. " check_batch
*&---------------------------------------------------------------------*
*& Form display_accounting_information
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DISPLAY_ACCOUNTING_INFORMATION.

WRITE : /01 'Account wise Stock'.
FORMAT COLOR = 3.
WRITE : /01 SY-ULINE(132).
SORT IT_ACC BY GSBER WERKS KONTS.
LOOP AT IT_ACC.
SELECT SINGLE * FROM SKAT CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND SPRAS = SY-LANGU
AND KTOPL = 'BFL'
AND SAKNR = IT_ACC-KONTS.

WRITE : /01 IT_ACC-GSBER,
06 IT_ACC-WERKS,
11 IT_ACC-KONTS ,
22 SKAT-TXT20,
65(15) IT_ACC-EXWRT DECIMALS 2.
ENDLOOP.
FORMAT COLOR OFF.
WRITE : /01 SY-ULINE(132).
ENDFORM. " display_accounting_information
*&---------------------------------------------------------------------*
*& Form fill_accounting_information
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FILL_ACCOUNTING_INFORMATION.
IF IT_TAB-EXWRT > 0.
SELECT SINGLE * FROM MBEW CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR
AND BWKEY = IT_TAB-WERKS.
SELECT SINGLE * FROM T030 CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND KTOPL = 'VCOA'
AND KTOSL = 'BSX'
* AND BWMOD = ___
* AND KOMOK = ___
AND BKLAS = MBEW-BKLAS.

IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-WERKS
'Standard Accounts Table not maintain for plant'.
ELSE.
IT_ACC-GSBER = IT_TAB-GSBER.
IT_ACC-WERKS = IT_TAB-WERKS.
IT_ACC-KONTS = T030-KONTS.
IT_ACC-EXWRT = IT_TAB-EXWRT.
COLLECT IT_ACC.
ENDIF.
ENDIF.
ENDFORM. " fill_accounting_information
*&---------------------------------------------------------------------*
*& Form upload_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM UPLOAD_DATA.
DATA : FNAME TYPE STRING.
FNAME = P_FILE.
CONSTANTS: CON_TAB TYPE CHAR01 VALUE 'X'.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = FNAME
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = CON_TAB
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
DATA_TAB = IT_TAB
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.



* CALL FUNCTION 'WS_UPLOAD'
* EXPORTING
* FILENAME = p_FILE
* FILETYPE = 'DAT'
* TABLES
* DATA_TAB = it_tab.
ENDFORM. " upload_data
*&---------------------------------------------------------------------*
*& Form fill_RM07MMBL_format
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FILL_RM07MMBL_FORMAT.
LOOP AT IT_TAB.
IT_BMSEG-MAPPE = P_GROUP.
IT_BMSEG-TCODE = 'MB1C'.
IT_BMSEG-BWART = IT_TAB-BWART.
IT_BMSEG-BLDAT = IT_TAB-BLDAT.
IT_BMSEG-BUDAT = IT_TAB-BUDAT.
IT_BMSEG-BKTXT = IT_TAB-BKTXT.
IT_BMSEG-MATNR = IT_TAB-MATNR.
IT_BMSEG-WERKS = IT_TAB-WERKS.
IT_BMSEG-LGORT = IT_TAB-LGORT.
IT_BMSEG-CHARG = IT_TAB-CHARG.
IT_BMSEG-LIFNR = IT_TAB-LIFNR.
IT_BMSEG-SOBKZ = IT_TAB-SOBKZ.
IT_BMSEG-GSBER = IT_TAB-GSBER.
IT_BMSEG-ERFMG = IT_TAB-ERFMG.
IT_BMSEG-ERFME = IT_TAB-ERFME.
IT_BMSEG-EXWRT = IT_TAB-EXWRT.
IT_BMSEG-SGTXT = IT_TAB-SGTXT.
* it_bmseg-kdauf = it_tab-kdauf.
* it_bmseg-kdpos = it_tab-kdpos.
APPEND IT_BMSEG.
ENDLOOP.
ENDFORM. " fill_RM07MMBL_format
*&---------------------------------------------------------------------*
*& Form download_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DOWNLOAD_DATA.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = P_LOCLFN
FILETYPE = 'ASC'
TABLES
DATA_TAB = IT_BMSEG.
IF SY-SUBRC <> 0.
FORMAT COLOR = 6.
WRITE : /01 'Error occurs at time of download file',132 ''.
ELSE.
FORMAT COLOR = 5.
WRITE : /01 'Fill Successfully Generated into ',132 ''.
WRITE : /01 P_LOCLFN, 132 ''.
WRITE : /'Copy this file to unix server and run program RM07MMBL',
132 ''.
ENDIF.

ENDFORM. " download_data
*&---------------------------------------------------------------------*
*& Form save_on_unix_serve
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SAVE_ON_UNIX_SERVE.
DATA : ERRFLAG.
* CONCATENATE p_unixfn INTO p_unixfn.
OPEN DATASET P_UNIXFN FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .
IF SY-SUBRC NE 0.
ERRFLAG = 'X'.
MESSAGE I002(MG) WITH P_UNIXFN.
MESSAGE A099(MG).
ENDIF.
LOOP AT IT_BMSEG.
TRANSFER IT_BMSEG TO P_UNIXFN.
IF SY-SUBRC NE 0.
ERRFLAG = 'X'.
MESSAGE I001(MG) WITH P_UNIXFN.
MESSAGE A099(MG).
ENDIF.
ENDLOOP.
CLOSE DATASET P_UNIXFN .

IF ERRFLAG = 'X'.
FORMAT COLOR = 6.
WRITE : /01 'File not save on unix Server' , 132 ''.
FORMAT COLOR OFF.
ELSE.
FORMAT COLOR = 5.
WRITE : /'File Successfuly Save on Unix Server', 132 ''.
WRITE : / P_UNIXFN , 132 ''.
IF P_RM07MM IS INITIAL.
WRITE : /'Run program RM07MMBL' , 132 ''.
ENDIF.
FORMAT COLOR OFF.
ENDIF.

ENDFORM. " save_on_unix_serve
*&---------------------------------------------------------------------*
*& Form calll_rm07mmbl
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CALLL_RM07MMBL.
* change max no of line to 475
SUBMIT RM07MMBL WITH DS_NAME = P_LOGFIL
* with MAXPO = 1
WITH MAXPO = 475
WITH P_UNAME = SY-UNAME
WITH XPROT = 'X'
AND RETURN.
SKIP 2.
FORMAT COLOR = 5.
WRITE : /01 'Run Session',P_GROUP ,132 ''.
FORMAT COLOR OFF.

ENDFORM. " calll_rm07mmbl
*&---------------------------------------------------------------------*
*& Form check_budat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_BUDAT.
IF IT_TAB-BUDAT <> P_BUDAT.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-BUDAT
'Invalid Posting Date'.
ENDIF.

ENDFORM. " check_budat
*&---------------------------------------------------------------------*
*& Form check_plant_for_material
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_PLANT_FOR_MATERIAL .
SELECT SINGLE * FROM MARC CLIENT SPECIFIED
WHERE MANDT = SY-MANDT
AND MATNR = IT_TAB-MATNR
AND WERKS = IT_TAB-WERKS .


IF SY-SUBRC <> 0.
PERFORM WRITE_ERROR USING IT_TAB-MATNR IT_TAB-WERKS
'Material not maintained for Plant'.
ENDIF.

ENDFORM. " check_plant_for_material
*&---------------------------------------------------------------------*
*& Form check_sales_order
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHECK_SALES_ORDER .

* CHECK it_tab-bwart EQ '561' .
* CHECK it_tab-sobkz EQ 'E' .
*
* IF it_tab-kdauf IS INITIAL OR
* it_tab-kdpos IS INITIAL.
*
* PERFORM write_error USING it_tab-matnr it_tab-werks
* 'Sales order/item missing ' .
* ENDIF.

ENDFORM. " check_sales_order

link us...

For Visitors

if you want to publish or Add something on ERP, SAP , SAP FUNCTIONAL, SAP ABAP then mail us along with your email-id. contain must be yours

email-id :- avinashkr_raj@yahoo.com(any email)

email-id :- avinaskr_raj.abap@blogger.com ( use only gmail)