SAP-ABAP会计凭证创建BAPI

BAPI调用的代码如下,下面分别介绍几个主要参数

        CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
          EXPORTING
            documentheader    = lw_documentheader
            customercpd       = lw_customercpd
            contractheader    = lw_contractheader
          IMPORTING
            obj_type          = lv_obj_type
            obj_key           = lv_obj_key
            obj_sys           = lv_obj_sys
          TABLES
            accountgl         = lt_accountgl
            accountreceivable = lt_accountreceivable
            accountpayable    = lt_accountpayable
            accounttax        = lt_accounttax
            currencyamount    = lt_currencyamount
            criteria          = lt_criteria
            valuefield        = lt_valuefield
            extension1        = lt_extension1
            return            = lt_return
            paymentcard       = lt_paymentcard
            contractitem      = lt_contractitem
            extension2        = lt_extension2
            realestate        = lt_realestate
            accountwt         = lt_accountwt.



        IF lv_obj_key = '$'.
          lv_obj_key = ''.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        ELSE.

          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.

        ENDIF.

        LOOP AT lt_return INTO lw_return.

        ENDLOOP.

供参考的定义的代码,zexten是增强扩展结构,不可缺少,具体往文章后面看

  DATA: lw_documentheader LIKE  bapiache09,
        lw_customercpd    LIKE  bapiacpa09,
        lw_contractheader LIKE  bapiaccahd.

  DATA: lv_obj_type LIKE  bapiache09-obj_type,
        lv_obj_key  LIKE  bapiache09-obj_key,
        lv_obj_sys  LIKE  bapiache09-obj_sys.

  DATA: lw_accountgl         LIKE  bapiacgl09,
        lw_accountreceivable LIKE  bapiacar09,
        lw_accountpayable    LIKE  bapiacap09,
        lw_accounttax        LIKE  bapiactx09,
        lw_currencyamount    LIKE  bapiaccr09,
        lw_criteria          LIKE  bapiackec9,
        lw_valuefield        LIKE  bapiackev9,
        lw_extension1        LIKE  bapiacextc,
        lw_return            LIKE  bapiret2,
        lw_paymentcard       LIKE  bapiacpc09,
        lw_contractitem      LIKE  bapiaccait,
        lw_extension2        LIKE  bapiparex,
        lw_realestate        LIKE  bapiacre09,
        lw_accountwt         LIKE  bapiacwt09.


  DATA: lt_accountgl         LIKE  STANDARD TABLE OF bapiacgl09,
        lt_accountreceivable LIKE  STANDARD TABLE OF bapiacar09,
        lt_accountpayable    LIKE  STANDARD TABLE OF bapiacap09,
        lt_accounttax        LIKE  STANDARD TABLE OF bapiactx09,
        lt_currencyamount    LIKE  STANDARD TABLE OF bapiaccr09,
        lt_criteria          LIKE  STANDARD TABLE OF bapiackec9,
        lt_valuefield        LIKE  STANDARD TABLE OF bapiackev9,
        lt_extension1        LIKE  STANDARD TABLE OF bapiacextc,
        lt_return            LIKE  STANDARD TABLE OF bapiret2,
        lt_paymentcard       LIKE  STANDARD TABLE OF bapiacpc09,
        lt_contractitem      LIKE  STANDARD TABLE OF bapiaccait,
        lt_extension2        LIKE  STANDARD TABLE OF bapiparex,
        lt_realestate        LIKE  STANDARD TABLE OF bapiacre09,
        lt_accountwt         LIKE  STANDARD TABLE OF bapiacwt09.

  DATA: wa_zexten         LIKE zexten.

1.documentheader  :传入会计凭证BKPF表的抬头字段,常用字段如公司代码,过帐日期,凭证类型,凭证抬头文本等


  CLEAR lw_documentheader.
  lw_documentheader-username    = sy-uname.
  lw_documentheader-fisc_year   = iw_formatdata-budat+0(4).
  lw_documentheader-doc_date    = iw_formatdata-bldat."Document Date
  lw_documentheader-pstng_date  = iw_formatdata-budat."Posting Date
  lw_documentheader-fis_period  = iw_formatdata-budat+4(2).
  lw_documentheader-doc_type    = iw_formatdata-blart."Document Type
  lw_documentheader-comp_code   = iw_formatdata-bukrs."Company code
  lw_documentheader-ref_doc_no  = iw_formatdata-xblnr."Reference
  lw_documentheader-header_txt  = iw_formatdata-bktxt."

2.行项目字段数据分成四部分,分别对应记账中的应收(客户D),应付(供应商K),总帐,资产,不同的类型写入不同的数据表,也可以根据记账码来分别

        应收accountreceivable:要写入客户的行,对应的记账码是借方(01-09),贷方(11-19)


        CLEAR:lw_accountreceivable.
        lw_accountreceivable-itemno_acc = 20.
        lw_accountreceivable-customer = '' .
        lw_accountreceivable-item_text =  ''.
        lw_accountreceivable-gl_account = ''.
        lw_accountreceivable-REF_KEY_1  = ''.     "
        lw_accountreceivable-REF_KEY_3  = ''.
        APPEND lw_accountreceivable TO lt_accountreceivable.

        应付accountpayable:要写入供应商的行,对应的记账码是借方(21-29),贷方(31-39) 


        CLEAR:lw_accountpayable.
        lw_accountpayable-itemno_acc = 30.
        lw_accountpayable-VENDOR_NO = ''.
        lw_accountpayable-item_text =  ''.
        lw_accountpayable-gl_account = ''.
        lw_accountpayable-REF_KEY_1  = ''.     "参考码1和3共同存储APP订单号
        lw_accountpayable-REF_KEY_3  = ''.
        APPEND lw_accountpayable TO lt_accountpayable.

        总账和资产accountgl:记账码是总账借方(40)贷方(50)资产借方(70)贷方(75)


        CLEAR: lw_accountgl.
        lw_accountgl-itemno_acc = 10.
        lw_accountgl-gl_account = ''.
        lw_accountgl-item_text =  ''.
        lw_accountgl-REF_KEY_1  = ''.     "参考码1和3共同存储APP订单号
        lw_accountgl-REF_KEY_3  = ''.
        APPEND lw_accountgl TO lt_accountgl.

 3.金额部分currencyamount,每行分录添加进去一条,按照行项目号itemno_acc区分是哪行的金额


        CLEAR: lw_currencyamount.
        lw_currencyamount-itemno_acc = 10.
        lw_currencyamount-currency   =  'CNY'.  "货币
        lw_currencyamount-amt_doccur =  ls_tab-pswbt * -1.  "金额
        lw_currencyamount-exch_rate  =  ls_tab-kursf.  "汇率
        APPEND lw_currencyamount TO lt_currencyamount.

4.COPA获利能力段数据criteria,输入行号,字段名称,以及该字段对应数据,每行数据都能输入多个获利能力段数据,这个用的很少,可以不管 


    IF iw_formatdata-kunnr1 IS NOT INITIAL .
      DATA:lv_kunnr TYPE kunnr .

      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'KNDNR'.
      lv_kunnr = iw_formatdata-kunnr1 .
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = lv_kunnr
        IMPORTING
          output = lv_kunnr.
      gs_copa-character = lv_kunnr .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-matnr IS NOT INITIAL .
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'ARTNR'.
      gs_copa-character = iw_formatdata-matnr .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-vbeln IS NOT INITIAL ..
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'KAUFN'.
      gs_copa-character = iw_formatdata-vbeln .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-vbelp IS NOT INITIAL .
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'KDPOS'.
      gs_copa-character = iw_formatdata-vbelp .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-vkorg IS NOT INITIAL .
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'VKORG'.
      gs_copa-character = iw_formatdata-vkorg .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-vtweg IS NOT INITIAL .
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'VTWEG'.
      gs_copa-character = iw_formatdata-vtweg .
      APPEND gs_copa TO gt_copa .
    ENDIF.
    IF iw_formatdata-spart IS NOT INITIAL ..
      CLEAR gs_copa .
      gs_copa-itemno_acc = iv_index .
      gs_copa-fieldname = 'SPART'.
      gs_copa-character = iw_formatdata-spart .
      APPEND gs_copa TO gt_copa .
    ENDIF.

5.增强扩展数据extension1,需要SE11创建个需要增强扩展的结构,然后在字段extension1-structure输入这个结构名称,数据传入需要定义这个结构的工作区,然后对对应字段赋值,然后整个将这个工作区赋值到extension2-valuepart1,最后添加进表,传入bapi即可


        CLEAR: wa_zexten.
        wa_zexten-posnr   = 10.  "行号
        wa_zexten-bschl = '50'.        "记帐码
        wa_zexten-rstgr = 'A01'.
        lw_extension2-structure  = 'ZEXTEN'.
        lw_extension2-valuepart1 = wa_zexten.
        APPEND lw_extension2 TO lt_extension2.

 增强结构参考定义

 想要增强结构传入的数据生效还需要对bapi做增强才能真正写入会计凭证

SE18可以查看该增强点BADI_ACC_DOCUMENT

 如果有了就不用新增了,没有的话需要SE19实施增强

 在实施方法IF_EX_ACC_DOCUMENT~CHANGE中写入代码后激活即可成功写入增强字段

  METHOD if_ex_acc_document~change.

    DATA: lv_extension      TYPE bapiparex,
          lv_ext_value(960) TYPE c,
          lv_accit          TYPE accit,
          lv_ref            TYPE REF TO data.

    FIELD-SYMBOLS:<l_struc> TYPE any,
                  <l_field> TYPE any.

    SORT c_extension2 BY structure.

    "预制凭证标记
    DATA:ls_exte TYPE bapiparex.
    READ TABLE c_extension2 INTO ls_exte WITH KEY structure = 'PARK'.
    IF sy-subrc = 0.
      MOVE '2' TO c_acchd-status_new.
      DELETE c_extension2 INDEX sy-tabix.
    ENDIF.
    READ TABLE c_extension2 INTO ls_exte WITH KEY structure = 'ZSFI_EXTEN'.
    IF sy-subrc = 0.
      MOVE '2' TO c_acchd-status_new.
*      DELETE c_extension2 INDEX sy-tabix.
    ENDIF.

    LOOP AT c_extension2 INTO lv_extension.
      AT NEW structure.
        if lv_extension-structure ne 'PARK'.
          CREATE DATA lv_ref TYPE (lv_extension-structure).
          ASSIGN lv_ref->* TO <l_struc>.
        endif.
      ENDAT.
      if lv_extension-structure ne 'PARK'.
          CONCATENATE lv_extension-valuepart1 lv_extension-valuepart2
                      lv_extension-valuepart3 lv_extension-valuepart4
                 INTO lv_ext_value.
          MOVE lv_ext_value TO <l_struc>.

        ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>.
        READ TABLE c_accit WITH KEY posnr = <l_field>
              INTO lv_accit.
        IF sy-subrc IS INITIAL.
          MOVE-CORRESPONDING <l_struc> TO lv_accit.
          MODIFY c_accit FROM lv_accit INDEX sy-tabix.
        ENDIF.
     ENDIF.
    ENDLOOP.


  ENDMETHOD.

程序报错收集

1,FB 297 公司没有建立  写入合作伙伴的时候明明有这个合作伙伴但是就是报错,原因是合作合伙伴是6位数,需要加两位前导零

2. F5 846 借/贷标记不一致   记账码对应的金额正负不一致借方记账码应该对应正数金额,贷方记账码对应金额是负数

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值