SAP ABAP BAPI会计凭证过帐

内容分为前台操作后台调用BAPI BAPI_ACC_DOCUMENT_POST

需求:输入相关字段,调用接口创建一条会计凭证
注意:前台的操作中的过帐码和科目是必填项
过帐码类型: H表示贷方(金额为负数),S表示借方(金额为正数)
根据过帐码的不同,对应科目也会有所不同,有部分是取供应商,有部分直接取总账科目

前台操作:事务码FB01
过帐码:31 (贷方 H 金额为-20)
过帐码:31 (贷方 H 金额为-30)
过帐码:40 (借方 S 金额为-50)
赋值部分:赋值部分有差异根据情况赋值
 FIELD-SYMBOLS: <lv_BLDAT> TYPE any.  " 凭证日期
  FIELD-SYMBOLS: <lv_BUDAT> TYPE any.  " 过账日期
  FIELD-SYMBOLS: <lv_BLART> TYPE any.  " 凭证类型
  FIELD-SYMBOLS: <lv_BUKRS> TYPE any.  " 公司代码
  FIELD-SYMBOLS: <lv_WAERS> TYPE any.  " 货币

  ASSIGN COMPONENT 'BLDAT' OF STRUCTURE p_input TO <lv_BLDAT>.  " 凭证日期
  ASSIGN COMPONENT 'BUDAT' OF STRUCTURE p_input TO <lv_BUDAT>.  " 过账日期
  ASSIGN COMPONENT 'BLART' OF STRUCTURE p_input TO <lv_BLART>.  " 凭证类型
  ASSIGN COMPONENT 'BUKRS' OF STRUCTURE p_input TO <lv_BUKRS>.  " 公司代码
  ASSIGN COMPONENT 'WAERS' OF STRUCTURE p_input TO <lv_WAERS>.  " 货币

  DATA: lt_item TYPE TABLE OF zstms002_line,       " zstms002_items_line,
        lw_item TYPE zstms002_line.                " zstms002_items_line.
  DATA: lt_line TYPE TABLE OF zstms002_items_line,
        lw_line TYPE zstms002_items_line.
  DATA: tp_account TYPE hkont,
        tp_kunnr   TYPE kna1-kunnr.
  DATA: tp_mwdat TYPE STANDARD TABLE OF rtax1u15 WITH HEADER LINE .

  MOVE-CORRESPONDING p_input TO lw_item.
  MOVE-CORRESPONDING lw_item-po_items TO lt_line.
" 输入 Input
  DATA:
    ls_documentheader    TYPE bapiache09,                        " 总账信息
    lt_documentheader    TYPE STANDARD TABLE OF bapiache09,      " 总账信息
    lt_accountgl         TYPE STANDARD TABLE OF bapiacgl09,      " 贷方
    ls_accountgl         TYPE bapiacgl09,
    lt_currencyamount    TYPE STANDARD TABLE OF bapiaccr09,      " 金额数量
    ls_currencyamount    TYPE bapiaccr09,
    lt_extension2        TYPE STANDARD TABLE OF bapiparex,       " 扩展字段
    lt_accountpayable    TYPE STANDARD TABLE OF bapiacap09,      " 供应商
    ls_accountreceivable TYPE                   bapiacar09,      " 客户
    lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09,      " 客户
    ls_accountpayable    TYPE bapiacap09,      " 供应商

    ls_extension2        TYPE bapiparex,
    ls_zexten            LIKE zext2,
    lt_zexten            TYPE STANDARD TABLE OF zext2.
  " 输出
  DATA:
    lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,    " 返回值
    ls_return TYPE bapiret2.
  DATA: lv_line TYPE i.
*----------------------------------------------------------------------抬头数据
  CLEAR ls_documentheader.
  ls_documentheader-doc_type   = <lv_BLART>.   " 凭证类型
  ls_documentheader-doc_date   = <lv_BLDAT>.   " 凭证中的凭证日期
  ls_documentheader-pstng_date = <lv_BUDAT>.   " 凭证中的过账日期
  ls_documentheader-comp_code  = <lv_BUKRS>.   " 公司代码
  ls_documentheader-username = sy-uname.       " 用户名
*------------------------------------------------------------------------行项目数据
  CLEAR: lt_accountgl,ls_accountgl,
  lt_currencyamount,ls_currencyamount,
  lt_extension2,ls_extension2.

  CLEAR lv_line.
  LOOP AT lt_line INTO lw_line.
    lv_line = lv_line + 1.
    IF lw_line-bschl = '40' OR lw_line-bschl = '50'.
      ls_accountgl-itemno_acc = lv_line.                     " 行项目编号
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = lw_line-hkont
      IMPORTING
        OUTPUT = lw_line-hkont.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = lw_line-KOSTL
      IMPORTING
        OUTPUT = lw_line-KOSTL.
      ls_accountgl-gl_account  = lw_line-hkont.               " 总分类帐科目
      ls_accountgl-comp_code   = <lv_BUKRS>.                  " 公司代码
      ls_accountgl-doc_type    = <lv_BLART>.                  " 凭证类型
      ls_accountgl-COSTCENTER  = lw_line-KOSTL.               " 成本中心
      ls_accountgl-TAX_CODE    = lw_line-MWSKZ.               " 税码
      APPEND ls_accountgl TO lt_accountgl.
      CLEAR:ls_accountgl.
    ELSEIF lw_line-bschl >= '01' AND lw_line-bschl <= '19' .
      CLEAR: tp_kunnr,tp_account .
      tp_kunnr = lw_line-hkont .
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = tp_kunnr
        IMPORTING
          output = tp_kunnr.
      SELECT SINGLE akont                   "找出供应商统驭科目
        INTO tp_account
        FROM lfb1
       WHERE bukrs = <lv_BUKRS>
         AND lifnr = tp_kunnr.
      ls_accountreceivable-itemno_acc = lv_line.
      ls_accountreceivable-comp_code  = <lv_BUKRS>.   " 公司代码
      ls_accountreceivable-customer   = tp_kunnr .
      ls_accountreceivable-gl_account = tp_account.
      APPEND ls_accountpayable TO lt_accountpayable .
      CLEAR  ls_accountpayable .
    ELSEIF lw_line-bschl >= '21' AND lw_line-bschl <= '39' .
      CLEAR: tp_kunnr,tp_account .
      tp_kunnr = lw_line-hkont .
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = tp_kunnr
        IMPORTING
          output = tp_kunnr.
      SELECT SINGLE akont                        " 找出供应商统驭科目
        INTO tp_account
        FROM lfb1
       WHERE bukrs = <lv_BUKRS>
         AND lifnr = tp_kunnr.

      ls_accountpayable-itemno_acc = lv_line.
      ls_accountpayable-vendor_no  = tp_kunnr .
      ls_accountpayable-comp_code  = <lv_BUKRS>.   " 公司代码
      ls_accountpayable-gl_account = tp_account .
      APPEND ls_accountpayable TO lt_accountpayable .
      CLEAR ls_accountpayable .
    ENDIF.
*******************************************************************************  金额
    DATA:tp_shkzg TYPE shkzg .                      "根据记账码判断是借项还是贷项
    CLEAR: tp_shkzg  .
    SELECT SINGLE shkzg
    INTO tp_shkzg
    FROM tbsl
    WHERE bschl = lw_line-bschl .
    IF tp_shkzg = 'H'.                              "贷项金额取负值
      lw_line-wrbtr = - lw_line-wrbtr .
    ENDIF.

    " CURRENCYAMOUNT 金额数量
    ls_currencyamount-itemno_acc = lv_line.         " 行项目编号
    ls_currencyamount-amt_doccur = lw_line-wrbtr.   " 金额
    ls_currencyamount-currency   = 'CNY'.           " 货币
    APPEND ls_currencyamount TO lt_currencyamount.
    CLEAR:ls_currencyamount.

    CLEAR: ls_zexten,ls_extension2.
    ls_zexten-posnr = lv_line.              " 凭证行项目
    ls_zexten-bschl  = lw_line-bschl.       " 记账码
    APPEND ls_zexten TO lt_zexten.

    ls_extension2-structure  = 'ZEXT2'.
    ls_extension2-valuepart1 = ls_zexten.
    APPEND ls_extension2 TO lt_extension2.
    CLEAR: ls_zexten,ls_extension2.

  ENDLOOP.
 " 调用BAPI函数
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader    = ls_documentheader      " 总账信息
    TABLES
      accountgl         = lt_accountgl           " 贷方,应收
      accountreceivable = lt_accountreceivable   " 借方,应付
      accountpayable    = lt_accountpayable      " 应付
      currencyamount    = lt_currencyamount      " 借贷的金额
      return            = lt_return              " 返回值
      extension2        = lt_extension2.         " 扩展字段

  READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.

  IF sy-subrc NE 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    t_output-error_flag = 'S'.
    t_output-message = '会计凭证号:' &&  lt_return-message_v2+0(10) &&
     '   公司代码:' && lt_return-message_v2+10(4) &&
     '   会计年度:' && lt_return-message_v2+14(4) && ' 已过账'.
*    t_output-BELNR =   lt_return-MESSAGE_V2+0(10).
    APPEND t_output.

  ELSE .
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    t_output-error_flag = 'E'.
    t_output-MESSAGE = lt_return-message .
    APPEND t_output.
  ENDIF.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 'b'sap abap bapi、badi、区别' 的意思是什么? 这个问题的意思是要求解释 "bapi"、"badi" 和 "abap" 之间的区别。"abap" 是德国软件公司 SAP 开发的编程语言,用于开发 SAP 系统中的应用程序。"bapi" (Business Application Programming Interface) 是 SAP 系统中的一个功能模块,用于连接不同的 SAP 应用程序和传递数据。而 "badi" (Business Add-Ins) 则是一种钩子机制,允许在 SAP 系统中插入自定义代码,以增强系统的功能和灵活性。所以,虽然 "bapi" 和 "badi" 都是 SAP 系统中的编程接口,但它们的作用和实现方式是不同的。 ### 回答2: SAP ABAPSAP的编程语言,是一种面向对象的编程语言,用于开发SAP系统的应用程序。而BAPI和BADI则是SAP ABAP的两种不同的编程方法。 BAPI是Business Application Programming Interface的缩写,是一组已定义的函数模块,用于与SAP系统进行交互。BAPI可以用来调用SAP系统中的标准功能模块,以实现对标准SAP应用程序的访问和修改,还可以通过自定义函数模块进行个性化定制。BAPI旨在使不同的系统和应用程序能够无缝地进行集成,使它们更加灵活和可扩展。 BADI是Business Add-ins的缩写,是一种钩子(hook)技术,用于扩展SAP系统的标准功能。BADI提供了一种平台来开发、实现和操作可插入业务功能,使用户可以轻松地定制和扩展SAP应用程序,而且不会影响到标准SAP系统。用户可以在不同的SAP系统中使用同一种BADI实现,这使得BADI具有极大的灵活性和可重用性。 总体来说,BAPISAP系统的开放接口,用于与外部系统集成和定制,而BADI则是在SAP系统中增加附加业务逻辑的一种方式。虽然它们都是SAP ABAP编程中的重要技术,但它们的应用场景和目的有所不同。 ### 回答3: SAP ABAP BAPI和BADI是SAP系统中两种不同的编程方式。BAPI(Business Application Programming Interface)是SAP系统中一种标准的用于开发对外接口的编程方式,而BADI(Business Add-In)是SAP系统中一种基于面向对象的扩展点的编程方式。 BAPI是一种标准化编程接口,它允许开发人员将SAP系统中的业务逻辑封装成可重复使用的程序集,这些程序集可以被任何其他系统或应用程序使用。使用BAPI开发的程序可以被称为SAP的Web服务或API,它们可以通过网络调用,实现不同系统之间的数据传输和业务逻辑交互。BAPI通过一些标准提供的接口,如RFC(远程函数调用)和IDoc(中间文档)来实现与外部应用程序的数据交互。 与之不同的是,BADI是在SAP应用程序内部定义的一个特定点,用于扩展标准SAP业务逻辑。BADI是基于面向对象编程的原则,允许开发人员在SAP业务流程中插入自定义逻辑。BADI具有良好的可维护性和灵活性,因此比其他的扩展点如User Exit更加强大。BADI通常为开发人员提供了一些固定的入口点,使其可以在SAP系统的不同流程中添加自定义逻辑以满足业务需求。BADI可以在程序运行时被动态调用,因此可以大大增加程序的可扩展性。 需要注意的是,虽然BAPI和BADI都是SAP系统中的编程方式,但是它们有着不同的应用前提和场景。BAPI是为了将SAP系统扩展到其他系统或平台而开发的,其应用场景一般限制于外部应用程序与SAP交互的数据传输;而BADI则主要用于对SAP系统内的特定点进行业务逻辑扩展,其应用场景则更加广泛。在实际开发中,开发人员需要根据具体应用场景的需求进行选择和应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值