Make your own free website on Tripod.com

SAP PM & ABAP Code Niraj Visnoi

Real SAP ABP BDC Code
Home
What is SAP ?
SAP LSMW Explained with example
SAP PM T-Codes
PM BRD/COR Maintenance
Add Your URL
User Exits & Enhancements
Best Of SAP Links
BDC Code
My Resume
SAP SmartForms Step by Step
SAP ABAP ALV Grid Explained with Example
Useful Tips
Contact Information Guest Book and Consultants List
ABAP Code
ABAP System Fields
SAPScript
SAPScript Graphics
SAPScript Print Program
ABAP ListViewer
Dialog Programming
SAP Tables
SAP ALE and IDOC
Recommended SAP ABAP Coding guidelines
SAP General ABAP
Submit Your Code
SAP Books For consultants
Free Website Submission and ROR Sitemap generator
Free Domain Search
Free HoroScope

Real SAP ABAP BDC Code 

This BDC Code has been submitted by Mr ASHIM CHOWDHURY.
 
NAME: Ashim Chowdhury

SENDEREMAIL: ashim_chowdhury@yahoo.com

DESCRIPTION: BDC program for upload demand (BATCH SESSION - MD11) 
Using excel sheet for data upload

YOURCODE:
*&---------------------------------------------------------------------*
*& Report  ZTBPP102                                                    *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Title: BDC program for upload demand (BATCH SESSION - MD11)         *
*&                                                                     *
*&---------------------------------------------------------------------*
* Essential Steps :
* 1. Read the data from excel file into ABAP internal table using
*    function module ALSM_EXCEL_TO_INTERNAL_TABLE
* 2. Store the data in internal table and do the validation
* 3. For valid data create a Batch session (MD11)
*    Insert data from the internal table into the batch
* 4. Once the batch is created the user needs to process the batch
*    by going through SM35
*----------------------------------------------------------------------*


REPORT  ztbpp102.
* ------------------- Start of Data Declaration -----------------------*

* Constants
CONSTANTS: c_begcol TYPE i VALUE 1,
            c_begrow TYPE i VALUE 1,
            c_endcol TYPE i VALUE 100,
            c_endrow TYPE i VALUE 32000,
            c_x(1) TYPE c VALUE 'X'.


DATA : w_field(30),
* Flag for data check status
        w_invalid_data(1) TYPE c.


FIELD-SYMBOLS : <fs> TYPE ANY.


* Internal Tables
* The prefix 000n is becuase the colmn in alsmex_tabline isof data
* type n withg length 4
TYPES: BEGIN OF ty_tab,
           cell_0001 TYPE alsmex_tabline-value,  "Plant
           cell_0002 TYPE alsmex_tabline-value,  "Material No
           cell_0003 TYPE alsmex_tabline-value,  "Order Start Date
           cell_0004 TYPE alsmex_tabline-value,  "Order finish Date
           cell_0005 TYPE alsmex_tabline-value,  "Quantity
           cell_0006 TYPE alsmex_tabline-value,  "Quantity unit DV1K905068
        END OF ty_tab.

TYPES: BEGIN OF ty_error,
         line TYPE string,
        END OF ty_error.


TYPES: BEGIN OF ty_mara,
          matnr TYPE mara-matnr,
        END OF ty_mara.

TYPES: BEGIN OF ty_t001w,
          werks TYPE t001w-werks,
        END OF ty_t001w.


DATA: it_upload_data LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE,
       it_tab TYPE STANDARD TABLE OF ty_tab,
       wa_tab TYPE ty_tab,
* Internal table for BDC
     it_bdcdata TYPE STANDARD TABLE OF bdcdata,
*work area
      wa_bdcdata TYPE bdcdata,

* Internal table to store error
      it_error TYPE STANDARD TABLE OF ty_error,
      wa_error TYPE ty_error,
      it_mara TYPE STANDARD TABLE OF ty_mara,
      wa_mara TYPE ty_mara,
      it_t001w TYPE STANDARD TABLE OF ty_t001w,
      wa_t001w TYPE ty_t001w.


* ------------------- End of Data Declaration -----------------------*


*------------       Start of Selection Screen   -----------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_file LIKE rlgrap-filename MEMORY ID m02,
             p_sesson TYPE apqi-groupid DEFAULT 'DMND_UPLOAD'.
SELECTION-SCREEN: END OF BLOCK b1.
*------------       End of Selection Screen   -------------------------*

* Event INITIALIZATION
INITIALIZATION.
   CLEAR: w_invalid_data, w_field.
   REFRESH: it_upload_data, it_tab, it_error, it_bdcdata, it_mara,
            it_t001w.

*--------------  Start of at selection-screen -------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* Show the file selection dialog box
   CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
     EXPORTING
       mask          = '(*.xls)|*.xls|(*.*)|*.*' "For excel
       static        = 'X'
     CHANGING
       file_name     = p_file
     EXCEPTIONS
       mask_too_long = 1
       OTHERS        = 2.
   IF sy-subrc <> 0.
     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
   ENDIF.

*--------------- End of at Selection-screen ---------------------------*

* START-OF-SELECTION
START-OF-SELECTION.
* Upload the excel data into the program
   PERFORM upload_file.

* Populate data in internal table it_tab from excel upload data
   PERFORM populate_it_tab_from_excel.

* Check the mandatory fields
   PERFORM check_data.

* When the dataset is valid proceed
   IF w_invalid_data IS INITIAL.

* Open the BDC session
     PERFORM open_group.

* Populate BDC table
     PERFORM populate_bdc_session.

* Close the BDC session
     PERFORM close_group.

     WRITE:/ 'Batch input session '(m01), p_sesson, ' created
successfully'(m02).
     WRITE:/ 'Please process the session using transaction SM35'(m03).
   ELSE.
     WRITE:/ 'Error in Input Data :'(m04).
     SKIP 1.
     LOOP AT it_error INTO wa_error.
       WRITE:/ wa_error-line.
     ENDLOOP.
     SKIP 1.
     WRITE: 'Please correct error and try to upload again'(m05).
   ENDIF.


*&---------------------------------------------------------------------*
*&      Form  UPLOAD_FILE
*&---------------------------------------------------------------------*
* Upload the data from the excel file into ABAP internal table
*----------------------------------------------------------------------*
FORM upload_file .

* Upload the excel file in ABAP internal table
   CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
     EXPORTING
       filename                = p_file
       i_begin_col             = c_begcol
       i_begin_row             = c_begrow
       i_end_col               = c_endcol
       i_end_row               = c_endrow
     TABLES
       intern                  = it_upload_data
     EXCEPTIONS
       inconsistent_parameters = 1
       upload_ole              = 2
       OTHERS                  = 3.

   IF sy-subrc <> 0.
     MESSAGE i999(zttl) WITH 'Error in uploading the file!'(m06).
     LEAVE LIST-PROCESSING.
   ENDIF.

ENDFORM.                    " UPLOAD_FILE
*&---------------------------------------------------------------------*
*&      Form  populate_it_tab_from_excel
*&---------------------------------------------------------------------*
*  Populate data in internal table it_tab from excel upload data
*----------------------------------------------------------------------*
FORM populate_it_tab_from_excel .

   DATA: l_col_no TYPE alsmex_tabline-col.

* Internal table  it_upload_data store data in cellwise
* with row, colmn and value
* Change this data to a row-wise data and populate the table it_tab
   SORT it_upload_data BY row col.

* Delete the entries with row 0001 as those row has the colmn headings
   DELETE it_upload_data WHERE row = '0001'.

* Convert the excel data to row-wise data
   LOOP AT it_upload_data.
     l_col_no  = it_upload_data-col.
     CONCATENATE 'WA_TAB-cell_' l_col_no INTO w_field.
     ASSIGN (w_field) TO <fs>.
     IF sy-subrc = 0.
       <fs> = it_upload_data-value.
     ENDIF.
     AT END OF row.
       APPEND wa_tab TO it_tab.
       CLEAR wa_tab.
     ENDAT.

   ENDLOOP.

   IF it_tab[] IS INITIAL.
     MESSAGE i999(zttl) WITH 'No record to upload!'(m07).
     LEAVE LIST-PROCESSING.
   ENDIF.
ENDFORM.                    " populate_it_tab_from_excel
*&---------------------------------------------------------------------*
*&      Form  check_data
*&---------------------------------------------------------------------*
* Do data validation
*----------------------------------------------------------------------*
FORM check_data .

   DATA: l_error TYPE string,
         l_line_no(4) TYPE c,
         l_it_tab_temp TYPE STANDARD TABLE OF ty_tab,
         l_it_mara TYPE STANDARD TABLE OF ty_mara,
         l_it_t001w TYPE STANDARD TABLE OF ty_t001w,
         l_gsmng TYPE plaf-gsmng,
         l_matnr TYPE plaf-matnr.


* Select plant data from T001w
* Cell_0001 is for plant
   IF NOT it_tab[] IS INITIAL.
     REFRESH l_it_tab_temp.
     l_it_tab_temp[] = it_tab[].

     SORT l_it_tab_temp BY cell_0001.
     DELETE ADJACENT DUPLICATES FROM l_it_tab_temp COMPARING cell_0001.
     LOOP AT l_it_tab_temp INTO wa_tab.
       wa_t001w-werks = wa_tab-cell_0001.
       TRANSLATE  wa_t001w-werks TO UPPER CASE.           "#EC TRANSLANG
       APPEND wa_t001w TO l_it_t001w.
     ENDLOOP.

     IF NOT l_it_t001w[] IS INITIAL.
       SELECT werks
       FROM t001w
       INTO TABLE it_t001w
       FOR ALL ENTRIES IN l_it_t001w
       WHERE werks = l_it_t001w-werks.

       IF sy-subrc = 0.
         SORT it_t001w BY werks.
       ENDIF.
     ENDIF.
   ENDIF.


*Select data from Material master
   IF NOT it_tab[] IS INITIAL.
     REFRESH l_it_tab_temp.
     l_it_tab_temp[] = it_tab[].

* Cell 0002 is for material no
     SORT l_it_tab_temp BY cell_0002.
     DELETE ADJACENT DUPLICATES FROM l_it_tab_temp COMPARING cell_0002.
     LOOP AT l_it_tab_temp INTO wa_tab.
* call a conversion exit
       CLEAR l_matnr.

       CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
         EXPORTING
           input  = wa_tab-cell_0002
         IMPORTING
           output = l_matnr.

       TRANSLATE l_matnr TO UPPER CASE.                   "#EC TRANSLANG
       wa_mara-matnr = l_matnr.
       APPEND wa_mara TO l_it_mara.
     ENDLOOP.

     IF NOT l_it_mara[] IS INITIAL.
       SELECT matnr
       FROM mara
       INTO TABLE it_mara
       FOR ALL ENTRIES IN l_it_mara
       WHERE matnr = l_it_mara-matnr.

       IF sy-subrc = 0.
         SORT it_mara BY matnr.
       ENDIF.
     ENDIF.
   ENDIF.



*Check on mandatory field
   LOOP AT it_tab INTO wa_tab.
     l_line_no = sy-tabix.
* Increase the line no by 1 as the first row (have the heading)
* is not considered
     l_line_no = l_line_no + 1.



* Check for plant (cell_0001)
     IF wa_tab-cell_0001 IS INITIAL.
       CLEAR: l_error, wa_error.
       CONCATENATE text-m08 l_line_no ': Plant is mandatory'(m13)
         INTO l_error SEPARATED BY space.
       wa_error-line = l_error.
       APPEND wa_error TO it_error.
       w_invalid_data = c_x.
     ELSE.
* Check for valid plant
       CLEAR wa_t001w.
       TRANSLATE  wa_tab-cell_0001 TO UPPER CASE.         "#EC TRANSLANG
       READ TABLE it_t001w INTO wa_t001w WITH KEY werks = wa_tab-cell_0001
                                                BINARY SEARCH.
       IF sy-subrc <> 0.
         CLEAR: l_error, wa_error.
         CONCATENATE text-m08 l_line_no ': Invalid plant '(m14)
wa_tab-cell_0001
           INTO l_error SEPARATED BY space.
         wa_error-line = l_error.
         APPEND wa_error TO it_error.
         w_invalid_data = c_x.

       ENDIF.
     ENDIF.


* Check for material number (Cell_0002)
     IF wa_tab-cell_0002 IS INITIAL.
       CLEAR: l_error, wa_error.
       CONCATENATE 'Line'(m08) l_line_no ': Material no is mandatory'(m11)
         INTO l_error SEPARATED BY space.
       wa_error-line = l_error.
       APPEND wa_error TO it_error.
       w_invalid_data = c_x.
     ELSE.

* Check for valid material
       CLEAR wa_mara.
       TRANSLATE  wa_tab-cell_0002 TO UPPER CASE.         "#EC TRANSLANG
       READ TABLE it_mara INTO wa_mara WITH KEY matnr = wa_tab-cell_0002
                                                BINARY SEARCH.
       IF sy-subrc <> 0.
         CLEAR: l_error, wa_error.
         CONCATENATE text-m08 l_line_no ': Invalid Material no'(m12)
wa_tab-cell_0002
           INTO l_error SEPARATED BY space.
         wa_error-line = l_error.
         APPEND wa_error TO it_error.
         w_invalid_data = c_x.

       ENDIF.
     ENDIF.



* Check for quantity (cell_0005)
     IF wa_tab-cell_0005 IS INITIAL.
       CLEAR: l_error, wa_error.
       CONCATENATE text-m08 l_line_no ': Order quantity is mandatory'(m21)
         INTO l_error SEPARATED BY space.
       wa_error-line = l_error.
       APPEND wa_error TO it_error.
       w_invalid_data = c_x.
     ELSE.

* Check that quantity is a number
       CLEAR: l_gsmng.
       CATCH SYSTEM-EXCEPTIONS conversion_errors = 1.
         l_gsmng = wa_tab-cell_0005.
         IF l_gsmng = 0.
           CLEAR: l_error, wa_error.
           CONCATENATE 'Line'(m08) l_line_no ': Quantity cannot be zero'(m22)
             INTO l_error SEPARATED BY space.
           wa_error-line = l_error.
           APPEND wa_error TO it_error.
           w_invalid_data = c_x.
         ENDIF.
       ENDCATCH.
* If there is a conversion error
       IF sy-subrc = 1.
         CLEAR: l_error, wa_error.
         CONCATENATE 'Line'(m08) l_line_no ': Quantity'(m23)
wa_tab-cell_0005 'is not a number'(m24)
           INTO l_error SEPARATED BY space.
         wa_error-line = l_error.
         APPEND wa_error TO it_error.
         w_invalid_data = c_x.
       ENDIF.

     ENDIF.

* Start of insert DV1K905068
     IF wa_tab-cell_0006 IS INITIAL.
       CLEAR: l_error, wa_error.
       CONCATENATE text-m08 l_line_no ': Quantity unit is mandatory'(m25)
         INTO l_error SEPARATED BY space.
       wa_error-line = l_error.
       APPEND wa_error TO it_error.
       w_invalid_data = c_x.
     ENDIF.
* End of insert DV1K905068

* Order finish date is mandatory (Cell_0004)
     IF wa_tab-cell_0004 IS INITIAL.
       CLEAR: l_error, wa_error.
       CONCATENATE text-m08 l_line_no ': Order finish date is mandatory'(m15)
         INTO l_error SEPARATED BY space.
       wa_error-line = l_error.
       APPEND wa_error TO it_error.
       w_invalid_data = c_x.
     ENDIF.

   ENDLOOP.

ENDFORM.                    " check_data
*&---------------------------------------------------------------------*
*&      Form  open_group
*&---------------------------------------------------------------------*
* Open the BDC session
*----------------------------------------------------------------------*
FORM open_group .

   CALL FUNCTION 'BDC_OPEN_GROUP'
     EXPORTING
       client              = sy-mandt
       group               = p_sesson
       keep                = c_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 i999(zttl) WITH 'Error in creating session'(m16).
     LEAVE LIST-PROCESSING.
   ENDIF.

ENDFORM.                    " open_group
*&---------------------------------------------------------------------*
*&      Form  close_group
*&---------------------------------------------------------------------*
* Close the BDC session
*----------------------------------------------------------------------*
FORM close_group .
   CALL FUNCTION 'BDC_CLOSE_GROUP'
     EXCEPTIONS
       not_open    = 1
       queue_error = 2
       OTHERS      = 3.
   IF sy-subrc <> 0.
     MESSAGE i999(zttl) WITH 'Error in closing session'(m17).
     LEAVE LIST-PROCESSING.

   ENDIF.

ENDFORM.                    " close_group
*&---------------------------------------------------------------------*
*&      Form  populate_bdc_session
*&---------------------------------------------------------------------*
* Populate the BDC table
*----------------------------------------------------------------------*
FORM populate_bdc_session .


   DATA: l_gsmng TYPE plaf-gsmng,                            "DV1K905068
         l_meins_in TYPE mara-meins,                         "DV1K905068
         l_matnr TYPE mara-matnr,                            "DV1K905068
         l_string_gsmng TYPE string.                         "DV1K905068

   LOOP AT it_tab INTO wa_tab.
     REFRESH it_bdcdata.
     CLEAR: wa_bdcdata.
* First screen of transaction MD111
     PERFORM bdc_dynpro USING 'SAPMM61P' '0100'.

* Data fiels in screen 0100
     PERFORM bdc_field  USING 'BDC_CURSOR' 'RM61P-PASCH'.
     PERFORM bdc_field  USING 'BDC_OKCODE' '/00'.
* Planned order profile is always LA
     PERFORM bdc_field  USING 'RM61P-PASCH' 'LA'.

* Screen 2
     PERFORM bdc_dynpro USING 'SAPLM61O' '0110'.

* Data fiels in screen 0110
* Start of change DV1K904978
*    PERFORM bdc_field  USING 'BDC_OKCODE' '=TERM'.
     PERFORM bdc_field  USING 'BDC_OKCODE' '/00'.
* End of change DV1K904978

* Material no
     PERFORM bdc_field  USING 'PLAF-MATNR' wa_tab-cell_0002.
* Plant
     PERFORM bdc_field  USING 'PLAF-PLWRK' wa_tab-cell_0001.
     PERFORM bdc_field  USING 'BDC_SUBSCR' 'SAPLM61O                 
               0711INCLUDE1XX'.
     PERFORM bdc_field  USING 'BDC_SUBSCR' 'SAPLM61O                 
               0802INCLUDE711_1'.
     PERFORM bdc_field  USING 'BDC_CURSOR' 'PLAF-PEDTR'.

* Strat of change DV1K905068
* Do a material unit conversion from given unit to kg
* Use local variable as the fn module needs variable of
* type meins

     CLEAR: l_meins_in, l_matnr, l_gsmng, l_string_gsmng .
     l_meins_in = wa_tab-cell_0006.
     l_matnr    = wa_tab-cell_0002.

* Convert unit text to upper case
     TRANSLATE l_matnr TO UPPER CASE.                "#EC TRANSLANG
     TRANSLATE l_meins_in TO UPPER CASE.                "#EC TRANSLANG

* Conversion exit on unit
     CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
       EXPORTING
         input          = l_meins_in
         language       = sy-langu
       IMPORTING
         output         = l_meins_in
       EXCEPTIONS
         unit_not_found = 1
         OTHERS         = 2.

     IF sy-subrc <> 0.
       WRITE:/ 'Unit not maintained ', l_meins_in.
       CONTINUE.
     ENDIF.

* Converting the amount
     CATCH SYSTEM-EXCEPTIONS conversion_errors = 1.
       l_gsmng = wa_tab-cell_0005.
     ENDCATCH.

     IF sy-subrc <> 0.
       WRITE:/ 'Quantity is not in proper format ', wa_tab-cell_0005.
       CONTINUE.
     ENDIF.

     CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
       EXPORTING
         i_matnr              = l_matnr
         i_in_me              = l_meins_in
         i_out_me             = 'KG'
         i_menge              = l_gsmng
       IMPORTING
         e_menge              = l_gsmng
       EXCEPTIONS
         error_in_application = 1
         error                = 2
         OTHERS               = 3.
     IF sy-subrc <> 0.
       WRITE:/ 'Material Unit conversion not maintained for ',
wa_tab-cell_0002.
       CONTINUE.
     ELSE.
* Assign to straig type variable as gsmng is packed and cannot be appended
* directly to the BDC session
       l_string_gsmng = l_gsmng.
     ENDIF.

* Quantity
*    PERFORM bdc_field  USING 'PLAF-GSMNG' wa_tab-cell_0005.
     PERFORM bdc_field  USING 'PLAF-GSMNG' l_string_gsmng.
* End of change DV1K905068

* Order finish date
     PERFORM bdc_field  USING 'PLAF-PEDTR' wa_tab-cell_0004.

* Order start date
     PERFORM bdc_field  USING 'PLAF-PSTTR' wa_tab-cell_0003.

     PERFORM bdc_field  USING 'BDC_SUBSCR' 'SAPLM61O                 
               0810INCLUDE711_2'.


* Screen 3
     PERFORM bdc_dynpro USING 'SAPLM61O' '0110'.

* Data fiels in screen 0110
     PERFORM bdc_field  USING 'BDC_CURSOR' 'PLAF-MATNR'.
     PERFORM bdc_field  USING 'BDC_OKCODE' 'HZPL'.
     PERFORM bdc_field  USING 'BDC_SUBSCR' 'SAPLM61O                 
               0715INCLUDE1XX'.

*Transfer data to batch input by transaction
     CALL FUNCTION 'BDC_INSERT'
       EXPORTING
         tcode          = 'MD11'
       TABLES
         dynprotab      = it_bdcdata
       EXCEPTIONS
         internal_error = 1
         not_open       = 2
         queue_error    = 3
         tcode_invalid  = 4
         OTHERS         = 5.

     IF sy-subrc <> 0.
       MESSAGE i999(zttl) WITH 'Error in creating session'(m20).
       LEAVE LIST-PROCESSING.

     ENDIF.
   ENDLOOP.


ENDFORM.                    " populate_bdc_session
*&---------------------------------------------------------------------*
*&      Form  bdc_dynpro
*&---------------------------------------------------------------------*
*  Populate the dynpros
*----------------------------------------------------------------------*
*      -->P_pogram   Progran name
*      -->P_dynpro   Screen no
*----------------------------------------------------------------------*
FORM bdc_dynpro  USING    p_program TYPE bdc_prog
                           p_dynpro TYPE bdc_dynr.

   CLEAR wa_bdcdata.
   wa_bdcdata-program  = p_program.
   wa_bdcdata-dynpro   = p_dynpro.
   wa_bdcdata-dynbegin = c_x.
   APPEND wa_bdcdata TO it_bdcdata.

ENDFORM.                    " bdc_dynpro
*&---------------------------------------------------------------------*
*&      Form  bdc_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_fnam   Field name
*      -->P_fval   Field value
*----------------------------------------------------------------------*
FORM bdc_field  USING   p_fnam TYPE fnam_____4
                         p_fval.

   CLEAR wa_bdcdata.
   wa_bdcdata-fnam  = p_fnam.
   wa_bdcdata-fval   = p_fval.
   APPEND wa_bdcdata TO it_bdcdata.
ENDFORM.                    " bdc_field

http://sap.niraj.tripod.com

http://sap.niraj.tripod.com

Search http://sap.niraj.tripod.com Search www

 http://sap.niraj.tripod.com      Niraj Visnoi *INDIA * niraj_visnoi@consultant.com      
 CELL No. 91 9911413767       Copyright 2006 all rights reserved