zoukankan      html  css  js  c++  java
  • ABAP-通过BAPI_ACC_DOCUMENT_POST进行汇票凭证的过账以及预制凭证的生成

    汇票凭证专用事务码是F-36,预制凭证是F-65

    参考了https://mp.weixin.qq.com/s/3PhfUsPmZ0ethWprXpa_dA

    FB03查看银行承兑汇票凭证

     对于特殊总账类型为W或者S的,双击进入可见出票人出票行 票据号等信息

    汇票的信息是保存在BSED里的,而bapi没有提供这些字段信息,所以需要走增强

    解决办法:隐式增强+BADI

    增强位置1: FI_DOCUMENT_CHECK

    一进来,先检查是否是W类型特殊总账  export操作在 调用bapi的时候赋值,推荐使用function函数来做,看的比较直观

    如果是,把char_w 改为U

     在函数最后,改回去

    增强位置2:LFACIF5D

    form最后的地方

    把exten 数据传过来,传给bsed数据,传递数据可以用memory,也可以通过函数的方式,在函数组里建全局内表,然后调bapi的前面传数据过去,存到全局内表里,在增强里再调出来

     以上是关于汇票凭证的增强,预制凭证的话也需要做几个增强

    增强BADI为ACC_DOCUMENT

     在自己代码里把增强结构加上

     以下是完整代码

    FUNCTION ZFIFM0005.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     VALUE(IS_HEADER) TYPE  ZFIS0007 OPTIONAL
    *"  EXPORTING
    *"     VALUE(ES_RETURN) TYPE  ZBCT0002
    *"  TABLES
    *"      IT_ITEMS STRUCTURE  ZFIS0008
    *"----------------------------------------------------------------------
    
      DATA:
        LS_DOCUMENTHEADER    LIKE BAPIACHE09,
        LS_BAPIACGL09        LIKE BAPIACGL09,
        LS_CUSTOMERCPD       LIKE BAPIACAR09,
        LS_ZFIS002           TYPE ZFIS0002,
        LS_CURRENCYAMOUNT    TYPE BAPIACCR09,
        LS_EXTENSION2        TYPE  BAPIPAREX,
        LS_RETURN            TYPE BAPIRET2,
        LT_ACCOUNTGL         TYPE TABLE OF BAPIACGL09 WITH HEADER LINE,
        LT_ACCOUNTRECEIVABLE LIKE TABLE OF BAPIACAR09 WITH HEADER LINE,
        LT_CURRENCYAMOUNT    LIKE TABLE OF BAPIACCR09 WITH HEADER LINE,
        LT_RETURN            LIKE TABLE OF BAPIRET2   WITH HEADER LINE, "BAPIRET2
        LT_EXTENSION2        LIKE TABLE OF BAPIPAREX  WITH HEADER LINE.
    
      DATA M_CURR(13) TYPE C .
    *
      DATA: LV_TYPE LIKE LS_DOCUMENTHEADER-OBJ_TYPE,
            LV_KEY  LIKE LS_DOCUMENTHEADER-OBJ_KEY,
            LV_SYS  LIKE LS_DOCUMENTHEADER-OBJ_SYS.
    
      DATA:LV_SGL_FLD TYPE CHAR1.
      DATA LV_UMSKZ TYPE UMSKZ. "特殊总账标识
      DATA LV_CUSTOMER TYPE KUNNR.
      DATA LV_ITEMNO_ACC TYPE POSNR_ACC .
      DATA LV_BLART      TYPE BLART.
    
      DATA LS_ZFIS0009 TYPE ZFIS0009.
      DATA LS_ZFIT0007 TYPE ZFIT0007.
      DATA LS_BKPF TYPE BKPF.
      DATA LS_ITEMS TYPE ZFIS0008.
      DATA LS_ITEMS2 TYPE ZFIS0008.
      DATA LV_MSG TYPE BAPI_MSG.
    
      CHECK IS_HEADER  IS NOT INITIAL
        AND IT_ITEMS[] IS NOT INITIAL.
    
    * 如果没输过账日期,默认当天
      IF IS_HEADER-BUDAT IS INITIAL.
        IS_HEADER-BUDAT = SY-DATUM.
      ENDIF.
    
    * 如果没输货币码,默认CNY
      IF IS_HEADER-WAERS IS INITIAL.
        IS_HEADER-WAERS = 'CNY'.
      ENDIF.
    
    * 如果没输凭证类型,默认DZ
      IF IS_HEADER-WAERS IS INITIAL.
        IS_HEADER-BLART = 'DZ'.
      ENDIF.
    
      CLEAR LS_ZFIT0007.
      MOVE-CORRESPONDING IS_HEADER TO LS_ZFIT0007.
      LS_ZFIT0007-STMPS = SY-DATUM && SY-UZEIT.
    
      LS_DOCUMENTHEADER-HEADER_TXT = IS_HEADER-BKTXT.
      LS_DOCUMENTHEADER-COMP_CODE  = IS_HEADER-BUKRS.
      LS_DOCUMENTHEADER-DOC_DATE   = IS_HEADER-BUDAT.
      LS_DOCUMENTHEADER-DOC_TYPE   = IS_HEADER-BLART.
      LS_DOCUMENTHEADER-PSTNG_DATE = IS_HEADER-BUDAT.
      LS_DOCUMENTHEADER-USERNAME   = SY-UNAME.
      LS_DOCUMENTHEADER-FISC_YEAR  = IS_HEADER-BUDAT+0(4).
      LS_DOCUMENTHEADER-FIS_PERIOD = IS_HEADER-BUDAT+4(2).
    *LS_DOCUMENTHEADER-BUS_ACT    = 'RFBU'.         "业务事务
    
      LOOP AT IT_ITEMS INTO LS_ITEMS.
    *   行项目号
        LV_ITEMNO_ACC = SY-TABIX.
    
        CLEAR:LV_CUSTOMER,
              LV_SGL_FLD,
              LS_ZFIS002.
    
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = LS_ITEMS-NEWKO
          IMPORTING
            OUTPUT = LV_CUSTOMER.
    
    *    PERFORM FRM_GET_BSCHL USING IS_HEADER-BLART LS_ITEMS-NEWUM CHANGING LV_BSCHL LV_CUSTOMER.
    
        LS_CUSTOMERCPD-ITEMNO_ACC = LV_ITEMNO_ACC.
    
    *   判断记账码
        CASE LS_ITEMS-BSCHL.
          WHEN '09' OR '11'.
            CLEAR LS_CUSTOMERCPD.
            LS_CUSTOMERCPD-ITEMNO_ACC  = LV_ITEMNO_ACC.      "行项目
            LS_CUSTOMERCPD-CUSTOMER    = LV_CUSTOMER.        "客户编号
    *        LS_CUSTOMERCPD-GL_ACCOUNT  = L_ZDHKONT.           "总分类帐帐目
            LS_CUSTOMERCPD-COMP_CODE = IS_HEADER-BUKRS.      "公司代码
            LS_CUSTOMERCPD-ALLOC_NMBR = LS_ITEMS-ZUONR.      "分配
            LS_CUSTOMERCPD-BLINE_DATE = LS_ITEMS-ZFBDT.      "基准日期
            LS_CUSTOMERCPD-ITEM_TEXT  = LS_ITEMS-SGTXT.      "项目文本
    *       判断结算方式
            IF LS_ITEMS-BSCHL = '09'.
              IF IS_HEADER-CSSCODE IS NOT INITIAL.
    *           商业承兑
                IF IS_HEADER-CSSCODE = '04'.
    *              LS_CUSTOMERCPD-SP_GL_IND   = 'W'.    "特別总账标识
    *             汇票需要的数据
                  LV_SGL_FLD = 'W'.
                  EXPORT LV_SGL_FLD TO MEMORY ID 'LV_SGL_FLD'.
                  MOVE-CORRESPONDING LS_ITEMS TO LS_ZFIS0009.
                  APPEND LS_ZFIS0009 TO GT_BSED.
    *           银行承兑
                ELSEIF IS_HEADER-CSSCODE = '06'.
    *              LS_CUSTOMERCPD-SP_GL_IND   = 'S'.    "特別总账标识
    *             汇票需要的数据
                  LV_SGL_FLD = 'S'.
                  EXPORT LV_SGL_FLD TO MEMORY ID 'LV_SGL_FLD'.
                  MOVE-CORRESPONDING LS_ITEMS TO LS_ZFIS0009.
                  APPEND LS_ZFIS0009 TO GT_BSED.
                ENDIF.
              ENDIF.
            ENDIF.
    
            APPEND LS_CUSTOMERCPD TO LT_ACCOUNTRECEIVABLE.
          WHEN '40' OR '50'.
            CLEAR LS_BAPIACGL09.
            LS_BAPIACGL09-ITEMNO_ACC  = LV_ITEMNO_ACC.   "行项目
            LS_BAPIACGL09-GL_ACCOUNT = LV_CUSTOMER.      "总账科目
            LS_BAPIACGL09-PROFIT_CTR = LS_ITEMS-PRCTR.   "利润中心
            LS_BAPIACGL09-COMP_CODE  = IS_HEADER-BUKRS.  "公司代码
            LS_BAPIACGL09-VALUE_DATE = LS_ITEMS-VALUT.   "起息日
            LS_BAPIACGL09-ITEM_TEXT  = LS_ITEMS-SGTXT.   "行项目文本
    
            APPEND LS_BAPIACGL09 TO LT_ACCOUNTGL.
        ENDCASE.
    
        "贷项金额判断
        IF LS_ITEMS-BSCHL EQ 50 OR LS_ITEMS-BSCHL EQ 11.
          LS_ITEMS-WRBTR = -1 * LS_ITEMS-WRBTR.
        ENDIF.
    
        LS_CURRENCYAMOUNT-ITEMNO_ACC = LV_ITEMNO_ACC.
        LS_CURRENCYAMOUNT-CURRENCY   = IS_HEADER-WAERS.
        LS_CURRENCYAMOUNT-AMT_DOCCUR = LS_ITEMS-WRBTR.
        APPEND LS_CURRENCYAMOUNT TO LT_CURRENCYAMOUNT.
        CLEAR LS_CURRENCYAMOUNT.
    *
    ******增强扩展字段
        LS_EXTENSION2-STRUCTURE = 'ZFIS0002' .
        LS_ZFIS002-POSNR = LV_ITEMNO_ACC .
        IF NOT LS_ITEMS-NEWUM IS INITIAL.
          LS_ZFIS002-UMSKZ = LS_ITEMS-NEWUM .
        ENDIF.
        LS_ZFIS002-RSTGR = LS_ITEMS-RSTGR."'A01'.
        LS_ZFIS002-BSCHL = LS_ITEMS-BSCHL. "LV_BSCHL .
        LS_EXTENSION2-VALUEPART1 = LS_ZFIS002 .
        APPEND LS_EXTENSION2 TO  LT_EXTENSION2.
        CLEAR  LS_EXTENSION2.
    
        CLEAR:LV_ITEMNO_ACC,LS_ITEMS.
    
      ENDLOOP.
    
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
        EXPORTING
          DOCUMENTHEADER    = LS_DOCUMENTHEADER
        TABLES
          ACCOUNTGL         = LT_ACCOUNTGL
          ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
          CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
          RETURN            = LT_RETURN
          EXTENSION2        = LT_EXTENSION2.
    
      READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'S'
                                                 NUMBER = '614'.
    
      IF SY-SUBRC EQ 0 .
    *   如果不是承兑,生成预制凭证
        IF IS_HEADER-CSSCODE IS INITIAL.
          CLEAR LS_EXTENSION2.
          LS_EXTENSION2-STRUCTURE = 'PARK'.
          LS_EXTENSION2-VALUEPART1 = 'PARK'.
          APPEND LS_EXTENSION2 TO LT_EXTENSION2.
        ENDIF.
    
        CLEAR LT_RETURN.
        CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
          EXPORTING
            DOCUMENTHEADER    = LS_DOCUMENTHEADER
          IMPORTING
            OBJ_TYPE          = LV_TYPE
            OBJ_KEY           = LV_KEY
            OBJ_SYS           = LV_SYS
          TABLES
            ACCOUNTGL         = LT_ACCOUNTGL
            ACCOUNTRECEIVABLE = LT_ACCOUNTRECEIVABLE
            CURRENCYAMOUNT    = LT_CURRENCYAMOUNT
            RETURN            = LT_RETURN
            EXTENSION2        = LT_EXTENSION2.
        IF LINE_EXISTS( LT_RETURN[ TYPE = 'S' ] ).
    
          ES_RETURN-TYPE = 'S'.
          ES_RETURN-MESSAGE = LV_KEY+0(10).
    
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT = 'X'.
    
          LS_ZFIT0007-BELNR   = LV_KEY+0(10).
          LS_ZFIT0007-TYPE    ='S'.
          LS_ZFIT0007-MESSAGE ='接口调用成功'.
        ELSE.
          SORT LT_RETURN BY TYPE ID NUMBER.
          DELETE ADJACENT DUPLICATES FROM  LT_RETURN COMPARING TYPE ID NUMBER.
    
          ES_RETURN-TYPE = 'E'.
          LOOP AT LT_RETURN INTO LS_RETURN.
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                MSGID               = LS_RETURN-ID
                MSGNR               = LS_RETURN-NUMBER
                MSGV1               = LS_RETURN-MESSAGE_V1
                MSGV2               = LS_RETURN-MESSAGE_V2
                MSGV3               = LS_RETURN-MESSAGE_V3
                MSGV4               = LS_RETURN-MESSAGE_V4
              IMPORTING
                MESSAGE_TEXT_OUTPUT = LV_MSG.
    
            CONCATENATE ES_RETURN-MESSAGE LV_MSG INTO ES_RETURN-MESSAGE.
    
            CLEAR :LV_MSG,LS_RETURN.
    
          ENDLOOP.
    
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    
          LS_ZFIT0007-BELNR   = SPACE.
          LS_ZFIT0007-TYPE    ='E'.
          LS_ZFIT0007-MESSAGE = ES_RETURN-MESSAGE.
    
        ENDIF.
      ELSE.
        ES_RETURN-TYPE = 'E'.
        LOOP AT LT_RETURN INTO LS_RETURN.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = LS_RETURN-ID
              MSGNR               = LS_RETURN-NUMBER
              MSGV1               = LS_RETURN-MESSAGE_V1
              MSGV2               = LS_RETURN-MESSAGE_V2
              MSGV3               = LS_RETURN-MESSAGE_V3
              MSGV4               = LS_RETURN-MESSAGE_V4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MSG.
    
          CONCATENATE ES_RETURN-MESSAGE LV_MSG INTO ES_RETURN-MESSAGE.
    
          CLEAR :LV_MSG,LS_RETURN.
        ENDLOOP.
    
        LS_ZFIT0007-BELNR   = SPACE.
        LS_ZFIT0007-TYPE    ='E'.
        LS_ZFIT0007-MESSAGE = ES_RETURN-MESSAGE.
      ENDIF.
    
      MODIFY ZFIT0007 FROM LS_ZFIT0007.
    ENDFUNCTION.
    
  • 相关阅读:
    思维导图github地址
    python操作mongodb根据_id查询数据的实现方法
    如何让nginx显示文件夹目录
    Scrapy爬虫返回302重定向问题解决方法
    K8s
    Dockerfile文件详解
    k8s简介
    mongodb存储过程
    存储过程详解
    Docker 镜像加速
  • 原文地址:https://www.cnblogs.com/liangliang245916893/p/12888762.html
Copyright © 2011-2022 走看看