STO GR Based Based auto Invoice Post

 

My requirement is to post a GRN-based invoice using a BAPI in SAP ABAP. 



 *&---------------------------------------------------------------------*
*& Report ZFI_STO_GRBASE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfi_sto_grbase_new.

TABLES mseg,ekpo,ekbe,vbfa,t001w.

TYPES BEGIN OF t_data,
          sno           TYPE i,
          mblnr         TYPE mblnr,
          inv_date      TYPE bldat,
          post_date(10),
          ref_doc_no    TYPE xblnr,
          currency      TYPE waers,
          vend_no       TYPE hkont,
          sgtxt         TYPE sgtxt,
          tax_amt       TYPE bapidoccur,
          gl_amt        TYPE bapidoccur,
          net_value     TYPE bapidoccur,
          bupla         TYPE bupla,
          profit_ctr    TYPE prctr,
          taxcode       TYPE mwskz,
          line_id       TYPE mb_line_id,
          ebeln         TYPE ebeln,
          ebelp         TYPE ebelp,
          ref1          TYPE xblnr,  
        END OF t_data.

TYPES BEGIN OF gty_bkpf,
          vbeln TYPE bkpf-xblnr,
          bupla TYPE bupla,
          blart TYPE blart,
          fkdat TYPE fkdat,
        END OF gty_bkpf.

TYPES BEGIN OF ty_msg,
          sno    TYPE i,
          type   TYPE char10,
          mblnr  TYPE mblnr,
          doc_no TYPE belnr_d,
          gjahr  TYPE gjahr,
          msg    TYPE bapi_msg,
          accnt  TYPE lifnr,
        END OF ty_msg.

DATA:
  gt_msg TYPE TABLE OF ty_msg,
  gs_msg TYPE ty_msg.

DATAgt_bkpf1 TYPE TABLE OF gty_bkpf.
DATAlv_ven_amt TYPE wrbtr,
      lv_net_amt TYPE wrbtr.
DATAt_final  TYPE TABLE OF t_data,
      tt_final TYPE t_data.

DATAsno TYPE i.

*** Bapi Declarations
DATA:
  ls_header    TYPE bapiache09,
  lt_gl_acc    TYPE TABLE OF bapiacgl09,
  ls_gl_acc    TYPE bapiacgl09,
  lt_acc_pay   TYPE TABLE OF bapiacap09,
  ls_acc_pay   TYPE bapiacap09,
  lt_curr      TYPE TABLE OF bapiaccr09,
  ls_curr      TYPE bapiaccr09,
  lt_tax       TYPE TABLE OF bapiactx09,
  ls_tax       TYPE bapiactx09,
  lt_accountwt TYPE TABLE OF bapiacwt09,
  ls_accountwt TYPE bapiacwt09,
  lt_return    TYPE TABLE OF bapiret2,
  ls_return    TYPE bapiret2,
  lt_criteria  TYPE bapiackec9_tab,
  lv_obj_typ   LIKE  bapiache09-obj_type,
  lv_obj_key   LIKE  bapiache09-obj_key,
  lv_obj_sys   LIKE  bapiache09-obj_sys,
  lv_item_no   TYPE posnr_acc,
*  lv_amt       TYPE wrbtr,
  lt_cust      TYPE TABLE OF bapiacar09,
  ls_cust      TYPE bapiacar09,
*    *** calculation tax code decalrations
  lv_taxtot    TYPE bset-fwste,
  lv_taxded    TYPE bset-fwste,
  lt_mwdat     TYPE TABLE OF rtax1u15.

*  *** extension fill for posting key
DATAlt_extension2 TYPE TABLE OF  bapiparex,
      ls_extension2 TYPE bapiparex.

DATA:lv_fiscal_year TYPE gjahr.

*DATA : sno TYPE i .
*** Constant Declaration
CONSTANTSc_cc    TYPE bukrs VALUE '****'.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
  PARAMETERSp_grn RADIOBUTTON GROUP rb1 USER-COMMAND grn DEFAULT 'X',
              p_obd RADIOBUTTON GROUP rb1.
  SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-003.
    SELECT-OPTIONS s_budat FOR mseg-budat_mkpf MODIF ID grn .
    PARAMETERSp_date TYPE budat.
    SELECT-OPTIONS :  s_ref FOR ekbe-belnr MODIF ID obd.
  SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF p_grn abap_true.
      IF screen-group1 'OBD'.
        screen-active 0.
        MODIFY SCREEN.
      ENDIF.
    ELSEIF p_obd abap_true.
      IF screen-group1 'GRN'.
        screen-active 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

AT SELECTION-SCREEN.
  IF p_date IS INITIAL AND sy-ucomm 'ONLI'.
    MESSAGE 'Posting date mandatory' TYPE 'E'.
  ENDIF.

START-OF-SELECTION .
*** Get Data
  PERFORM get_data.
*** Call bapi
  PERFORM fill_bdc.
*** Display ALV
  PERFORM display_alv.

*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM get_data .

  DATAlr_mblnr TYPE RANGE OF mblnr.

  IF s_budat-low GT p_date.
    MESSAGE 'Posting date should alway be greterthan equal to the GRN Date' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF p_grn abap_true.
    IF s_budat IS NOT INITIAL.
      SELECT mblnr,
             budat_mkpf,
             line_id,
             ebeln,
             ebelp,
             bwart,
             matnr,
             smbln
             FROM mseg INTO TABLE @DATA(gt_mseg)
             WHERE budat_mkpf IN @s_budat
               AND bwart IN '101''102' ).

      lr_mblnr VALUE #FOR  ls_mseg_temp IN gt_mseg WHERE smbln IS NOT INITIAL )
                                                             sign   'I'
                                                               option 'EQ'
                                                               low    ls_mseg_temp-smbln ).
      DELETE gt_mseg WHERE bwart '102'.
      IF lr_mblnr IS NOT INITIAL.
        DELETE gt_mseg WHERE mblnr IN lr_mblnr.
      ENDIF.
    ENDIF.

    IF NOT gt_mseg IS INITIAL.
      SELECT ebeln,
             ebelp,
             vgabe,
             belnr,
             buzei,
             matnr
             FROM ekbe INTO TABLE @DATA(gt_ekbe)
             FOR ALL ENTRIES IN @gt_mseg
             WHERE ebeln @gt_mseg-ebeln
             AND  ebelp @gt_mseg-ebelp
             AND  vgabe '8'.
    ENDIF.

  ELSEIF p_obd abap_true.
    IF s_ref IS NOT INITIAL.
      SELECT ebeln,
             ebelp,
             vgabe,
             belnr,
             buzei,
             matnr
             FROM ekbe INTO TABLE @DATA(lt_ekbe)
                WHERE belnr IN @s_ref
                  AND vgabe '8'.
    ENDIF.

    IF NOT lt_ekbe IS INITIAL.
      SELECT ebeln,
             ebelp,
             vgabe,
             gjahr,
             belnr,
             buzei,
             matnr
             FROM ekbe INTO TABLE @DATA(gt_ekbe_mblnr)
             FOR ALL ENTRIES IN @lt_ekbe
             WHERE ebeln @lt_ekbe-ebeln
             AND  ebelp @lt_ekbe-ebelp
              AND vgabe '1'.
    ENDIF.

    IF gt_ekbe_mblnr IS NOT INITIAL.
      SELECT mblnr,
             budat_mkpf,
             line_id,
             ebeln,
             ebelp,
             bwart,
             matnr,
             smbln
             FROM mseg INTO TABLE @gt_mseg
             FOR ALL ENTRIES IN @gt_ekbe_mblnr
             WHERE mblnr EQ @gt_ekbe_mblnr-belnr
               AND gjahr EQ @gt_ekbe_mblnr-gjahr
               AND ebeln EQ @gt_ekbe_mblnr-ebeln
               AND ebelp EQ @gt_ekbe_mblnr-ebelp
               AND bwart IN '101''102' ).
      lr_mblnr VALUE #FOR  ls_mseg_temp IN gt_mseg WHERE smbln IS NOT INITIAL )
                                                             sign   'I'
                                                               option 'EQ'
                                                               low    ls_mseg_temp-smbln ).
      DELETE gt_mseg WHERE bwart '102'.
      IF lr_mblnr IS NOT INITIAL.
        DELETE gt_mseg WHERE mblnr IN lr_mblnr.
      ENDIF.

    ENDIF.
  ENDIF.


  IF  gt_mseg IS NOT INITIAL .
    SELECT a~ebeln,
           a~ebelp,
           a~pstyp,
           a~werks,
           b~reswk,
           c~regio,
           d~regio AS regio1
           FROM ekpo AS a INNER JOIN ekko AS b
           ON a~ebeln b~ebeln
           INNER JOIN t001w AS c
           ON c~werks a~werks
           INNER JOIN t001w AS d
           ON d~werks b~reswk
           INTO TABLE @DATA(gt_ekpo)
           FOR ALL ENTRIES IN @gt_mseg
           WHERE a~ebeln @gt_mseg-ebeln
           AND   a~ebelp @gt_mseg-ebelp
           AND   a~pstyp '7'
           AND   c~regio <> d~regio.
  ENDIF.

  IF p_obd abap_true.
    APPEND LINES OF lt_ekbe TO gt_ekbe.
  ENDIF.

  IF NOT gt_ekbe IS INITIAL.
    SELECT vbelv,
           posnv,
           vbtyp_n,
           vbeln,
           posnn,
           matnr
           FROM vbfa INTO TABLE @DATA(gt_vbfa)
           FOR ALL ENTRIES IN @gt_ekbe
           WHERE vbelv =  @gt_ekbe-belnr
           AND vbtyp_n 'M'.
  ENDIF.

  IF NOT gt_vbfa IS INITIAL.
    SELECT vbeln,
           posnr,
           netwr,
           mwsbp,
           erdat,
           waerk,
           matnr,
           mwskz
           FROM vbrp INTO TABLE @DATA(gt_vbrp)
           FOR ALL ENTRIES IN @gt_vbfa
           WHERE vbeln =  @gt_vbfa-vbeln
             AND posnr =  @gt_vbfa-posnn.
    IF sy-subrc 0.
      SORT gt_vbrp BY vbeln.
    ENDIF.
  ENDIF.

  IF gt_vbrp IS NOT INITIAL.
    SELECT vbeln,
           bupla,
           blart,
           knumv,
           fkdat,
           netwr,
           xblnr,     
           mwsbk
          FROM vbrk INTO TABLE @DATA(gt_vbrk)
          FOR ALL ENTRIES IN @gt_vbrp
          WHERE vbeln @gt_vbrp-vbeln.
  ENDIF.

  IF NOT gt_vbrk IS INITIAL.
    SELECT knumv,
           kposn,
           mwsk1
           FROM prcd_elements
           INTO TABLE @DATA(lt_prcd_elements)
           FOR ALL ENTRIES IN @gt_vbrk
           WHERE knumv EQ @gt_vbrk-knumv.
  ENDIF.


  IF NOT lt_prcd_elements IS INITIAL.
    SELECT FROM
            zfi_taxcode
            INTO TABLE @DATA(lt_zfi_taxcode)
            FOR ALL ENTRIES IN @lt_prcd_elements
            WHERE output_tax EQ @lt_prcd_elements-mwsk1.
  ENDIF.


  SORT:
    gt_ekpo BY ebeln ebelp,
    gt_ekbe BY ebeln ebelp,
    gt_vbfa BY vbelv posnv,
    gt_vbrp BY vbeln posnr,
    gt_vbrk BY vbeln,
    lt_prcd_elements BY knumv kposn.

**** Final Data
  LOOP AT gt_mseg INTO DATA(ls_mseg).

    tt_final-mblnr   ls_mseg-mblnr.
    tt_final-line_id ls_mseg-line_id.
    tt_final-ebeln   ls_mseg-ebeln.
    tt_final-ebelp   ls_mseg-ebelp.

    READ TABLE gt_ekpo INTO DATA(gs_ekpoWITH KEY ebeln ls_mseg-ebeln
                                                   ebelp ls_mseg-ebelp BINARY SEARCH.
    IF sy-subrc 0.
      tt_final-sno        sno =  sno + 1.
      tt_final-vend_no    |{ gs_ekpo-reswk ALPHA IN }|.
      tt_final-profit_ctr |{ gs_ekpo-werks ALPHA IN }|.
      IF gs_ekpo IS NOT INITIAL.
        SELECT SINGLE FROM t001w INTO @DATA(lv_bupla)
          WHERE werks EQ @gs_ekpo-werks.
        IF sy-subrc 0.
          tt_final-bupla lv_bupla-j_1bbranch.
        ENDIF.
      ENDIF.

      CONCATENATE p_date+6(2'.'
                  p_date+4(2'.'
                  p_date+0(4)
                  INTO tt_final-post_date.

      tt_final-ref_doc_no ls_mseg-mblnr.

      READ TABLE gt_ekbe INTO DATA(gs_ekbeWITH KEY ebeln gs_ekpo-ebeln
                                                     ebelp gs_ekpo-ebelp BINARY SEARCH.
      IF sy-subrc 0.
        READ TABLE gt_vbfa INTO DATA(gs_vbfaWITH KEY vbelv gs_ekbe-belnr
                                                       posnv gs_ekbe-buzei BINARY SEARCH.

        READ TABLE gt_vbrp INTO DATA(gs_vbrpWITH KEY vbeln gs_vbfa-vbeln
                                                       posnr gs_vbfa-posnn BINARY SEARCH.
        IF sy-subrc 0.
          tt_final-inv_date   =  gs_vbrp-erdat.
          tt_final-sgtxt      gs_vbrp-vbeln.
          tt_final-currency   gs_vbrp-waerk.
          tt_final-tax_amt     gs_vbrp-mwsbp.

          READ TABLE gt_vbrk INTO DATA(gs_vbrkWITH  KEY vbeln gs_vbfa-vbeln BINARY SEARCH.
          IF  sy-subrc 0.
            tt_final-ref1 gs_vbrk-xblnr.       
            READ TABLE lt_prcd_elements INTO DATA(ls_prcd_elementsWITH KEY knumv gs_vbrk-knumv
                                                                             kposn gs_vbrp-posnr BINARY SEARCH.

            IF sy-subrc 0.
              READ TABLE lt_zfi_taxcode INTO DATA(ls_zfi_taxcodeWITH KEY output_tax ls_prcd_elements-mwsk1.
              IF sy-subrc 0.
                tt_final-taxcode ls_zfi_taxcode-input_tax.
              ENDIF.
            ENDIF.
          ENDIF.

          IF gs_vbrp-netwr 0.
            tt_final-net_value  '0.01'.
            tt_final-taxcode    'I8'.
          ELSE.
            tt_final-net_value  gs_vbrp-netwr.
          ENDIF.
        ENDIF.
      ENDIF.

      APPEND tt_final TO  t_final.
      CLEARtt_final,gs_vbrp,gs_vbfa,gs_ekpo,gs_ekbe,ls_zfi_taxcode.
      CLEAR:lv_bupla.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form fill_bapi
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM fill_bdc .

  CONSTANTSc_struct TYPE te_struc VALUE 'XREF1_HD'.   
  DATA:date_internal(10),
       lv_count TYPE i.
       gv_count TYPE i.


  DATA(gt_finalt_final.
  SORT t_final BY mblnr.
  DELETE ADJACENT DUPLICATES FROM t_final COMPARING mblnr .

  LOOP AT  t_final INTO DATA(gs_final).
    gv_count gv_count + 1.
*** Header Data Declaration
    CLEAR:ls_header.
    ls_header-username   sy-uname.
    ls_header-doc_type   'ZB' .
    ls_header-comp_code  c_cc.
    ls_header-doc_date gs_final-inv_date.

    CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
      EXPORTING
        date_external gs_final-post_date
      IMPORTING
        date_internal date_internal.

    ls_header-pstng_date date_internal.
    ls_header-ref_doc_no gs_final-ref_doc_no.   " Pass ekbe-Mblnr
    ls_header-header_txt gs_final-sgtxt.   " Reference Document No

    "Get Fiscal Year
    CALL FUNCTION 'GET_CURRENT_YEAR'
      EXPORTING
        bukrs c_cc
        date  ls_header-pstng_date
      IMPORTING
        curry lv_fiscal_year.

    SELECT SINGLE FROM bkpf INTO @DATA(ls_bkpf)
         WHERE xblnr EQ @ls_header-ref_doc_no
           AND gjahr EQ @lv_fiscal_year
           AND blart EQ 'ZB'.
    IF sy-subrc EQ 0.
      gs_msg-sno   gs_final-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.

*** populate the extension table
    ls_extension2-structure  =  c_struct.
    ls_extension2-valuepart1 lv_count + 1.  
    ls_extension2-valuepart2 gs_final-ref1.  "reference Key1 Update
    APPEND ls_extension2 TO lt_extension2.
    CLEARls_extension2.


*** Items Declarations
    LOOP AT  gt_final ASSIGNING FIELD-SYMBOL(<fs_final>)  WHERE mblnr gs_final-mblnr.

      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     '0000000000'.
      <ls_gl_acc>-item_text      |{ <fs_final>-ref_doc_no }/{ <fs_final>-line_id }|.
      <ls_gl_acc>-comp_code      c_cc.
      <ls_gl_acc>-profit_ctr     |{ <fs_final>-profit_ctr ALPHA IN }|.
      <ls_gl_acc>-tax_code       <fs_final>-taxcode.
      <ls_gl_acc>-businessplace  <fs_final>-bupla.
      <ls_gl_acc>-itemno_tax     lv_item_no.
      <ls_gl_acc>-alloc_nmbr     |{ <fs_final>-ebeln }/{ <fs_final>-ebelp }|.

      APPEND INITIAL LINE TO lt_curr ASSIGNING FIELD-SYMBOL(<ls_curr>).
      <ls_curr>-itemno_acc lv_item_no.
      <ls_curr>-currency   <fs_final>-currency.
      <ls_curr>-amt_doccur <fs_final>-net_value.


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

      SELECT SINGLE *
                FROM cskb
                INTO @DATA(ls_cskb)
               WHERE kstar @<ls_gl_acc>-gl_account
                 AND kokrs @c_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_item_no.
          <ls_criteria>-fieldname  'WERKS'.
          <ls_criteria>-character  =  <fs_final>-profit_ctr.
        ELSEIF ls_cskb-katyp '01'.
*          <ls_gl_acc>-costcenter = |{ <gs_data>-cost_center ALPHA = IN }|.
        ENDIF.
      ENDIF.

      CLEARlv_net_amtlt_mwdat.
      IF  <fs_final>-taxcode IS NOT INITIAL .
        lv_net_amt <fs_final>-net_value .
        EXPORT lv_bupla FROM <fs_final>-bupla TO MEMORY ID 'BUPLA'.
        CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
          EXPORTING
            i_bukrs           c_cc
            i_mwskz           <fs_final>-taxcode
            i_waers           'INR'
            i_wrbtr           lv_net_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.
      ENDIF.

      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   <fs_final>-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.
            <ls_curr_amt>-curr_type       '00'.
            <ls_curr_amt>-currency        <fs_final>-currency.
            <ls_curr_amt>-amt_doccur      <ls_mwdat>-wmwst.
            <ls_curr_amt>-amt_base        <ls_mwdat>-wmwst.
          ENDIF.
        ENDIF.
      ENDLOOP.
      lv_ven_amt lv_ven_amt + lv_taxtot + lv_net_amt.
    ENDLOOP.

    ls_acc_pay-itemno_acc    =  lv_item_no lv_item_no + 1.
    ls_acc_pay-vendor_no     |{ <fs_final>-vend_no ALPHA IN }|.
    ls_acc_pay-alloc_nmbr    |{ <fs_final>-ebeln }/{ <fs_final>-ebelp }|.
    ls_acc_pay-item_text     |{ <fs_final>-ref_doc_no }/{ <fs_final>-line_id }|.
    ls_acc_pay-businessplace <fs_final>-bupla.
    ls_acc_pay-sectioncode   c_cc.
    ls_acc_pay-tax_code      <fs_final>-taxcode.
    APPENDls_acc_pay TO lt_acc_pay.

    ls_curr-itemno_acc lv_item_no.
    ls_curr-currency   <fs_final>-currency.
    ls_curr-amt_doccur lv_ven_amt * -1.
    APPENDls_curr TO lt_curr.
    CLEAR ls_curr.

    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.

    gs_msg-mblnr ls_header-ref_doc_no.

    LOOP AT lt_return INTO ls_return WHERE type 'E'.
      gs_msg-sno     gs_final-sno.
      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 0.
      SET UPDATE TASK LOCAL.
      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     gs_final-sno.
        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     gs_final-sno.
          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_criteria,
        lv_item_no,
        lv_ven_amt.

  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_alv .
  TYPE-POOLS:
                slis.
  DATA:
    ls_fieldcat TYPE slis_fieldcat_alv,
    ls_layout   TYPE slis_layout_alv.
  DATA:
     lt_fieldcat         TYPE slis_t_fieldcat_alv.

  DATA:
        lv_program TYPE sy-repid.

  IF gt_msg IS NOT INITIAL.

    DATA:
    lo_column               TYPE REF TO cl_salv_column_table.

    TRY.

        CALL METHOD cl_salv_table=>factory
          IMPORTING
            r_salv_table DATA(lo_salv)                          " Basis Class Simple ALV Tables
          CHANGING
            t_table      gt_msg.

        DATA(lo_functionslo_salv->get_functions).
        lo_functions->set_all).

        DATA(lo_columnslo_salv->get_columns).

        lo_columns->set_optimize).

        lo_column ?= lo_columns->get_column'TYPE' ).
        lo_column->set_iconif_salv_c_bool_sap=>true ).
        lo_column->set_long_text'Status' ).
        lo_column->set_alignmentif_salv_c_alignment=>centered ).
        lo_column->set_output_length20 ).

        lo_column ?= lo_columns->get_column'SNO' ).
        lo_column->set_long_text'Serial Number' ).
        lo_column->set_medium_text'Serial Number' ).
        lo_column->set_output_length10 ).

        lo_column ?= lo_columns->get_column'DOC_NO' ).
        lo_column->set_cell_typeif_salv_c_cell_type=>hotspot ).

*        DATA(lo_events) = lo_salv->get_event( ).
*
*        SET HANDLER on_link_click FOR lo_events.

        lo_salv->display).

      CATCH cx_salv_msg INTO DATA(lx_salv_msg)" ALV: General Error Class with Message
      CATCH cx_salv_data_error INTO DATA(lx_salv_data_error)" ALV: General Error Class (Checked in Syntax Check)
      CATCH cx_salv_not_found INTO DATA(lx_salv_not_found).  " ALV: General Error Class (Checked in Syntax Check)
      CATCH cx_salv_existing INTO DATA(lx_salv_existing).   " ALV: General Error Class (Checked in Syntax Check)
    ENDTRY.


  ELSE.
    MESSAGE 'No errors found' TYPE 'I'.
  ENDIF.
ENDFORM.

Note: We are implementing the user exit because when the document is posted, it hits the same GL account number for all document postings

**** User Exit For Business Place: J_1I7_GET_BUSINESS_PLACE

*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1  ZFI_UPDATE_BUSINESS_PALCE.    "active version
IMPORT lv_bupla TO ls_j_1bbranch FROM MEMORY ID 'BUPLA'.
ENDENHANCEMENT.
*$*$-End:   (1)---------------------------------------------------------------------------------$*$*
ENDFUNCTION.

BADI IMPLIMENTATION NAME: BADI_ACC_DOCUMENT (Extension to update reference 1 in header text) 



Comments

Popular posts from this blog

PO rejection notification & rejection comments for Fiori

FB60 Vendor Invoice Post using BAPI

Service Invoice Upload For FB70 (BAPI)