Showing posts with label BDC for MB1B. Show all posts
Showing posts with label BDC for MB1B. Show all posts

Feb 8, 2011

BDC for MB1B

Hi Just copy the required Program to own Z Program
TYPE-POOLS: truxs.
DATA: zmode TYPE  c.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS : mode_a      RADIOBUTTON    GROUP  r1,
             mode_n      RADIOBUTTON    GROUP  r1.

PARAMETERS: p_ifile TYPE rlgrap-filename.
PARAMETERS: p_ofile TYPE string.

SELECTION-SCREEN END OF BLOCK b1.

INCLUDE zbdcrec.

DATABEGIN OF it_src_upload OCCURS 0,
        rectyp(1)  TYPE c,      " Header / Item Indicator
        bldat(10)  TYPE c,      " Document Date
        budat(10)   TYPE c,      " Posting Date
        bktxt(25)  TYPE c,      " Doc. Header Text
        bwartwa(3TYPE c,      " Movement Type
        werks(4)   TYPE c,      " Plant
        lgort(4)   TYPE c,      " Storage Location
        sobkz(1)   TYPE c,      " Special Stock
        matnr(18)  TYPE c,      " Material
        erfmg(13)  TYPE c,      " Quantity
        ERFME(3)   TYPE c,      "Unit of Entry
        charg(10)  TYPE c,      " Batch
        exbwr(13)  TYPE c,      " Amount
        lifnr(10)  TYPE c,      " Vendor
        kunnr(10)  TYPE c,      " Customer
        UMMAT(18)  TYPE C,      "MATERIAL (RECEIVINF/ISSUING)
        UMLGO(4)   TYPE C,      "ISSUING/RECEIVING STOR LOC
      END OF it_src_upload.

DATABEGIN OF it_header OCCURS 0,
        rectyp(1)  TYPE c,      " Header / Item Indicator
        hcount(5)  TYPE c,      " Counter
        bldat(10)   TYPE c,      " Document Date
        budat(10)   TYPE c,      " Posting Date
        bktxt(25)  TYPE c,      " Doc. Header Text
        bwartwa(3TYPE c,      " Movement Type
        werks(4)   TYPE c,      " Plant
        lgort(4)   TYPE c,      " Storage Location
        sobkz(1)   TYPE c,      " Special Stock
      END OF it_header.

DATABEGIN OF it_item OCCURS 0,
        rectyp(1)  TYPE c,      " Header / Item Indicator
        hcount(5)  TYPE c,      " Counter
        matnr(18)  TYPE c,      " Material
        erfmg(13)  TYPE c,      " Quantity
        ERFME(3)   TYPE c,      " Unit of Entry
        charg(10)  TYPE c,      " Batch
        exbwr(13)  TYPE c,      " Amount
        lifnr(10)  TYPE c,      " Vendor
        kunnr(10)  TYPE c,      " Customer
        UMMAT(18)  TYPE C,      "MATERIAL (RECEIVINF/ISSUING)
        UMLGO(4)   TYPE C,      "ISSUING/RECEIVING STOR LOC
        UMCHA(10)  TYPE C,      " issueing receiving valuation
        END OF it_item.

DATA: it_item_nex LIKE it_item.

DATABEGIN OF it_err OCCURS 0,
        rectyp(1)  TYPE c,      " Header / Item Indicator
        bldat(10)   TYPE c,      " Document Date
        budat(10)   TYPE c,      " Posting Date
        bktxt(25)  TYPE c,      " Doc. Header Text
        bwartwa(3TYPE c,      " Movement Type
        werks(4)   TYPE c,      " Plant
        lgort(4)   TYPE c,      " Storage Location
        matnr(18)  TYPE c,      " Material
        erfmg(13)  TYPE c,      " Quantity
        ERFME(3)   TYPE c,      " Unit of Entry
        charg(10)  TYPE c,      " Batch
        exbwr(13)  TYPE c,      " Amount
        error(255TYPE c,     " Error Message Text
      END OF it_err.

DATA: it_raw TYPE truxs_t_text_data.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.


DATA: v_total    TYPE i.
DATA: v_txt  TYPE char80.
DATA: v_correct  TYPE i.
DATA: v_error    TYPE i.
DATA: v_cnt TYPE i.

CONSTANTS: c_headertype(1TYPE c VALUE 'H',
           c_itemtype(1)   TYPE c VALUE 'I'.

*---------------------------------------------------------------------*
*-- At Selection Screen
*---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ifile.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mode     = 'O'
    IMPORTING
      filename = p_ifile
    EXCEPTIONS
      OTHERS   = 1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ofile.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mode     = 'O'
    IMPORTING
      filename = p_ofile
    EXCEPTIONS
      OTHERS   = 1.


START-OF-SELECTION.
  IF p_ofile IS INITIAL.
    CONCATENATE p_ifile '_err' sy-datum sy-uzeit '.xls' INTO p_ofile.
  ENDIF.
  PERFORM data_upload.

  IF mode_a EQ 'X'.
    zmode = 'A'.
  ELSEIF mode_n EQ 'X'.
    zmode = 'N'.
  ENDIF.

  PERFORM filter_data.
  PERFORM populate_data.
  PERFORM write_status.

*&---------------------------------------------------------------------*
*&      Form  DATA_UPLOAD
*&---------------------------------------------------------------------*
FORM data_upload.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_field_seperator    = 'X'
      i_line_header        = 'X'
      i_tab_raw_data       = it_raw
      i_filename           = p_ifile
    TABLES
      i_tab_converted_data = it_src_upload
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  IF sy-subrc <> 0.
    MESSAGE 'Error while uploading file' TYPE 'E'.
  ENDIF.

ENDFORM.                               " DATA_UPLOAD

*&amp;---------------------------------------------------------------------*
*&amp;      Form  FILTER_DATA
*&amp;---------------------------------------------------------------------*
FORM filter_data.

* Filtering the Header and Item data
  DATA: c_hcount TYPE i.
*BREAK-POINT.
  LOOP AT it_src_upload.
    TRANSLATE it_src_upload TO UPPER CASE.
    MODIFY it_src_upload.
    IF it_src_upload-rectyp = c_headertype.
      c_hcount = c_hcount + 1.
      it_header-hcount = c_hcount.
      MOVE-CORRESPONDING it_src_upload TO it_header.
      APPEND it_header.
    ELSEIF it_src_upload-rectyp = c_itemtype .
      it_item-hcount = c_hcount.
      MOVE-CORRESPONDING it_src_upload TO it_item.
      APPEND it_item.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "filter_data

*&amp;---------------------------------------------------------------------*
*&amp;      Form  POPULATE_DATA
*&amp;---------------------------------------------------------------------*
FORM populate_data.
*BREAK-POINT.
  LOOP AT it_header.
    PERFORM bdc_dynpro      USING 'SAPMM07M'
                                  '0400'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=NPE'.

* Document Date
    PERFORM bdc_field       USING 'MKPF-BLDAT'
                                  it_header-bldat.
* Posting Date
    PERFORM bdc_field       USING 'MKPF-BUDAT'
                                  it_header-budat.
* Document Header Text
    PERFORM bdc_field       USING 'MKPF-BKTXT'
                                  it_header-bktxt.
* Movement Type
    PERFORM bdc_field       USING 'RM07M-BWARTWA'
                                  it_header-bwartwa.
* Plant
    PERFORM bdc_field       USING 'RM07M-WERKS'
                                  it_header-werks.
* Storage Location
    PERFORM bdc_field       USING 'RM07M-LGORT'
                                  it_header-lgort.
* Special Stock
    PERFORM bdc_field       USING 'RM07M-SOBKZ'
                                  it_header-sobkz.

    PERFORM bdc_field       USING 'XFULL'
                                  'X'.

    PERFORM bdc_field       USING 'RM07M-WVERS2'
                                   'X'.

    LOOP AT it_item WHERE hcount = it_header-hcount.

      v_cnt = sy-tabix + 1.

      PERFORM bdc_dynpro      USING 'SAPMM07M'
                                    '0410'.

* Set the OK Code according to the number of records
      CLEAR it_item_nex.
      READ TABLE it_item INDEX v_cnt INTO it_item_nex.
      IF sy-subrc = 0.
        IF it_item_nex-hcount = it_header-hcount.
* If not the last record then OK Code has to be to go to New Item
          PERFORM bdc_field       USING 'BDC_OKCODE'
                                        '=NPE'.
        ELSE.
* If last record of the document then OK Code has to be to SAVE
          PERFORM bdc_field       USING 'BDC_OKCODE'
                                        '=BU'.
        ENDIF.
      ELSE.
* If last record then OK Code has to be to SAVE
        PERFORM bdc_field       USING 'BDC_OKCODE'
                                      '=BU'.
      ENDIF.

* Material
      PERFORM bdc_field       USING 'MSEG-MATNR'
                                    it_item-matnr.
* Quantity
      PERFORM bdc_field       USING 'MSEG-ERFMG'
                                    it_item-erfmg.
* Unit Of Entry
      PERFORM bdc_field       USING 'MSEG-ERFME'
                                    it_item-ERFME.
* Batch
      PERFORM bdc_field       USING 'MSEG-CHARG'
                                    it_item-charg.

*      IF it_header-sobkz = ' '.
* Amount
        PERFORM bdc_field       USING 'MSEG-EXBWR'
                                      it_item-exbwr.
*      ENDIF.

        PERFORM bdc_field       USING 'MSEG-UMMAT'
                                      it_item-UMMAT.

        PERFORM bdc_field       USING 'MSEG-UMWRK'
                                      it_header-WERKS.

        PERFORM bdc_field       USING 'MSEG-UMLGO'
                                      it_item-UMLGO.

        PERFORM bdc_field       USING 'MSEG-UMCHA'
                                      it_item-UMCHA.

      CASE it_header-sobkz.
        WHEN 'O'.
* Vendor
          PERFORM bdc_field       USING 'MSEG-LIFNR'
                                        it_item-lifnr.
        WHEN 'W'.
* Customer
          PERFORM bdc_field       USING 'MSEGK-KUNNR'
                                        it_item-kunnr.
      ENDCASE.


      PERFORM bdc_dynpro      USING 'SAPLKACB'
                                    '0002'.
      PERFORM bdc_field       USING 'BDC_OKCODE'
                                    '=ENTE'.
    ENDLOOP.

    CALL TRANSACTION 'MB1B' USING bdcdata MODE zmode UPDATE 'S'.

    IF sy-subrc <> 0.
      CALL FUNCTION 'TB_MESSAGE_BUILD_TEXT'
        EXPORTING
          langu = sy-langu
          msgid = sy-msgid
          msgno = sy-msgno
          msgv1 = sy-msgv1
          msgv2 = sy-msgv2
          msgv3 = sy-msgv3
          msgv4 = sy-msgv4
        IMPORTING
          text  = v_txt.

      MOVE-CORRESPONDING it_header TO it_err.
      v_error = v_error + 1.
      it_err-error = v_txt.
      APPEND it_err.
      CLEAR it_err.
      CLEAR v_txt.

      LOOP AT it_item WHERE hcount = it_item-hcount.
        MOVE-CORRESPONDING it_item TO it_err.
        APPEND it_err.
        CLEAR: it_err.
      ENDLOOP.
    ELSE.
      v_correct = v_correct + 1.
    ENDIF.

    CLEAR: bdcdata.
    REFRESH: bdcdata.

  ENDLOOP.

ENDFORM.                    "


*&---------------------------------------------------------------------*
*&      Form  WRITE_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM write_status .

  v_total = v_error + v_correct.
  SKIP 2.
  WRITE:/ '-----------Status Log-----------' COLOR 6.
  SKIP 2.
  WRITE:/ 'Total Number of Records   :', v_total COLOR 1.
  WRITE:/ 'Total Updated Records     :', v_correct COLOR 3.
  WRITE:/ 'Total Not Updated Records :', v_error COLOR 6.

  IF NOT it_err[] IS INITIAL.
    WRITE:/ 'Error Log file', p_ofile, 'saved.'.
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        filename              = p_ofile
        filetype              = 'ASC'
        append                = 'X'
        write_field_separator = 'X'
      TABLES
        data_tab              = it_err.

    IF sy-subrc <> 0.
      WRITE:/ 'Error creating log file'.
    ENDIF.
  ENDIF.
ENDFORM.                    " WRITE_STATUS



USE EXCEL FILE TO UPLOAD DATA.
HEADER MARKED WITH H
ITEM MARKED WITH I
IN THE VERY FIRST COLUMN OF EXCEL