FB60 Vendor Invoice Post using BAPI



 

*&---------------------------------------------------------------------*

*& Report ZFI_FB60_VENDOR_UPLOAD_TOOL
*&---------------------------------------------------------------------*
*&Created By            : King Of ABAP'r
*&Created On            : 2025
*&Description           : Vendor Invoice Upload FB60
*&Functional Consultant : Consultant 
*&Program               : ZFI_FB60_VENDOR_UPLOAD_TOOL
*&---------------------------------------------------------------------*
REPORT zfi_fb60_vendor_upload_tool.

INCLUDE zfi_fb60_vendor_upl_top.
INCLUDE zfi_fb60_vendor_upl_sel.
INCLUDE zfi_fb60_vendor_upl_f01.

START-OF-SELECTION.

*** Get File Data
  PERFORM get_file_data.
*** Call Bapi
  PERFORM create_bapi.
*** Display Error/Success LOG
  PERFORM display_log.

*&---------------------------------------------------------------------*
*& Include          ZFI_FB60_VENDOR_UPL_TOP
*&---------------------------------------------------------------------*
TABLESsscrfields.

TYPES:BEGIN OF ty_final,
        sno            TYPE i,
        doc_date       TYPE bldat,        " Document Date
        post_date      TYPE budat,        " Posting Date
        company_code   TYPE bukrs,
        currency       TYPE waers,
        xblnr          TYPE xblnr,
        vend_no        TYPE lifnr,
        gl_amt         TYPE bapidoccur,
        culate_tax     TYPE c,
        business_place TYPE  acpi_branch,
        section_code   TYPE  acpi_secco1,
        taxcode        TYPE bseg-mwskz,    " Tax Code bseg-mwskz,
        pmnttrms       TYPE char4,
        assinment      TYPE dzuonr,
        item_text      TYPE sgtxt,
        gl_acc         TYPE hkont,
        aufnr          TYPE aufnr,
        hsn_sac        TYPE char30,  "j_1ig_hsn_sac,
      END OF ty_final.

DATA:gt_data  TYPE TABLE OF ty_final,
     gt_data1 TYPE TABLE OF ty_final,
     ls_data  TYPE  ty_final.

TYPES BEGIN OF ty_msg,
          sno    TYPE i,
          type   TYPE char10"bapi_mtype,
          doc_no TYPE belnr_d,
          gjahr  TYPE gjahr,
          msg    TYPE bapi_msg,
*          number TYPE symsgno,
        END OF ty_msg.
DATA:
  gt_msg TYPE TABLE OF ty_msg,
  gs_msg TYPE ty_msg.

DATA:
  lv_mseg TYPE string.

DATA:
  h_excel TYPE ole2_object" Excel object
  h_mapl  TYPE ole2_object" list of workbooks
  h_map   TYPE ole2_object" workbook
  h_zl    TYPE ole2_object" cell
  h_f     TYPE ole2_object" font
  h       TYPE i.

DATAlv_s TYPE i,
      lv_h TYPE i.



*&---------------------------------------------------------------------*
*& Include          ZFI_FB60_VENDOR_UPL_SEL
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS p_file TYPE rlgrap-filename."BLIGATORY.
  PARAMETERSp_check AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREENBEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  SELECTION-SCREENPUSHBUTTON 20(54cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREENEND OF BLOCK b2.

INITIALIZATION.
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name   icon_xxl
      text   'Generate Template'
      info   'Generate Excel File Template'
    IMPORTING
      result cmdgen
    EXCEPTIONS
      OTHERS 0.

AT SELECTION-SCREEN.
  CASE sscrfields.
    WHEN 'A_GEN'.
      PERFORM generate_template.
  ENDCASE.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file .
*** File Upload
  PERFORM file_upload.

*&---------------------------------------------------------------------*
*& Include          ZFI_FB60_VENDOR_UPL_F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*

FORM file_upload .
**** file upload data
  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  syst-cprog
      dynpro_number syst-dynnr
      field_name    'P_FILE'
    IMPORTING
      file_name     p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_file_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_file_data .
  DATA:t_raw   TYPE truxs_t_text_data.
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*     i_field_seperator    =
      i_line_header        'X'
      i_tab_raw_data       t_raw
      i_filename           p_file
    TABLES
      i_tab_converted_data gt_data.

  IF gt_data IS INITIAL.
    MESSAGE 'No data uploaded' TYPE 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_bapi .
  DATAls_header    TYPE bapiache09,
        lt_gl_acc    TYPE TABLE OF bapiacgl09,
        lt_acc_pay   TYPE TABLE OF bapiacap09,
        ls_acc_pay   TYPE bapiacap09,
        lt_curr      TYPE TABLE OF bapiaccr09,
        lt_tax       TYPE TABLE OF bapiactx09,
        lt_accountwt TYPE TABLE OF bapiacwt09,
        lt_return    TYPE TABLE OF bapiret2,
        ls_return    TYPE bapiret2.

***  extension fill for posting key
  DATA lt_extension2 TYPE TABLE OF  bapiparex,
         ls_extension2 TYPE bapiparex.
*** variable declarations
  DATAlv_item_no TYPE posnr_acc.

  DATAlv_obj_typ LIKE  bapiache09-obj_type,
        lv_obj_key LIKE  bapiache09-obj_key,
        lv_obj_sys LIKE  bapiache09-obj_sys.

*** calculation tax code decalrations
  DATA lv_taxtot TYPE bset-fwste,
         lv_taxded TYPE bset-fwste.
  DATA lt_mwdat TYPE TABLE OF rtax1u15.
  DATA lv_fiscal_year TYPE gjahr.
  DATA lv_amt  TYPE wrbtr.

  REFRESHgt_data1.
  gt_data1[] gt_data[].

  SORT gt_data BY sno.
  DELETE ADJACENT DUPLICATES FROM gt_data COMPARING sno.

  LOOP AT gt_data INTO DATA(gs_Data).
*** header DATA declarations
    DATA(lv_count)         gs_data-sno.

    ls_header-username    sy-uname.
    ls_header-header_txt  gs_data-item_text.
    ls_header-comp_code   gs_data-company_code.
    ls_header-doc_date    gs_data-doc_date.
    PERFORM convert_date USING ls_header-doc_date.
    ls_header-pstng_date  gs_Data-post_date.
    PERFORM convert_date USING ls_header-pstng_date.
    ls_header-doc_type    'KR'.
    ls_header-ref_doc_no  gs_data-xblnr.

    "Get Fiscal Year
    CALL FUNCTION 'GET_CURRENT_YEAR'
      EXPORTING
        bukrs gs_data-company_code
        date  gs_data-post_date
      IMPORTING
        curry lv_fiscal_year.

    TRANSLATE ls_header-ref_doc_no TO UPPER CASE.
    SELECT SINGLE FROM bkpf INTO @DATA(ls_bkpf)
         WHERE xblnr EQ @ls_header-ref_doc_no
           AND bukrs EQ @gs_Data-company_code.

    IF sy-subrc EQ 0.
      gs_msg-sno   gs_data-sno.
      gs_msg-type  icon_led_red.
      gs_msg-msg   |Duplicate record found for Reference#{ ls_bkpf-bukrs }/{ ls_bkpf-belnr }/{ ls_bkpf-gjahr }|.
      gs_msg-gjahr lv_fiscal_year.
      APPENDgs_msg TO gt_msg.
      CLEARgs_msg.
      CONTINUE.
    ENDIF.

    "items declarations
    LOOP AT gt_data1 ASSIGNING FIELD-SYMBOL(<gs_data>WHERE sno gs_data-sno.

      " Fill GL Account Details
      IF <gs_data>-gl_acc IS NOT INITIAL.
        APPEND INITIAL LINE TO lt_gl_acc ASSIGNING FIELD-SYMBOL(<ls_gl_acc>).
        <ls_gl_acc>-itemno_acc     lv_item_no lv_item_no + 1.
        <ls_gl_acc>-gl_account     |{ <gs_data>-gl_acc ALPHA IN }|.
        <ls_gl_acc>-item_text      <gs_data>-item_text.
        <ls_gl_acc>-comp_code      <gs_data>-company_code.
        <ls_gl_acc>-tax_code       <gs_data>-taxcode.
        <ls_gl_acc>-businessplace  <gs_data>-business_place.
        <ls_gl_acc>-itemno_tax     1.
        <ls_gl_acc>-alloc_nmbr     <gs_data>-assinment.
        <ls_gl_acc>-orderid        <gs_data>-aufnr.

        APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
        <ls_curr>-itemno_acc lv_item_no.
        <ls_curr>-currency   <gs_data>-currency.
        <ls_curr>-amt_doccur <gs_data>-gl_amt.
        <ls_curr>-curr_type  '00'.
      ENDIF.

      "Fill Vendor Details into Account payable
      IF <gs_data>-vend_no IS NOT INITIAL.
        ls_acc_pay-itemno_acc    lv_item_no lv_item_no + 1.
        ls_acc_pay-vendor_no     |{ <gs_data>-vend_no ALPHA IN }|.
        ls_acc_pay-alloc_nmbr    <gs_data>-assinment.
        ls_acc_pay-item_text     <gs_data>-item_text.
        ls_acc_pay-pmnttrms     <gs_data>-pmnttrms.
        ls_acc_pay-businessplace <gs_data>-business_place.
        ls_acc_pay-sectioncode   <gs_data>-section_code.
        ls_acc_pay-tax_code      <gs_data>-taxcode.
        APPENDls_acc_pay TO lt_acc_pay.

      ENDIF.

      CLEARlv_taxtot,lv_taxded.
      REFRESH:lt_mwdat.
      IF <gs_data>-taxcode IS NOT INITIAL.
        lv_amt <gs_data>-gl_amt.
        CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
          EXPORTING
            i_bukrs           <gs_data>-company_code  "'1983'
            i_mwskz           <gs_data>-taxcode
            i_waers           <gs_data>-currency     "'INR'
            i_wrbtr           lv_amt
          IMPORTING
            e_fwste           lv_taxtot
            e_fwast           lv_taxded
          TABLES
            t_mwdat           lt_mwdat
          EXCEPTIONS
            bukrs_not_found   1
            country_not_found 2
            mwskz_not_defined 3
            mwskz_not_valid   4
            ktosl_not_found   5
            kalsm_not_found   6
            parameter_error   7
            knumh_not_found   8
            kschl_not_found   9
            unknown_error     10
            account_not_found 11
            txjcd_not_valid   12
            tdt_error         13
            txa_error         14
            OTHERS            15.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

        "Fill Vendor Line Amount

        APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<gs_curr>).
        <gs_curr>-itemno_acc lv_item_no.
        <gs_curr>-curr_type   '00'.
        <gs_curr>-currency   <gs_data>-currency.
        <gs_curr>-amt_doccur <gs_data>-gl_amt + lv_taxtot .
        <gs_curr>-amt_doccur <gs_curr>-amt_doccur * -1.

        CLEAR lv_amt.
        LOOP AT lt_mwdat ASSIGNING FIELD-SYMBOL(<ls_mwdat>).
          CHECK <ls_mwdat>-wmwst NE 0.
          lv_item_no lv_item_no + 1.
          APPEND INITIAL LINE TO lt_tax ASSIGNING  FIELD-SYMBOL(<ls_acctax>).
          IF <ls_acctax> IS ASSIGNED.
            <ls_acctax>-itemno_acc lv_item_no.
            <ls_acctax>-gl_account <ls_mwdat>-hkont.
            <ls_acctax>-tax_code   <gs_data>-taxcode.
            <ls_acctax>-tax_rate   <ls_mwdat>-msatz.
            <ls_acctax>-cond_key   <ls_mwdat>-kschl.
            <ls_acctax>-acct_key   <ls_mwdat>-ktosl.
            <ls_acctax>-direct_tax abap_true.
            <ls_acctax>-itemno_tax lv_item_no.

            APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr_amt>).
            IF <ls_curr_amt> IS ASSIGNED.
              <ls_curr_amt>-itemno_acc      lv_item_no .  "+ 1.
              <ls_curr_amt>-curr_type       '00'.
              <ls_curr_amt>-currency        <gs_data>-currency.
              <ls_curr_amt>-amt_doccur      <ls_mwdat>-wmwst.
              <ls_curr_amt>-amt_base        <ls_mwdat>-wmwst.
            ENDIF.
          ENDIF.
        ENDLOOP.
*          ENDIF.
      ENDIF.

***** Extension For HSN Code Field
*    ls_extension2-structure  = 'HSN_SAC'.
*    ls_extension2-valuepart1 = lv_item_no.
*    ls_extension2-valuepart2 = <gs_data>-hsn_sac.
*    APPEND ls_extension2 TO lt_extension2.
*    CLEAR:ls_extension2.

    ENDLOOP.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
      EXPORTING
        documentheader ls_header
      TABLES
        accountgl      lt_gl_acc
        accountpayable lt_acc_pay
        accounttax     lt_tax
        currencyamount lt_curr
        extension2     lt_extension2
*       criteria       = lt_criteria
        return         lt_return.
*        accountwt      = lt_accountwt.

    LOOP AT lt_return INTO ls_return WHERE type 'E'.
      gs_msg-sno     lv_count.
      gs_msg-msg     ls_return-message.
      gs_msg-type    'E'.
      APPENDgs_msg TO gt_msg.
      CLEARgs_msg.
    ENDLOOP.

    READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type 'E'.
    IF sy-subrc NE AND p_check abap_false.
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
        EXPORTING
          documentheader ls_header
        IMPORTING
          obj_type       lv_obj_typ
          obj_key        lv_obj_key
          obj_sys        lv_obj_sys
        TABLES
          accountgl      lt_gl_acc
          accountpayable lt_acc_pay
          accounttax     lt_tax
          currencyamount lt_curr
          extension2     lt_extension2
*         criteria       = lt_criteria
          return         lt_return.

      READ TABLE lt_return  INTO ls_return WITH KEY type 'E'.
      IF sy-subrc NE 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait abap_true.
        gs_msg-sno     lv_count.
        gs_msg-doc_no  lv_obj_key(10).
        gs_msg-gjahr   lv_obj_key+14(4).
        gs_msg-type    icon_green_light.
        gs_msg-msg     |Document posted successfully:{ lv_obj_key }|.
        APPEND gs_msg TO gt_msg.
        CLEARgs_msg.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT lt_return INTO ls_return WHERE type 'E'.
          gs_msg-sno     lv_count.
          gs_msg-msg     ls_return-message.
          gs_msg-type    icon_red_light.
          APPENDgs_msg TO gt_msg.
          CLEARgs_msg.
        ENDLOOP.
      ENDIF.
    ENDIF.

    CLEARls_header,
           lt_curr,
           lt_tax,
           lt_extension2,
           lt_gl_acc,
           lt_acc_pay,
           lt_return,
           lt_accountwt,
*           lt_criteria,
           lv_item_no.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_HEADER_DOC_DATE
*&---------------------------------------------------------------------*
FORM convert_date  USING p_gs_date.
  CALL FUNCTION 'CONVERT_DATE_TO_INTERN_FORMAT'
    EXPORTING
      datum p_gs_date
      dtype 'DATS'
    IMPORTING
      idate p_gs_date.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY_LOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> DISPLAY_LOG
*&---------------------------------------------------------------------*
FORM display_log .

  TYPE-POOLSslis.
  DATAls_fieldcat TYPE slis_fieldcat_alv,
        ls_layout   TYPE slis_layout_alv.
  DATAlt_fieldcat         TYPE slis_t_fieldcat_alv.
  DATAlv_program TYPE sy-repid.
  IF gt_msg IS NOT INITIAL.
    APPEND VALUE #fieldname    'SNO'
                    col_pos      1
                    ref_tabname  'GT_ALV'
                    seltext_m    'Sno' TO lt_fieldcat.
    APPEND VALUE #fieldname    'TYPE'
                    col_pos      2
                    ref_tabname  'GT_ALV'
                    seltext_m    'Status' TO lt_fieldcat.

    APPEND VALUE #fieldname    'DOC_NO'
                    col_pos      3
                    ref_tabname  'GT_ALV'
                    hotspot      'X'
                    seltext_m    'Document No' TO lt_fieldcat.

    APPEND VALUE #fieldname    'GJAHR'
                    col_pos      4
                    ref_tabname  'GT_ALV'
                    seltext_m    'Year' TO lt_fieldcat.
    APPEND VALUE #fieldname    'MSG'
                    col_pos      5
                    ref_tabname  'GT_ALV'
                    seltext_m    'Message' TO lt_fieldcat.
    CLEAR ls_layout.
    ls_layout-colwidth_optimize  'X'.
    ls_layout-zebra              'X'.
    lv_program                   sy-repid.
* display the final display
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program      lv_program
        i_callback_user_command 'USER_COMMAND'
        is_layout               ls_layout
        it_fieldcat             lt_fieldcat
      TABLES
        t_outtab                gt_msg
      EXCEPTIONS
        program_error           1
        OTHERS                  2.
  ELSE.
    MESSAGE 'No errors found' TYPE 'I'.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN  '&IC1'.
      IF rs_selfield-fieldname 'DOC_NO'.
        READ TABLE gt_msg INTO DATA(gs_finalINDEX rs_selfield-tabindex.
        IF sy-lsind 0.
          SET PARAMETER ID 'BLN' FIELD gs_final-doc_no.
          CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
        ENDIF.
      ENDIF.
  ENDCASE.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM generate_template .

* start Excel
  CREATE OBJECT h_excel 'EXCEL.APPLICATION'.
  SET PROPERTY OF h_excel 'Visible' 1.

* get list of workbooks, initially empty
  CALL METHOD OF
    h_excel
      'Workbooks' h_mapl.

*** Error handle File
  PERFORM err_hdl.

* add a new workbook
  CALL METHOD OF
    h_mapl
      'Add' h_map.

*** Error handle File
  PERFORM err_hdl.

  PERFORM fill_cell USING:   1  'Sno',
                             2  'Doc Date',
                             3  'Posting Date',
                             4  'Company Code',
                             5  'Currency',
                             6  'Reference',
                             7  'Vendor',
                             8  'Amount',
                             9  'Calculate Tax',
                             10 'Business Place',
                             11 'Section Code',
                             12 'Tax Code',
                             13 'Payment Terms',
                             14 'Assignment',
                             15 'Line Item Text',
                             16 'GL Account',
                             17 'Order No',
                             18 'HSN Code'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form fill_cell
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM fill_cell USING j bold val.
  CALL METHOD OF
      h_excel
      'Cells' h_zl
    EXPORTING
      #1      i
      #2      j.
  PERFORM err_hdl.
  SET PROPERTY OF h_zl 'Value' val .
  PERFORM err_hdl.
  GET PROPERTY OF h_zl 'Font' h_f.
  PERFORM err_hdl.
  SET PROPERTY OF h_f 'Bold' bold .
  PERFORM err_hdl.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM err_hdl .
  IF sy-subrc <> 0.
    CALL METHOD OF
      h_excel
      'QUIT'.
    FREE OBJECT h_excel.
    h_excel-handle -1.
    MESSAGE'Failed to generate template.' TYPE 'E'.
  ENDIF.
ENDFORM.







Comments

Popular posts from this blog

PO rejection notification & rejection comments for Fiori

Service Invoice Upload For FB70 (BAPI)