Service Invoice Upload For FB70 (BAPI)

My requirement is to create an FB70 document using a BAPI in SAP ABAP.


*&---------------------------------------------------------------------*
*& Report ZFI_SERVICE_INVOICE_UPLOAD
*&---------------------------------------------------------------------*
*& Program        : ZFI_SERVICE_INVOICE_UPLOAD
*& Author         : King Of abap
*& Created on     : 02.01.2025
*& Requested By   : ?
*& Project        : ?
*& Transport-No   : ?
*& Description    : Service Invoice Upload For FB70
*& T-Code         : ?
*&
*&---------------------------------------------------------------------*
REPORT zfi_service_invoice_upload.

INCLUDE zfi_service_invoice_top.
INCLUDE zfi_service_invoice_sel.
INCLUDE zfi_service_invoice_f01.

START-OF-SELECTION.
*** Get File Date from Flat file
  PERFORM get_file_data.
*** Process the Service Invoice using BAPI
  PERFORM create_bapi.
*** Display Error/Success LOG
  PERFORM display_log.

*&---------------------------------------------------------------------*
*& Include          ZFI_SERVICE_INVOICE_TOP
*&---------------------------------------------------------------------*

TABLESsscrfields.

TYPES BEGIN OF gty_final,
          sno          TYPE i,
          doc_date     TYPE bldat"char10,   " Document Date
          post_date    TYPE budat"char10,   " Posting Date
          currency_key TYPE waers,    " Currency
          head_txt     TYPE bktxt,    " Header Text
          cust_accnt   TYPE kunnr,    " Customer Account
          amount       TYPE wmwst"wrbtr,    " Amount in document currency
          tax_code     TYPE mwskz,    " Tax Code
          bus_place    TYPE bupla,    " Business Place
          assignment   TYPE dzuonr,   " Assignment
          short_txt    TYPE sgtxt,    " Text
          gl_accnt     TYPE newko,    " Account
          plant        TYPE field,    " Plant
          prt_centr    TYPE prctr,    " Profit Centre
          hsn_code     TYPE secco" HSN Code
        END OF gty_final.

DATAit_data  TYPE TABLE OF gty_final,
      it_data1 TYPE TABLE OF gty_final,
      wa_data  TYPE gty_final,
      message  TYPE string,
      count    TYPE i,
      t_raw    TYPE truxs_t_text_data,
      fnam     TYPE string,
      cnt(2)   TYPE n,
      t_cnt(2TYPE n,

      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.


TYPES BEGIN OF ty_msg,
          sno    TYPE i,
          type   TYPE char10"bapi_mtype,
          doc_no TYPE belnr_d,
          msg    TYPE bapi_msg,
        END OF ty_msg.
DATAit_msg TYPE TABLE OF ty_msg,
      wa_msg TYPE ty_msg.


*&---------------------------------------------------------------------*
*& Include          ZFI_SERVICE_INVOICE_SEL
*&---------------------------------------------------------------------*

SELECTION-SCREENBEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERSp_file  TYPE rlgrap-filename,
              p_check AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREENEND 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_SERVICE_INVOICE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
FORM file_upload .

  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
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
FORM get_file_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 it_data.

  IF it_data IS INITIAL.
    MESSAGE 'No data uploaded' TYPE 'E'.
  ENDIF.

  REFRESH:it_msg.
  IF p_check EQ abap_true OR p_check NE abap_true..
    LOOP AT it_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
      IF <lfs_data>-bus_place IS INITIAL.
        wa_msg-sno     <lfs_data>-sno.
        wa_msg-msg     'Business Place is Mandotory'.  "wa_return-message.
        wa_msg-type    icon_led_red.
        APPENDwa_msg TO it_msg.
        CLEARwa_msg.
      ENDIF.

      IF <lfs_data>-hsn_code IS INITIAL.
        wa_msg-sno     <lfs_data>-sno.
        wa_msg-msg     'HSN Code is Mandotory'.  "wa_return-message.
        wa_msg-type    icon_led_red.
        APPENDwa_msg TO it_msg.
        CLEARwa_msg.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM create_bapi .
  DATAwa_docheader  LIKE  bapiache09,
        wa_accntgl    TYPE bapiacgl09,
        wa_acc_rec    TYPE bapiacar09,
        wa_curr       TYPE bapiaccr09,
        wa_tax        TYPE bapiactx09,
        wa_accntwt    TYPE bapiacwt09,
        wa_return     TYPE bapiret2,
        ls_extension2 TYPE bapiparex.
  DATAit_accntgl    TYPE TABLE OF bapiacgl09,
        it_acc_rec    TYPE TABLE OF bapiacar09,
        it_curr       TYPE TABLE OF bapiaccr09,
        lt_criteria   TYPE bapiackec9_tab,
        it_tax        TYPE TABLE OF bapiactx09,
        it_accntwt    TYPE TABLE OF bapiacwt09,
        it_return     TYPE TABLE OF bapiret2,
*** Extension fill for HSN Code
        lt_extension2 TYPE TABLE OF  bapiparex.

  DATAlv_obj_key  LIKE  bapiache09-obj_key,
        lv_itemno   TYPE posnr_acc,
        lv_taxtot   TYPE bset-fwste,
        lv_taxded   TYPE bset-fwste,
        it_mwdat    TYPE TABLE OF rtax1u15,
        lv_cust_amt TYPE wrbtr,
        lv_net_amt  TYPE wrbtr.

  CONSTANTSco_doc_type TYPE blart VALUE 'SE',
             co_cc       TYPE bukrs VALUE '****'.

  REFRESHit_data1.
  it_data1[] it_data[].
  SORT it_data BY sno.
  DELETE ADJACENT DUPLICATES FROM it_data COMPARING sno.


  LOOP AT it_data ASSIGNING FIELD-SYMBOL(<wfs_data>).
    IF it_msg IS INITIAL.
      wa_docheader-comp_code   co_cc.
      wa_docheader-doc_type    co_doc_type.
      wa_docheader-header_txt  <wfs_data>-head_txt.
      wa_docheader-username    sy-uname.
      wa_docheader-doc_date    <wfs_data>-doc_date.
      PERFORM convert_date USING wa_docheader-doc_date .
      wa_docheader-pstng_date  <wfs_data>-post_date.
      PERFORM convert_date USING wa_docheader-pstng_date .

      LOOP AT it_data1 ASSIGNING FIELD-SYMBOL(<gs_data>WHERE sno <wfs_data>-sno.

*** gl Account Line Item
        IF <gs_data>-gl_accnt IS NOT INITIAL.
          APPEND INITIAL LINE TO it_accntgl ASSIGNING FIELD-SYMBOL(<ls_gl_acc>).
          <ls_gl_acc>-itemno_acc     lv_itemno =  lv_itemno + 1.
          <ls_gl_acc>-gl_account     |{ <gs_data>-gl_accnt  ALPHA IN }|.
          <ls_gl_acc>-item_text      <gs_data>-short_txt.
          <ls_gl_acc>-comp_code      co_cc.
          <ls_gl_acc>-plant          <gs_data>-plant.
          <ls_gl_acc>-alloc_nmbr     <gs_data>-assignment.
          <ls_gl_acc>-tax_code       <gs_data>-tax_code.
          <ls_gl_acc>-profit_ctr     |{ <gs_data>-prt_centr ALPHA IN }|.
          <ls_gl_acc>-businessplace  <gs_data>-bus_place.
          <ls_gl_acc>-itemno_tax     1.


          APPEND INITIAL LINE TO it_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
          <ls_curr>-itemno_acc lv_itemno.
          <ls_curr>-currency   <gs_data>-currency_key.
          <ls_curr>-amt_doccur <gs_data>-amount * -1.
          <ls_curr>-curr_type '00'.

          SELECT SINGLE *
            FROM ska1
            INTO @DATA(ls_ska1)
            WHERE saknr @<ls_gl_acc>-gl_account
              AND ktopl @co_cc.

          SELECT SINGLE *
                    FROM cskb
                    INTO @DATA(ls_cskb)
                   WHERE kstar @<ls_gl_acc>-gl_account
                     AND kokrs @co_cc.

          IF ls_ska1-xbilk abap_false.
            IF ls_cskb-katyp '11'.
              APPEND INITIAL LINE TO lt_criteria ASSIGNING FIELD-SYMBOL(<ls_criteria>).
              <ls_criteria>-itemno_acc lv_itemno.
              <ls_criteria>-fieldname  'WERKS'.
              <ls_criteria>-character  =  <gs_data>-prt_centr.
            ELSEIF ls_cskb-katyp '01'.
*          <ls_gl_acc>-costcenter = |{ <gs_data>-cost_center ALPHA = IN }|.
            ENDIF.
          ENDIF.

        ENDIF.

*** Calculation tax code decalrations
        CLEAR:lv_taxtot,lv_taxded.
        REFRESH:it_mwdat.
        IF  <gs_data>-tax_code IS NOT INITIAL .
          EXPORT lv_bupla FROM <gs_data>-bus_place TO MEMORY ID 'BUPLA'.
          CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
            EXPORTING
              i_bukrs           co_cc
              i_mwskz           <gs_data>-tax_code
              i_waers           <gs_data>-currency_key   "'INR'
              i_wrbtr           <gs_data>-amount
            IMPORTING
              e_fwste           lv_taxtot
              e_fwast           lv_taxded
            TABLES
              t_mwdat           it_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.
        ENDIF.
**** Tax Calculation
        LOOP AT it_mwdat ASSIGNING FIELD-SYMBOL(<wfs_mwdat>).
          CHECK <wfs_mwdat>-wmwst NE 0.
          lv_itemno lv_itemno + 1.
          APPEND INITIAL LINE TO it_tax ASSIGNING  FIELD-SYMBOL(<ls_acctax>).
          IF <ls_acctax> IS ASSIGNED.
            <ls_acctax>-itemno_acc lv_itemno.
            <ls_acctax>-gl_account <wfs_mwdat>-hkont.
            <ls_acctax>-tax_code   <gs_data>-tax_code.
            <ls_acctax>-tax_rate   <wfs_mwdat>-msatz.
            <ls_acctax>-cond_key   <wfs_mwdat>-kschl.
            <ls_acctax>-acct_key   <wfs_mwdat>-ktosl.
            <ls_acctax>-direct_tax abap_true.
            <ls_acctax>-itemno_tax lv_itemno"1

            APPEND INITIAL LINE TO it_curr ASSIGNING FIELD-SYMBOL(<ls_curr_amt>).
            IF <ls_curr_amt> IS ASSIGNED.
              <ls_curr_amt>-itemno_acc  lv_itemno .
              <ls_curr_amt>-curr_type   '00'.
              <ls_curr_amt>-currency    <gs_data>-currency_key.
              <ls_curr_amt>-amt_doccur  <wfs_mwdat>-wmwst *  -.
              <ls_curr_amt>-amt_base    <wfs_mwdat>-wmwst .
            ENDIF.
          ENDIF.
        ENDLOOP.
        lv_cust_amt lv_cust_amt + lv_taxtot + <gs_data>-amount.
      ENDLOOP.

*** Customer Line Item
      IF <wfs_data>-cust_accnt IS NOT INITIAL.
        wa_acc_rec-itemno_acc    lv_itemno + 1.
        wa_acc_rec-customer      |{ <wfs_data>-cust_accnt ALPHA IN }|.
        wa_acc_rec-comp_code      co_cc.
        wa_acc_rec-alloc_nmbr    <wfs_data>-assignment.
        wa_acc_rec-item_text     <wfs_data>-short_txt.
        wa_acc_rec-businessplace <wfs_data>-bus_place.
        wa_acc_rec-sectioncode   co_cc.
        wa_acc_rec-tax_code      <wfs_data>-tax_code.
        wa_acc_rec-profit_ctr    |{ <wfs_data>-prt_centr ALPHA IN }|.
        APPENDwa_acc_rec TO it_acc_rec.
        CLEAR:wa_acc_rec.

        wa_curr-itemno_acc lv_itemno + 1.
        wa_curr-curr_type   '00'.
        wa_curr-currency   <gs_data>-currency_key.
        wa_curr-amt_doccur lv_cust_amt " * -1.
        APPENDwa_curr TO it_curr.
        CLEAR wa_curr.

      ENDIF.

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

      CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
        EXPORTING
          documentheader    wa_docheader
        TABLES
          accountgl         it_accntgl
          accountreceivable it_acc_rec
          accounttax        it_tax
          currencyamount    it_curr
          return            it_return
          extension2        lt_extension2
          criteria          lt_criteria
          accountwt         it_accntwt.

      LOOP AT it_return INTO wa_return WHERE type 'E'.
        ADD TO count.
        wa_msg-sno     count.
        wa_msg-msg     wa_return-message.
        wa_msg-type    icon_led_red.
        APPENDwa_msg TO it_msg.
        CLEARwa_msg.
      ENDLOOP.

      READ TABLE it_return TRANSPORTING NO FIELDS WITH KEY type 'S'.
      IF sy-subrc AND p_check abap_false.
        CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
          EXPORTING
            documentheader    wa_docheader
          IMPORTING
            obj_key           lv_obj_key
          TABLES
            accountgl         it_accntgl
            accountreceivable it_acc_rec
            accounttax        it_tax
            currencyamount    it_curr
            return            it_return
            extension2        lt_extension2
            criteria          lt_criteria
            accountwt         it_accntwt.

        READ TABLE it_return  INTO wa_return WITH KEY type 'S'.
        IF sy-subrc 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait abap_true.

          ADD TO count.
          wa_msg-sno     count.
          wa_msg-doc_no  lv_obj_key(10).
          wa_msg-type    icon_led_green.
          wa_msg-msg     |Document posted successfully { lv_obj_key(10}-{ lv_obj_key+10(4}-{ lv_obj_key+14(4}|"wa_return-message. "
          APPEND wa_msg TO it_msg.
          CLEARwa_msg.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          LOOP AT it_return INTO wa_return WHERE type 'E'.
            ADD TO count.
            wa_msg-sno     count.
            wa_msg-msg     wa_return-message.
            wa_msg-type    icon_led_red.
            APPENDwa_msg TO it_msg.
            CLEARwa_msg.
          ENDLOOP.
        ENDIF.

        REFRESH:it_accntgl,
                it_acc_rec,
                it_accntwt,
                it_curr,
                it_accntwt,
                it_return,
                lt_extension2,
                lt_criteria.
        CLEAR:count,
              lv_obj_key,
              lv_itemno,
              wa_docheader,
              lv_cust_amt,
              lv_net_amt,
              lv_taxded,
              lv_taxtot.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_log .

  TYPE-POOLS:   slis.
  DATA:
    wa_fieldcat TYPE slis_fieldcat_alv,
    wa_layout   TYPE slis_layout_alv,
    it_fieldcat TYPE slis_t_fieldcat_alv,
    lv_program  TYPE sy-repid.

  IF it_msg IS NOT INITIAL.

    APPEND VALUE #fieldname    'SNO'
                    col_pos      1
                    seltext_m    'Sno.' TO it_fieldcat.

    APPEND VALUE #fieldname    'TYPE'
                    col_pos      2
                    seltext_m    'Status' TO it_fieldcat.

    APPEND VALUE #fieldname   'DOC_NO'
                    col_pos     3
                    seltext_m   'Document No' TO it_fieldcat.

    APPEND VALUE #fieldname    'MSG'
                    col_pos      5
                    seltext_m    'Message' TO it_fieldcat.

    CLEAR wa_layout.
    wa_layout-colwidth_optimize 'X'.
    wa_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          wa_layout
        it_fieldcat        it_fieldcat
      TABLES
        t_outtab           it_msg
      EXCEPTIONS
        program_error      1
        OTHERS             2.
  ELSE.
    MESSAGE 'No errors found' TYPE 'I'.
  ENDIF.

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  'Currency',
                             5  'Header Text',
                             6  'Customer Account',
                             7  'Amount',
                             8  'Tax Code',
                             9  'Business Place',
                             10 'Assignment',
                             11 'Short Text',
                             12 'GL Account',
                             13 'Plant',
                             14 'Profit Centre',
                             15 '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.

*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> WA_DOCHEADER_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.

*** BADI Implementation NAME: BADI_ACC_DOCUMENT





***** Excel Template



Comments

Popular posts from this blog

PO rejection notification & rejection comments for Fiori

FB60 Vendor Invoice Post using BAPI