ABAP-F-02记账模块化

FUNCTION zfi_fm_01.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(LS_HEADER) TYPE  ZSFB01_SRM
*"  EXPORTING
*"     REFERENCE(ZTYPE) TYPE  CHAR1
*"     REFERENCE(ZMSG) TYPE  BAPI_MSG
*"     REFERENCE(BELNR) TYPE  BELNR_D
*"  TABLES
*"      LT_ITEM STRUCTURE  ZSFB01_SRM_ITEM
*"----------------------------------------------------------------------
  DATA: lr_jie TYPE RANGE OF tbsl-bschl WITH HEADER LINE,
        lr_dai TYPE RANGE OF tbsl-bschl WITH HEADER LINE.

  DATA: g_waers TYPE waers.

  TYPES: BEGIN OF ty_bschl,
           bschl TYPE tbsl-bschl,
           shkzg TYPE tbsl-bschl,
         END OF ty_bschl.

  DATA: lt_bschl TYPE TABLE OF ty_bschl,
        ls_bschl TYPE ty_bschl.

  DATA: wa_documentheader    TYPE          bapiache09,
        wa_customercpd       TYPE          bapiacpa09,
        it_accountgl         TYPE TABLE OF bapiacgl09,
        wa_accountgl         TYPE          bapiacgl09,
        it_accountreceivable TYPE TABLE OF bapiacar09,
        wa_accountreceivable TYPE          bapiacar09,
        it_accountpayable    TYPE TABLE OF bapiacap09,
        wa_accountpayable    TYPE          bapiacap09,
        it_currency_amount   TYPE TABLE OF bapiaccr09,
        wa_currency_amount   TYPE          bapiaccr09,
        it_account_tax       TYPE TABLE OF bapiactx09,
        wa_account_tax       TYPE          bapiactx09,
        it_return            TYPE TABLE OF bapiret2,
        wa_return            TYPE          bapiret2,
        it_zexten            TYPE TABLE OF zsfi_acc_document3,
        wa_zexten            TYPE          zsfi_acc_document3,
        it_zexten_yf         TYPE TABLE OF zsms_epic_extension,
        wa_zexten_yf         TYPE          zsms_epic_extension,
        it_extension2        TYPE TABLE OF bapiparex,
        wa_extension2        TYPE          bapiparex,
****STA*******************************************************************************
*FI_OA费用报销单接口_新增扩展字段车号_20210915
        ls_extension2        TYPE          bapiparex,
        lt_zexten_car        TYPE TABLE OF zsfi_acc_document4,
        ls_zexten_car        TYPE          zsfi_acc_document4.
****END*******************************************************************************

  DATA: gv_objtype TYPE bapiacrev-obj_type,
        gv_objkey  TYPE bapiacrev-obj_key,
        gv_objsys  TYPE bapiacrev-obj_sys.

  DATA: gv_itemno_acc TYPE posnr_acc.

  DATA: l_msg TYPE char255.

*获取本位币
  SELECT SINGLE waers INTO g_waers FROM t001 WHERE bukrs = ls_header-bukrs. "根据公司代码获取本位币

  SELECT
    bschl
    shkzg
    FROM tbsl
    INTO CORRESPONDING FIELDS OF TABLE  lt_bschl.

  LOOP AT lt_bschl INTO ls_bschl.
    IF ls_bschl-shkzg = 'S'.
      CLEAR lr_jie.
      lr_jie-sign = 'I'.
      lr_jie-option = 'EQ'.
      lr_jie-low = ls_bschl-bschl.
      APPEND lr_jie.
    ELSE.
      CLEAR lr_dai.
      lr_dai-sign = 'I'.
      lr_dai-option = 'EQ'.
      lr_dai-low = ls_bschl-bschl.
      APPEND lr_dai.
    ENDIF.
  ENDLOOP.

  CLEAR wa_documentheader.
  wa_documentheader-username   = ls_header-usnam.
  wa_documentheader-comp_code  = ls_header-bukrs.
  wa_documentheader-doc_date   = ls_header-bldat.
  wa_documentheader-pstng_date = ls_header-budat.
  wa_documentheader-doc_type   = ls_header-blart.
  wa_documentheader-header_txt = ls_header-bktxt.
  wa_documentheader-ref_doc_no = ls_header-xblnr.
  IF ls_header-zyf = 'X'.
    wa_documentheader-obj_type    = 'BKPFF'.
    wa_documentheader-bus_act = 'RFST'.
  ENDIF.

  REFRESH: it_accountgl,
             it_accountreceivable,
             it_accountpayable,
             it_currency_amount,
             it_account_tax,
             it_extension2,
             it_return.

*&&----------------行项目
  LOOP AT lt_item.

    gv_itemno_acc = gv_itemno_acc + 1.

    "根据记账码区分总账、应收、应付行
    CASE lt_item-bschl.
      WHEN '40' OR '50' OR '80' OR '81' OR '82' OR '83' OR '84'
                OR '85' OR '86' OR '90' OR '91' OR '92' OR '93'
                OR '94' OR '95' OR '96' OR '70' OR '75'. "总账
        CLEAR wa_accountgl.

        wa_accountgl-itemno_acc = gv_itemno_acc.
        wa_accountgl-vendor_no  = lt_item-lifnr.      " 供应商编码
        wa_accountgl-customer   = lt_item-kunnr.      " 客户编码
        wa_accountgl-gl_account = lt_item-hkont.      " 会计科目
        wa_accountgl-asval_date = lt_item-bzdat.      " 资产价值日
        wa_accountgl-costcenter = lt_item-kostl.      " 成本中心
        wa_accountgl-profit_ctr = lt_item-prctr.      " 利润中心
        wa_accountgl-orderid    = lt_item-aufnr.      " 内部订单号
        wa_accountgl-alloc_nmbr = lt_item-zuonr.      " 分配
        wa_accountgl-item_text  = lt_item-sgtxt.      " 行项目文本
        wa_accountgl-bus_area   = lt_item-gsber.      " 业务范围
        wa_accountgl-value_date = lt_item-valut.      " 起息日
        wa_accountgl-plant      = lt_item-werks.      " 工厂
        wa_accountgl-po_number  = lt_item-ebeln.      " 采购凭证
        wa_accountgl-po_item    = lt_item-ebelp.      " 采购订单行号
        wa_accountgl-tax_code  = lt_item-mwskz.       " 税码
        wa_accountgl-ref_key_1 = lt_item-xref1.
        wa_accountgl-ref_key_2 = lt_item-xref2.
        wa_accountgl-ref_key_3 = lt_item-xref3.
        wa_accountgl-wbs_element = lt_item-posid.      "WBS元素
        wa_accountgl-network   = lt_item-nplnr.       "网络
        APPEND wa_accountgl TO it_accountgl.
      WHEN '01' OR '02' OR '03' OR '04' OR '05' OR '06' OR '07'
                OR '08' OR '09' OR '11' OR '12' OR '13' OR '14'
                OR '15' OR '16' OR '17' OR '18' OR '19'. "应收
        CLEAR wa_accountreceivable.
        wa_accountreceivable-itemno_acc = gv_itemno_acc.
        wa_accountreceivable-customer   = lt_item-kunnr.       " 客户编码
        wa_accountreceivable-gl_account = lt_item-hkont.       " 会计科目
        wa_accountreceivable-comp_code  = ls_header-bukrs.     " 公司代码
        wa_accountreceivable-bus_area   = lt_item-gsber.       " 业务范围
        wa_accountreceivable-item_text  = lt_item-sgtxt.       " 行项目文本
        wa_accountreceivable-alloc_nmbr = lt_item-zuonr.       " 分配
        wa_accountreceivable-sp_gl_ind  = lt_item-zumsk.       " 特别总账标识
        wa_accountreceivable-pymt_amt   = lt_item-pyamt.       " 支付金额
        wa_accountreceivable-profit_ctr = lt_item-prctr.       " 利润中心
        wa_accountreceivable-bline_date = lt_item-zfbdt.       " 付款基准日期/到期日
        wa_accountreceivable-ref_key_1  = lt_item-xref1.
        wa_accountreceivable-ref_key_2  = lt_item-xref2.
        wa_accountreceivable-ref_key_3  = lt_item-xref3.
        wa_accountreceivable-pmnt_block = lt_item-zlspr.

        wa_accountreceivable-pymt_meth = 'P'. "农行-对公支付               "付款方式
        IF ls_header-bukrs EQ '1000' OR ls_header-bukrs EQ '3000' OR ls_header-bukrs EQ '4000'.
          wa_accountreceivable-pymt_meth = 'A'."工行-对公支付
        ENDIF.
***增加贷方附加数据 add by dongdong at 20210508 start
        DATA(lv_len) = strlen( lt_item-bankn ) .
        IF lv_len <= 18."收款账户未超过18位
          SELECT SINGLE
            bvtyp INTO wa_accountreceivable-partner_bk
            FROM knbk
            WHERE kunnr = lt_item-kunnr
            AND   banks = 'CN'
            AND   bankn = lt_item-bankn.
        ELSE.
          DATA(lv_dif) = lv_len - 18.
          SELECT SINGLE
            bvtyp INTO wa_accountreceivable-partner_bk
            FROM knbk
            WHERE kunnr = lt_item-kunnr
            AND   banks = 'CN'
            AND   bankn = lt_item-bankn+0(18)
            AND   bkref = lt_item-bankn+18(lv_dif).
        ENDIF.

        APPEND wa_accountreceivable TO it_accountreceivable.
      WHEN '21' OR '22' OR '24' OR '25' OR '26' OR '27' OR '28' OR '29'
                OR '31' OR '32' OR '34' OR '35' OR '36' OR '37' OR '38'
                OR '39'. "应付·
        CLEAR wa_accountpayable.
        wa_accountpayable-itemno_acc = gv_itemno_acc.
        wa_accountpayable-vendor_no  = lt_item-lifnr.       " 供应商编码
        wa_accountpayable-gl_account = lt_item-hkont.       " 会计科目
        wa_accountpayable-comp_code  = ls_header-bukrs.     " 公司代码
        wa_accountpayable-bus_area   = lt_item-gsber.       " 业务范围
        wa_accountpayable-item_text  = lt_item-sgtxt.       " 行项目文本
        wa_accountpayable-alloc_nmbr = lt_item-zuonr.       " 分配
        DATA(long_txt) = lt_item-htnum. "OA传进来的合同号存入到行项目长文本

        IF ls_header-zyf = 'X'.
          wa_accountpayable-sp_gl_ind = 'F'.
          "wa_accountpayable-pymt_meth = lt_item-pymt_meth.
          wa_accountpayable-pymt_meth = 'P'. "农行-对公支付               "付款方式
          IF ls_header-bukrs EQ '1000' OR ls_header-bukrs EQ '3000' OR ls_header-bukrs EQ '4000'.
            wa_accountpayable-pymt_meth = 'A'."工行-对公支付
          ENDIF.
***增加贷方附加数据 add by dongdong at 20210508 start
          lv_len = strlen( lt_item-bankn ) .
          IF lv_len <= 18."收款账户未超过18位
            SELECT SINGLE
              bvtyp INTO wa_accountpayable-partner_bk
              FROM lfbk
              WHERE lifnr = lt_item-lifnr
              AND   banks = 'CN'
              AND   bankn = lt_item-bankn.
          ELSE.
            lv_dif = lv_len - 18.
            SELECT SINGLE
              bvtyp INTO wa_accountpayable-partner_bk
              FROM lfbk
              WHERE lifnr = lt_item-lifnr
              AND   banks = 'CN'
              AND   bankn = lt_item-bankn+0(18)
              AND   bkref = lt_item-bankn+18(lv_dif).
          ENDIF.

          SPLIT lt_item-bankp AT '|' INTO  wa_accountpayable-bank_id  wa_accountpayable-housebankacctid.


*          wa_accountpayable-bank_id = 'GS002'.
*          wa_accountpayable-housebankacctid = 'GS002'.
***增加贷方附加数据 add by dongdong at 20210508 end
        ELSE.
          wa_accountpayable-sp_gl_ind  = lt_item-zumsk.     " 特别总账标识
        ENDIF.
        wa_accountpayable-pymt_amt   = lt_item-pyamt.       " 支付金额
        wa_accountpayable-profit_ctr = lt_item-prctr.       " 利润中心
        wa_accountpayable-bline_date = lt_item-zfbdt.       " 付款基准日期/到期日

        wa_accountpayable-ref_key_1  = lt_item-xref1.
        wa_accountpayable-ref_key_2  = lt_item-xref2.
        wa_accountpayable-ref_key_3  = lt_item-xref3.
        wa_accountpayable-pmnt_block = lt_item-zlspr.
        APPEND wa_accountpayable TO it_accountpayable.




    ENDCASE.

    IF ls_header-zyf = ''.
      CLEAR wa_zexten.
      wa_zexten-posnr = gv_itemno_acc.
      wa_zexten-bschl = lt_item-bschl.
      wa_zexten-rstgr = lt_item-rstgr.
      wa_zexten-xnegp = lt_item-xnegp.
      wa_zexten-numpg = ls_header-numpg.
      wa_zexten-xmwst = lt_item-xmwst.

      CLEAR wa_extension2.
      wa_extension2-structure  = 'ZSFI_ACC_DOCUMENT3'.
      wa_extension2-valuepart1 = wa_zexten.
      APPEND wa_extension2 TO it_extension2.
      APPEND wa_zexten TO it_zexten.
    ELSE.
      wa_zexten_yf-posnr = gv_itemno_acc.        "凭证行项目
*      IF LT_ITEM-ZUMSK = 'A'.       "预付
*        WA_ZEXTEN_YF-ZUMSK = 'A'.      "目标特别总帐标志
*      ELSEIF LT_ITEM-ZUMSK = 'R'.   "应付
*        WA_ZEXTEN_YF-ZUMSK = 'R'.      "目标特别总帐标志
*      ENDIF.
      wa_zexten_yf-zumsk = lt_item-zumsk.
      wa_extension2-structure  = 'ZSMS_EPIC_EXTENSION'.
      wa_extension2-valuepart1 = wa_zexten_yf.
      APPEND wa_extension2 TO it_extension2.
      APPEND wa_zexten_yf TO it_zexten_yf.
    ENDIF.

****STA*******************************************************************************
*FI_OA费用报销单接口_新增扩展字段车号_20210915
    IF lt_item-zzcar IS NOT INITIAL.
      CLEAR lt_zexten_car[].
      CLEAR ls_zexten_car.
      ls_zexten_car-posnr = gv_itemno_acc.
      ls_zexten_car-zzcar = lt_item-zzcar.

      CLEAR ls_extension2.
      ls_extension2-structure  = 'ZSFI_ACC_DOCUMENT4'.
      ls_extension2-valuepart1 = ls_zexten_car.
      APPEND ls_extension2 TO it_extension2.
      APPEND ls_zexten_car TO lt_zexten_car.
    ENDIF.
****END*******************************************************************************

    IF ls_header-waers = g_waers. "货币是本位币 只需生成货币行项目信息

      CLEAR wa_currency_amount.
      wa_currency_amount-itemno_acc = gv_itemno_acc.
      wa_currency_amount-currency   = g_waers.
      IF lt_item-bschl IN lr_jie.
        wa_currency_amount-amt_doccur =  lt_item-wrbtr.
      ELSEIF lt_item-bschl IN lr_dai.
        wa_currency_amount-amt_doccur = 0 - lt_item-wrbtr.
      ENDIF.
      APPEND wa_currency_amount TO it_currency_amount.

    ELSE. "货币不是本位币 生成货币行项目信息以及对应本位币行项目信息

      CLEAR wa_currency_amount.
      wa_currency_amount-itemno_acc = gv_itemno_acc.
      wa_currency_amount-currency   = ls_header-waers.
      wa_currency_amount-curr_type  = '00'.
*      WA_CURRENCY_AMOUNT-EXCH_RATE  = I_KURSF.
      IF lt_item-bschl IN lr_jie.
        wa_currency_amount-amt_doccur = lt_item-wrbtr.
      ELSEIF lt_item-bschl IN lr_dai.
        wa_currency_amount-amt_doccur = 0 - lt_item-wrbtr.
      ENDIF.
      APPEND wa_currency_amount TO it_currency_amount.

      IF lt_item-dmbtr IS NOT INITIAL.
        CLEAR wa_currency_amount.
        wa_currency_amount-itemno_acc = gv_itemno_acc.
        wa_currency_amount-currency = g_waers.
        wa_currency_amount-curr_type = '10'.
        IF lt_item-bschl IN lr_jie.
          wa_currency_amount-amt_doccur = lt_item-dmbtr.
        ELSEIF lt_item-bschl IN lr_dai.
          wa_currency_amount-amt_doccur = 0 - lt_item-dmbtr.
        ENDIF.
        APPEND wa_currency_amount TO it_currency_amount.
      ENDIF.
    ENDIF.

  ENDLOOP.

  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader    = wa_documentheader
      customercpd       = wa_customercpd
    IMPORTING
      obj_type          = gv_objtype
      obj_key           = gv_objkey
      obj_sys           = gv_objsys
    TABLES
      accountgl         = it_accountgl
      accountreceivable = it_accountreceivable
      accountpayable    = it_accountpayable
      accounttax        = it_account_tax
      currencyamount    = it_currency_amount
      return            = it_return
      extension2        = it_extension2.

  LOOP AT it_return INTO wa_return WHERE type = 'E' OR type = 'A'.
    ztype = 'E'.
    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               = wa_return-id
        msgnr               = wa_return-number
        msgv1               = wa_return-message_v1
        msgv2               = wa_return-message_v2
        msgv3               = wa_return-message_v3
        msgv4               = wa_return-message_v4
      IMPORTING
        message_text_output = l_msg.

    CONCATENATE zmsg l_msg '!' INTO zmsg.
  ENDLOOP.

  IF ztype = 'E' .
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    ztype = 'S'.
    CONCATENATE '凭证' gv_objkey+0(10) '已过账到公司代码' gv_objkey+10(4) '' INTO zmsg.
    belnr = gv_objkey+0(10).
**保存行项目长文本 start at 20210603 17:17

*    DATA: gs_header TYPE thead .
*    DATA: gt_ltxts TYPE STANDARD TABLE OF tline .
*    DATA: lw_ltxt  TYPE tline .
*
*
*    CLEAR gt_ltxts[] .
*    CLEAR lw_ltxt .
**
*    "  LW_LTXT-TDFORMAT = '1'.
*    lw_ltxt-tdline = long_txt.   " 长文本
*    APPEND lw_ltxt TO gt_ltxts .
*
*    CLEAR gs_header.
*    gs_header-tdobject = 'DOC_ITEM' .   "文本对象
*    gs_header-tdid      = '0001'.   "文本ID
*    gs_header-tdspras   = sy-langu.  "语言
*    gs_header-tdname    = gv_objkey+10(4) && gv_objkey+0(10) && gv_objkey+14(4) && '001'.  "输入参数
*
*
*    CALL FUNCTION 'SAVE_TEXT'
*      EXPORTING
*        client          = sy-mandt
*        header          = gs_header
*        savemode_direct = 'X'
*      TABLES
*        lines           = gt_ltxts.
*    IF sy-subrc <> 0.
*      ROLLBACK WORK .
*    ELSE.
*      COMMIT WORK AND WAIT .
*    ENDIF.

    DATA:lt_ht TYPE TABLE OF ztps002,
         ls_ht TYPE ztps002.

    ls_ht-belnr = gv_objkey+0(10).
    ls_ht-gjahr = gv_objkey+14(4).
    ls_ht-htnum = long_txt.
    APPEND ls_ht TO lt_ht.

    MODIFY ztps002 FROM TABLE lt_ht.
    IF sy-subrc EQ 0.
      COMMIT WORK.
    ELSE.
      ROLLBACK WORK.
    ENDIF.

**保存行项目长文本 end at 20210603 17:17
  ENDIF.

ENDFUNCTION.

抬头结构

 

 

行结构

 

 

 

 

 

posted @ 2022-10-28 13:44  東東東東  阅读(68)  评论(0编辑  收藏  举报