BDC program for Purchase Info Records

*&---------------------------------------------------------------------*
*&   REPORT ZMM0069                                                    *
*&---------------------------------------------------------------------*
*& Module : MM                                                         |
*& Application : The program loads the Purchasing Inforecords          |
*&                                                                     |
*----------------------------------------------------------------------*
*| Modification Log                                                    |
*| ----------------                                                    |
*| Programmer      Date       CC#    Chg.Ref        Description of
*|                                                       Change        |
*| ------------- -----------  ----  -----------  ----------------------|
*| Rajesh Singh  23-AUG-2005                        Initial
*|                                                  development.       |
*----------------------------------------------------------------------*

  REPORT zmm0069 NO STANDARD PAGE HEADING
                                  MESSAGE-ID z0
                                  LINE-SIZE  132
                                  LINE-COUNT 65(2).


*----------------------------------------------------------------------*
*                      Internal Tables                                 *
*----------------------------------------------------------------------*

*Internal table for the purchasing info records fields.

  DATA: BEGIN OF i_inforecord OCCURS 0,

        matnr(18),
        lifnr(10),
        uom(3),
        ekgrp(3),
        planned_time(3),
        under_tol(3),
        over_tol(3),
        qty(10),
        price_cat(5),
        inco(3),
        designation(28),
        netpr(13),
        scale_qty1(10),
        scale_pr1(13),
        scale_qty2(10),
        scale_pr2(13),
        scale_qty3(13),
        scale_pr3(10),
        scale_qty4(13),
        scale_pr4(10),
        scale_qty5(13),
        scale_pr5(10),
        scale_qty6(13),
        scale_pr6(10),
        scale_qty7(13),
        scale_pr7(10),
        scale_qty8(13),
        scale_pr8(10),
        scale_qty9(13),
        scale_pr9(10),
        scale_qty10(13),
        scale_pr10(10),

        END OF i_inforecord.

** Internal table for Old and New Vendor number
  DATA : BEGIN OF i_lfb1 OCCURS 1,

         lifnr(10),
         altkn(10),

         END   OF i_lfb1.

** Declare internal table for Call Transaction and BDC Session
  DATA: i_bdc_table LIKE bdcdata OCCURS 0 WITH HEADER LINE.


*----------------------------------------------------------------------*
*                      Global Variables                                *
*----------------------------------------------------------------------*

  DATA: g_counter(2) TYPE n,
        g_field_name(18) TYPE c,
        zc_yes  TYPE syftype VALUE 'X'.


*----------------------------------------------------------------------*
*                      Selection Screen                                *
*----------------------------------------------------------------------*

  SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-001.

  PARAMETERS: p_fname1 TYPE localfile .

  SELECTION-SCREEN SKIP 1.

  SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-002.
  PARAMETERS: p_rloc1 AS CHECKBOX  DEFAULT 'X'.

  SELECTION-SCREEN BEGIN OF BLOCK c WITH FRAME TITLE text-003.
  PARAMETERS p_group(12) OBLIGATORY DEFAULT 'ZPURCHINFO'.

  SELECTION-SCREEN END OF BLOCK c.
  SELECTION-SCREEN END OF BLOCK b.
  SELECTION-SCREEN END OF BLOCK a.


**WRITE the report header
  TOP-OF-PAGE.
    INCLUDE zheading.

*----------------------------------------------------------------------*
*                      Start of selection                              *
*----------------------------------------------------------------------*

  START-OF-SELECTION.

* Load Input file
    PERFORM f_load_input_file.

* Create BDC records.
    PERFORM create_bdc_records .


*&---------------------------------------------------------------------*
*&      Form  Create_BDC_records
*&---------------------------------------------------------------------*
*       Perform the BDC for the records in the internal table
*----------------------------------------------------------------------*

  FORM create_bdc_records .

    IF NOT i_inforecord[] IS INITIAL.

** Open BDC session

      PERFORM open_bdc_session.

      SELECT lifnr altkn FROM lfb1 INTO TABLE i_lfb1
                          FOR ALL ENTRIES IN i_inforecord
                          WHERE altkn = i_inforecord-lifnr.

* Sorting the Internal table for better performance

      SORT i_lfb1 BY altkn.

      LOOP AT i_inforecord.

***Mapping Old Vendor number to the new Vendor number

        READ TABLE i_lfb1 WITH KEY altkn = i_inforecord-lifnr BINARY
                                                              SEARCH.

        IF sy-subrc EQ 0.
          i_inforecord-lifnr = i_lfb1-lifnr.
        ENDIF.


        CLEAR i_bdc_table[].
        PERFORM insert_screen_header.
*      call transaction 'ME11' using i_bdc_table
*                    mode 'A'.
*      CLEAR i_bdc_table.


      ENDLOOP.
      CLEAR i_inforecord[].

      PERFORM close_bdc_session.

** Release the BDC sessions created
      PERFORM release_bdc.
    ENDIF.


  ENDFORM.                    " open_group


*&---------------------------------------------------------------------*
*&      Form  bdc_dynpro_start
*&---------------------------------------------------------------------*
*       Start the screen for the transfer of fields
*----------------------------------------------------------------------*

  FORM bdc_dynpro_start  USING    p_g_program_1
                                  p_g_screen.

    CLEAR i_bdc_table.
    i_bdc_table-program  = p_g_program_1.
    i_bdc_table-dynpro   = p_g_screen.
    i_bdc_table-dynbegin = 'X'.
    APPEND i_bdc_table.

  ENDFORM.                    " bdc_dynpro_start_start

*&---------------------------------------------------------------------*
*&      Form  bdc_insert_field
*&---------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
  FORM bdc_insert_field USING f_name f_value.
    IF f_value <> space.
      CLEAR i_bdc_table.
      i_bdc_table-fnam = f_name.
      i_bdc_table-fval = f_value.
      APPEND i_bdc_table.
    ENDIF.
  ENDFORM.                    "bdc_insert_field



*&--------------------------------------------------------------------*
*&      Form  open_bdc_session
*&--------------------------------------------------------------------*
*       Open a BDC session
*---------------------------------------------------------------------*
  FORM open_bdc_session .


** Open BDC session and create and update records

    CALL FUNCTION 'BDC_OPEN_GROUP'
      EXPORTING
        client                    = sy-mandt
*       DEST                      = FILLER8
        group                     = p_group
*       HOLDDATE                  = FILLER8
        keep                      = 'X'
        user                      = sy-uname
*       RECORD                    = FILLER1
*       PROG                      = SY-CPROG
*     IMPORTING
*       QID                       =
   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 ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ENDFORM.                    " create_bdc_session
*&---------------------------------------------------------------------*
*&      Form  insert_screen_header
*&---------------------------------------------------------------------*
*       Screen flow for the transfer of fields
*----------------------------------------------------------------------*

  FORM insert_screen_header .


* First Screen 100

    PERFORM bdc_dynpro_start USING 'SAPMM06I' '0100'.

    PERFORM bdc_insert_field USING:'BDC_CURSOR' 'EINA-LIFNR',

                                   'BDC_OKCODE' '/00',

                                   'EINA-LIFNR' i_inforecord-lifnr,

                                   'EINA-MATNR' i_inforecord-matnr,

                                   'EINE-EKORG' '1000',

                                   'RM06I-NORMB' zc_yes.

*****----------------------------------------********

* Next Screen 101

    PERFORM bdc_dynpro_start USING 'SAPMM06I' '0101'.

    PERFORM bdc_insert_field USING : 'BDC_CURSOR' 'EINA-MAHN1',

                                     'BDC_OKCODE' '/00',

                                     'EINA-MEINS' i_inforecord-uom.

*****----------------------------------------********
*Next Screen 102

    PERFORM bdc_dynpro_start USING 'SAPMM06I' '0102'.

    PERFORM bdc_insert_field USING : 'BDC_CURSOR' 'EINE-INCO2',

                                 'EINE-APLFZ' i_inforecord-planned_time,

                                 'EINE-EKGRP' i_inforecord-ekgrp,

                                 'EINE-NORBM' i_inforecord-qty.

    PERFORM bdc_insert USING  'EINE-UEBTK' ' '.

    PERFORM bdc_insert_field USING:'EINE-PEINH' i_inforecord-scale_qty1,

                                   'EINE-BPRME' i_inforecord-uom,

                                   'EINE-UNTTO' '5',

                                   'EINE-UEBTO' '25',

                                   'EINE-MEPRF' i_inforecord-price_cat,

                                   'EINE-NETPR' i_inforecord-netpr,

                                   'EINE-INCO1' i_inforecord-inco,

                                  'EINE-INCO2' i_inforecord-designation.

* Checking for Scale quantities

    IF i_inforecord-scale_qty2 = space.

      PERFORM bdc_insert_field  USING 'BDC_OKCODE' '=BU'.

      PERFORM insert_bdc_new.

    ELSE.

      PERFORM bdc_insert_field  USING 'BDC_OKCODE' '=KO'.

*****----------------------------------------********
* Next Screen 201

      PERFORM bdc_dynpro_start USING 'SAPMV13A' '0201'.

      PERFORM bdc_insert_field USING : 'BDC_CURSOR' 'RV13A-DATAB',

                                        'BDC_OKCODE' '=PSTF'.

*****----------------------------------------********
* Next Screen 201

      PERFORM bdc_dynpro_start USING 'SAPMV13A' '0201'.

      PERFORM bdc_insert_field USING : 'BDC_CURSOR' 'KONP-KSCHL(01)',

                                       'BDC_OKCODE' '=PSTF',

                                       'RV130-SELKZ(01)' zc_yes.

*****----------------------------------------********
* LAST SCREEN 303


      PERFORM bdc_dynpro_start USING 'SAPMV13A' '0303'.

      PERFORM bdc_insert_field USING : 'BDC_CURSOR' 'KONM-KBETR(03)',

                                       'BDC_OKCODE' '=SICH'.

* Counter to Loop the Item level entry
      g_counter = 0.

      PERFORM scale_entry USING i_inforecord-scale_qty2
                                i_inforecord-scale_pr2.


      PERFORM scale_entry USING i_inforecord-scale_qty3
                                i_inforecord-scale_pr3.

      PERFORM scale_entry USING i_inforecord-scale_qty4
                                i_inforecord-scale_pr4.

      PERFORM scale_entry USING i_inforecord-scale_qty5
                                i_inforecord-scale_pr5.


      PERFORM scale_entry USING i_inforecord-scale_qty6
                                i_inforecord-scale_pr6.

      PERFORM scale_entry USING i_inforecord-scale_qty7
                                i_inforecord-scale_pr7.

      PERFORM scale_entry USING i_inforecord-scale_qty8
                                i_inforecord-scale_pr8.

      PERFORM scale_entry USING i_inforecord-scale_qty9
                                i_inforecord-scale_pr9.

      PERFORM scale_entry USING  i_inforecord-scale_qty10
                                 i_inforecord-scale_pr10.

      PERFORM insert_bdc_new.


    ENDIF.
  ENDFORM.                    " insert_screen_header

*&---------------------------------------------------------------------*
*&      Form  insert_bdc
*&---------------------------------------------------------------------*
*       Insert BDC
*----------------------------------------------------------------------*

  FORM insert_bdc_new .

    CALL FUNCTION 'BDC_INSERT'
       EXPORTING
         tcode                  = 'ME11'
*       POST_LOCAL             = NOVBLOCAL
*       PRINTING               = NOPRINT
*       SIMUBATCH              = ' '
*       CTUPARAMS              = ' '
       TABLES
         dynprotab              = i_bdc_table
    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 ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    ENDIF.

    CLEAR i_bdc_table[].

  ENDFORM.                    " insert_bdc


*&---------------------------------------------------------------------*
*&      Form  close_bdc_session
*&---------------------------------------------------------------------*
*      Close the BDC session
*----------------------------------------------------------------------*

  FORM close_bdc_session .

    CALL FUNCTION 'BDC_CLOSE_GROUP'
         EXCEPTIONS
              not_open    = 1
              queue_error = 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.

  ENDFORM.                    " close_bdc_session

*&---------------------------------------------------------------------*
*&      Form  f_load_input_file
*&---------------------------------------------------------------------*
*       Upload the file
*----------------------------------------------------------------------*

  FORM f_load_input_file.

* Check always Local file for upload

    IF p_rloc1 = zc_yes.

      CALL FUNCTION 'WS_UPLOAD'
           EXPORTING
                filename                = p_fname1
                filetype                = 'DAT'
           TABLES
                data_tab                = i_inforecord
           EXCEPTIONS
                conversion_error        = 1
                file_open_error         = 2
                file_read_error         = 3
                invalid_type            = 4
                no_batch                = 5
                unknown_error           = 6
                invalid_table_width     = 7
                gui_refuse_filetransfer = 8
                customer_error          = 9
                OTHERS                  = 10.

      IF sy-subrc <> 0.

        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

        STOP.

      ENDIF.

    ENDIF.
*
  ENDFORM.                    " f_load_input_file
*&---------------------------------------------------------------------*
*&      Form  release_bdc
*&---------------------------------------------------------------------*
*      Release the session
*----------------------------------------------------------------------*

  FORM release_bdc.

    SUBMIT rsbdcsub WITH mappe EQ p_group
                    WITH von EQ sy-datum
                    WITH bis EQ sy-datum
                    WITH fehler EQ '.'
                    EXPORTING LIST TO MEMORY
                    AND RETURN.


  ENDFORM.                    " release_bdc

*&---------------------------------------------------------------------*
*&      Form  scale_entry
*&---------------------------------------------------------------------*
*       Populate the Scale quantities
*----------------------------------------------------------------------*
*      -->P_SCALE_QTY
*      -->P_SCALE_PRICE
*----------------------------------------------------------------------*
  FORM scale_entry USING    p_scale_qty
                            p_scale_price.

* Increment the Counter

    g_counter = g_counter + 1.

    IF p_scale_qty <> space.

      CONCATENATE 'KONM-KSTBM('  g_counter  ')' INTO g_field_name.

      PERFORM bdc_insert_field USING g_field_name p_scale_qty.

      CONCATENATE 'KONM-KBETR('  g_counter  ')' INTO g_field_name.

      PERFORM bdc_insert_field USING g_field_name p_scale_price.

    ENDIF.

  ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  bdc_insert
*&---------------------------------------------------------------------*
*       To uncheck the Unlimited (UEBTK)
*----------------------------------------------------------------------*

  FORM bdc_insert USING  f_name f_value.
    CLEAR i_bdc_table.
    i_bdc_table-fnam = f_name.
    i_bdc_table-fval = f_value.
    APPEND i_bdc_table.
  ENDFORM.                    " bdc_insert
ABAP Tips by :  Raj

Related ABAP Topics:
Program to allows you to insert any Tab Delimited characters easily
Insert a special Tab Delimited Character

Get help for your ABAP problems
Do you have a ABAP Question?

ABAP Books
ABAP Certification, BAPI, Java, Web Programming, Smart Forms, Sapscripts Reference Books

More ABAP Tips

Best regards,
SAP Basis, ABAP Programming and Other IMG Stuff
http://www.erpgreat.com

All the site contents are Copyright © www.erpgreat.com and the content authors. All rights reserved.
All product names are trademarks of their respective companies.  The site www.erpgreat.com is in no way affiliated with SAP AG. 
Every effort is made to ensure the content integrity.  Information used on this site is at your own risk. 
 The content on this site may not be reproduced or redistributed without the express written permission of 
www.erpgreat.com or the content authors.