abap 实现F-47过账增强

9 篇文章 2 订阅

abap 实现F-47过账增强

  • 需求说明
    前台操作事务代码F-47,产生的是单边凭证,此凭证在epic中可以运行出发票建议,现在要使用ABAP程序实现同样的单边凭证的效果,如图所:
    单边凭证效果

  • 英文参考说明及网址
    英文参考
    参考网址:https://blogs.sap.com/2013/03/27/f-47-downpayment-request-using-bapiaccdocumentpost/

  • 增强BADi
    badi_acc_document

  • 实现步骤
    1.创建增强BADi,如下图所示,BADi名称自己按规范命名
    创建BADi实现

    2.编写增强代码,代码位置:IF_EX_ACC_DOCUMENT~CHANGE(示例代码环境:S/4)
    实现代码

完整参考代码

METHOD if_ex_acc_document~change.

  DATA: wa_extension   TYPE bapiparex,
        ext_value(960) TYPE c,
        wa_accit       TYPE accit,
        l_ref          TYPE REF TO data.

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

  SORT c_extension2 BY structure.

  LOOP AT c_extension2 INTO wa_extension.
    AT NEW structure.
      CREATE DATA l_ref TYPE (wa_extension-structure).
      ASSIGN l_ref->* TO <l_struc>.
    ENDAT.
    CONCATENATE wa_extension-valuepart1 
                wa_extension-valuepart2
                wa_extension-valuepart3 
                wa_extension-valuepart4
           INTO ext_value.
    MOVE ext_value TO <l_struc>.
    "判断是否是epic过账传输的增强结构
    IF wa_extension-structure = 'ZTMS_EPIC_EXTENSION'.
      ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>.
      "得到凭证行
      READ TABLE c_accit ASSIGNING <fs_accit> WITH KEY posnr = <l_field>.
      IF sy-subrc = 0.
        "凭证状态
        <fs_accit>-bstat = 'S'.

        "特别总帐科目的分配号=流动项目
        ASSIGN COMPONENT 'ZFITM' OF STRUCTURE <l_struc> TO <l_field>.
        <fs_accit>-hzuon = <l_field>.

        "目标特别总帐标志
        ASSIGN COMPONENT 'ZUMSK' OF STRUCTURE <l_struc> TO <l_field>.
        <fs_accit>-zumsk = <l_field>.
*        <fs_accit>-zumsk = 'A'.
*        wa_accit-xmwst = 'X'.
        "过账事务代码
        ASSIGN COMPONENT 'TCODE' OF STRUCTURE <l_struc> TO <l_field>.
        <fs_accit>-xref2 = <l_field>.
      ENDIF.
      "业务事务
      c_acchd-glvor = 'RFST'.
      "过账事务代码
      ASSIGN COMPONENT 'TCODE' OF STRUCTURE <l_struc> TO <l_field>.
      c_acchd-tcode = <l_field>.
*------------------------------------------------------*
    ENDIF.
  ENDLOOP.
ENDMETHOD.

生成凭证的function

FUNCTION ztm_epic_006.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IV_ONLY_CHECK) TYPE  CHAR1 DEFAULT 'X'
*"     VALUE(IS_POST_STRUCT) TYPE  ZTMS_EPIC_006
*"  EXPORTING
*"     VALUE(EV_BELNR) TYPE  BELNR_D
*"     VALUE(EV_BUDAT) TYPE  BUDAT
*"  TABLES
*"      ET_MESSAGE STRUCTURE  ZTMS_EPIC_003 OPTIONAL
*"----------------------------------------------------------------------
  DATA:ls_message          TYPE ztms_epic_003.
  DATA:ls_documentheader   TYPE bapiache09.
  DATA:lt_accountgl        TYPE TABLE OF bapiacgl09 WITH HEADER LINE,
       lt_accountpayable   TYPE TABLE OF bapiacap09 WITH HEADER LINE,
       lt_currencyamount   TYPE TABLE OF bapiaccr09 WITH HEADER LINE,
       lt_return           TYPE TABLE OF bapiret2   WITH HEADER LINE.
  DATA:lt_extension        TYPE TABLE OF bapiparex  WITH HEADER LINE.
  DATA:ls_zexten           TYPE ztms_epic_extension.        "增强结构
  DATA:lv_zumsk            TYPE dzumsk.
  DATA:lv_zuonr            TYPE bseg-zuonr.                 "分配

  "清空字段
  CLEAR : ls_documentheader,lt_accountgl,lt_currencyamount,lt_return.
  CLEAR : lt_accountgl[],lt_currencyamount[],lt_return[],et_message[].

  "过账结构中没有数据,返回
  IF is_post_struct IS INITIAL.
    RETURN.
  ENDIF.

  "凭证抬头字段
  ls_documentheader-header_txt  = is_post_struct-bktxt.  "抬头文本
  ls_documentheader-comp_code   = is_post_struct-bukrs.  "公司代码
  ls_documentheader-doc_date    = is_post_struct-zreqd. "凭证日期
  ls_documentheader-pstng_date  = is_post_struct-budat.  "过账日期
  ls_documentheader-username    = sy-uname.       "用户
  ls_documentheader-doc_type    = 'SA'.           "凭证类型
  ls_documentheader-obj_type    = 'BKPFF'.       "参考过程

  "供应商行
  lt_accountpayable-itemno_acc   = '0000000010'.  "行项目编号
  lt_accountpayable-vendor_no    = is_post_struct-lifnr. "供应商编码
  lt_accountpayable-tax_code     = 'J0'.          "税码
  CONDENSE is_post_struct-zaprn.
  lv_zuonr = is_post_struct-zaprn.
  IF lv_zuonr IS INITIAL.
    lv_zuonr = TEXT-010.
  ENDIF.

  lt_accountpayable-alloc_nmbr   = lv_zuonr.          "分配
  lt_accountpayable-item_text    = is_post_struct-zunit.          "部门
*  lt_accountpayable-comp_code    = is_post_struct-bukrs.
  lt_accountpayable-sp_gl_ind    = 'F'.           "特殊总分类帐标志
*  lv_zumsk = is_post_struct-zumsk."目标特别总帐标志

  IF is_post_struct-zptyp = 'A'.        "预付
    lv_zumsk = 'A'.                "目标特别总帐标志
  ELSEIF is_post_struct-zptyp = 'O'.   "应付
    lv_zumsk = 'Z'.                "目标特别总帐标志
  ENDIF.

*  lt_accountpayable-pymt_meth    = '1'.                  "付款方式
  lt_accountpayable-bline_date   = is_post_struct-zfbdt. "到期日,资金申请
  lt_accountpayable-partner_bk   = is_post_struct-bvtyp. "对方开户行类型
*  lt_accountpayable-ref_key_1    = is_post_struct-zhtbh. "合同编号
  APPEND lt_accountpayable.
  CLEAR lt_accountpayable.

  "金额行
  lt_currencyamount-itemno_acc = '0000000010'.  "行项目编号
  lt_currencyamount-amt_doccur = 0 - is_post_struct-zpram. "金额
  lt_currencyamount-currency   = is_post_struct-waer1.     "货币码
*  lt_currencyamount-amt_doccur = 0 - is_post_struct-dmbtr. "金额
*  lt_currencyamount-currency   = is_post_struct-waer2. "货币码
  APPEND lt_currencyamount .
  CLEAR lt_currencyamount.

  "EXTENSION2扩展字段增强部分
  ls_zexten-posnr = '0000000010'.        "凭证行项目
  ls_zexten-zfitm = is_post_struct-zfitm."流动性项目
  ls_zexten-zumsk = lv_zumsk.            "目标特别总帐标志
  ls_zexten-tcode = is_post_struct-tcode."事务代码

  lt_extension-structure  = 'ZTMS_EPIC_EXTENSION'.
  lt_extension-valuepart1 = ls_zexten.
  APPEND lt_extension.

  CLEAR : lt_return.
  "调用凭证检查
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
    EXPORTING
      documentheader          = ls_documentheader
    TABLES
*      accountgl               = lt_accountgl
      accountpayable          = lt_accountpayable
      currencyamount          = lt_currencyamount
      extension2              = lt_extension
      return                  = lt_return
    .
  CLEAR : et_message,et_message[].
  "返回检查结果
  LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
    ls_message-msgty = lt_return-type.
    ls_message-index = is_post_struct-index.
    CONCATENATE TEXT-003 lt_return-parameter
           INTO ls_message-msgv1 SEPARATED BY ':' .
    CONCATENATE lt_return-message_v1 lt_return-message_v2
                lt_return-message_v1 lt_return-message_v2
           INTO ls_message-msgv2.
    ls_message-msgv3 = lt_return-message.
    APPEND ls_message TO et_message.
    CLEAR : lt_return,ls_message.
  ENDLOOP.

  IF iv_only_check = 'X'.
    "只检查过账
    RETURN.
  ELSE.
    "需要过账,并且检查没有错误,则过账
    IF et_message[] IS INITIAL.
      CLEAR : lt_return[],lt_return.
      "调用凭证过账
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
        EXPORTING
          documentheader          = ls_documentheader
        TABLES
*          accountgl               = lt_accountgl
          accountpayable          = lt_accountpayable
          currencyamount          = lt_currencyamount
          extension2              = lt_extension
          return                  = lt_return
        .
      CLEAR : et_message[],et_message.
      "返回检查结果
      LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
        ls_message-msgty = lt_return-type.
        ls_message-index = is_post_struct-index.
        CONCATENATE TEXT-003 lt_return-parameter
               INTO ls_message-msgv1 SEPARATED BY ':' .
        CONCATENATE lt_return-message_v1 lt_return-message_v2
                    lt_return-message_v1 lt_return-message_v2
               INTO ls_message-msgv2.
        ls_message-msgv3 = lt_return-message.
        APPEND ls_message TO et_message.
        CLEAR : lt_return,ls_message.
      ENDLOOP.

      IF et_message[] IS INITIAL.
        "提交
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait          = 'X'  .
        READ TABLE lt_return INDEX 1.
        ev_belnr = lt_return-message_v2+0(10).  "凭证号
        ev_budat = is_post_struct-zreqd.        "过账日期
      ELSE.
        "回滚
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
      ENDIF.
    ENDIF.
  ENDIF.
ENDFUNCTION.
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ABAP是一种用于SAP系统开发的编程语言,其中pp模块是SAP系统中的生产计划模块,主要用于生产计划、生产过程控制和生产数据记录等。 ABAP开发在pp模块中的要点如下: 1. 熟悉pp模块的基础知识:了解pp模块的功能和流程,包括物料需求计划、生产订单、工作中心、生产版本等。这些知识对于正确理解和开发与pp模块相关的程序非常重要。 2. 掌握ABAP语言特性:ABAP作为SAP系统的开发语言,开发人员需要掌握其语法和特性,例如数据类型、变量声明、循环语句、条件语句等。这些知识将帮助开发人员编写高效且可靠的pp模块程序。 3. 理解生产计划数据结构:pp模块涉及的数据结构较为复杂,包括物料清单、工艺路线、生产订单等。开发人员需要了解这些数据结构的组成和关系,以便能够正确地读取和处理这些数据。 4. 开发报表和界面程序:PP模块通常需要输出各种类型的报表,如生产订单报表、工序报表等。开发人员需要根据用户需求设计和开发这些报表,并保证它们的准确性和易用性。 5. 数据验证和错误处理:在pp模块开发中,数据的准确性和可靠性非常重要。开发人员需要编写适当的代码来验证用户输入的数据,并能够处理各种可能的错误情况,以保证系统的稳定性和可靠性。 总之,ABAP开发在pp模块中需要掌握相关的知识和技术,包括pp模块的基础知识、ABAP语言特性、数据结构、报表和界面开发以及数据验证和错误处理等方面。只有掌握这些要点,才能够开发出高质量和高效率的pp模块程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值