FI-开票后冲销发出商品-差异处理(开发笔记)

*&---------------------------------------------------------------------*
*& Report ZFIR122
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2019-03-13
*& Program Type        :  Report
*& Description         :  开票后冲销发出商品-差异处理
*&---------------------------------------------------------------------*
REPORT ZFIR122.

*&---------------------------------------------------------------------*
*& 包含               ZFIR092_TOP
*&---------------------------------------------------------------------*

TABLES:ACDOCA,BKPF,EKKN,VBAP.

TYPE-POOLS:SLIS.

"定义ALV输出所需变量
DATAS_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATAGT_RETURN   LIKE BAPIRET2 OCCURS WITH HEADER LINE.
DATAU_BUDAT     TYPE BUDAT.
DATAN_BUDAT     TYPE BUDAT.
DATAY_BUDAT     TYPE BUDAT.
DATAP_BUDAT     TYPE ACDOCA-BUDAT.

TYPESBEGIN OF GTS_DATA,

        RBUKRS       TYPE  T001-BUKRS,               "公司代码
        GJAHR        TYPE  BKPF-GJAHR,               "财年
        MONAT        TYPE  BKPF-MONAT,               "会计期间

        AWREF        TYPE  ZTFI121-AWREF,            "原开票凭证
        AWITEM       TYPE  ZTFI121-AWITEM,           "原开票项目
        WERKS        TYPE  ZTFI121-WERKS,            "工厂
        PRCTR        TYPE  ZTFI121-PRCTR,            "利润中心
        KUNAG        TYPE  ZTFI121-KUNAG,            "售达方
        VBUND        TYPE  ZTFI121-VBUND,            "贸易伙伴
        MATNR        TYPE  ZTFI121-MATNR,            "物料
        MAKTG        TYPE  ZTFI121-MAKTG,            "描述
        RACCT        TYPE  ZTFI121-RACCT,            "科目号
        RHCUR        TYPE  ZTFI121-RHCUR,            "公司代码货币
        VGBEL        TYPE  ZTFI121-VGBEL,            "交货单
        VGPOS        TYPE  ZTFI121-VGPOS,            "行项目
        FTHSL        TYPE  ZTFI121-FTHSL,            "原分摊金额
        VBELN        TYPE  VBRP-VBELN,               "开票凭证
        POSNR        TYPE  VBRP-POSNR,               "开票项目
        BUDAT        TYPE  ACDOCA-BUDAT,             "过账日期

      END OF GTS_DATA.

DATAGLAG_N    TYPE  C  .
DATAGLAG_E    TYPE  C  .
DATAGT_DATA   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGS_DATA   TYPE GTS_DATA .
DATAGT_REVERSAL TYPE TABLE OF BAPIACREV WITH HEADER LINE.
DATAGT_ZTFI122  TYPE TABLE OF ZTFI122 WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERSP_BUKRS LIKE ACDOCA-RBUKRS MODIF ID C1 OBLIGATORY ,              "公司代码
            P_GJAHR LIKE BKPF-GJAHR    MODIF ID C1 OBLIGATORY ,              "年度
            P_MONAT LIKE BKPF-MONAT    MODIF ID C1 OBLIGATORY .              "期间
SELECTION-SCREEN END OF BLOCK B1.
*&---------------------------------------------------------------------*
*& 包含               ZFIR101_CLASS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*       CLASS DEMO DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS DEMO DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      MAIN.
ENDCLASS.

CLASS DEMO IMPLEMENTATION.
  METHOD MAIN.
    DATA(OUT) = CL_DEMO_OUTPUT=>NEW( ).

    OUT->BEGIN_SECTION`报错信息回执`
      )->WRITEGT_RETURN[] ).

    OUT->DISPLAY( ).
  ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& 包含               ZFIR092_FOM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_EXCLUDE_OPTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_EXCLUDE_OPTION .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_OUTPUT .
  LOOP AT SCREEN.
    CASE SCREEN-GROUP1.
      WHEN 'M1'.
        SCREEN-INPUT '0'.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
 AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
  ID 'BUKRS' FIELD P_BUKRS.
  IF SY-SUBRC <> 0.
    MESSAGE '您没有公司:'&& P_BUKRS && '  的权限!TYPE 'E' .
  ENDIF.

*  MESSAGE I000(0K) WITH TEXT-115 SPACE SPACE SPACE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  FIELD-SYMBOLS <FS> .
  DATAG_FIELD(40).
*取所选期间的第一天
  U_BUDAT P_GJAHR && P_MONAT && '01' .
*取所选年度的第一天
  Y_BUDAT P_GJAHR && '01' && '01' .
*取所选期间的最后一天
  CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
    EXPORTING
       I_DATE        U_BUDAT
    
IMPORTING
       E_DATE        P_BUDAT
       
.

    FIELD-SYMBOLS <GS_DATA> LIKE GT_DATA .
**取所选期间次月的第一天
    N_BUDAT P_BUDAT + .

    CLEAR GT_DATA[] .
    SELECT
      ZTFI121~AWREF
      ZTFI121
~AWITEM
      ZTFI121
~WERKS
      ZTFI121
~PRCTR
      ZTFI121
~KUNAG
      ZTFI121
~VBUND
      ZTFI121
~MATNR
      ZTFI121
~MAKTG
      ZTFI121
~RACCT
      ZTFI121
~RHCUR
      ZTFI121
~VGBEL
      ZTFI121
~VGPOS
      ZTFI121
~FTHSL
      ZTFI121
~RBUKRS
      ZTFI121
~GJAHR
      VBRP
~VBELN
      VBRP
~POSNR
     
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
      
FROM ZTFI121
      INNER 
JOIN VBRK ON ZTFI121~AWREF VBRK~SFAKN
      INNER 
JOIN VBRP ON VBRK~VBELN VBRP~VBELN
        
WHERE ZTFI121~FTHSL <> 0
          AND ZTFI121~RBUKRS P_BUKRS
          
AND VBRK~FKDAT >= U_BUDAT
          
AND VBRK~FKDAT <= P_BUDAT
          
.

    LOOP AT GT_DATA ASSIGNING <GS_DATA> .
      <GS_DATA>-BUDAT P_BUDAT .
      <GS_DATA>-MONAT P_MONAT .
    ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
  CLEAR S_LAYOUT.
  S_LAYOUT-ZEBRA 'X'.
  S_LAYOUT-COLWIDTH_OPTIMIZE 'X'.
*  s_layout-box_fieldname    = 'BOX'.
  PERFORM FRM_FILL_FIELD .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      IS_LAYOUT                S_LAYOUT
      IT_FIELDCAT              
GT_FIELDCAT
      I_CALLBACK_PROGRAM       
SY-REPID
      I_CALLBACK_PF_STATUS_SET 
'PF_STATUS_SET'
*     i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      I_CALLBACK_USER_COMMAND  'USER_COMMAND'
    TABLES
      T_OUTTAB                 GT_DATA[].
ENDFORM.

FORM FRM_FILL_FIELD .
  DATA:  WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
  DEFINE FILL_FIELD.
    wa_fieldcat-fieldname &1.
    wa_fieldcat-seltext_l &2.
*    IF wa_fieldcat-fieldname =  'MSLJH' or wa_fieldcat-fieldname =  'WCBJH'.
*      wa_fieldcat-EMPHASIZE = 'C600'. "设置字段的颜色
*    ENDIF.
*
*    IF wa_fieldcat-fieldname =  'MSLMB' or wa_fieldcat-fieldname =  'WCBMB'.
*      wa_fieldcat-EMPHASIZE = 'C710'. "设置字段的颜色
*    ENDIF.

    IF wa_fieldcat-fieldname 'PLNBEZ' OR wa_fieldcat-fieldname 'MATNR' .
      wa_fieldcat-ref_tabname 'MARA'.
      wa_fieldcat-ref_fieldname 'MATNR'.
    ENDIF.

    IF wa_fieldcat-fieldname 'ARKTX' OR wa_fieldcat-fieldname 'WAKTX' .
      wa_fieldcat-ref_tabname 'VBAP'.
      wa_fieldcat-ref_fieldname 'ARKTX'.
    ENDIF.

    IF wa_fieldcat-fieldname 'AUFNR' .
      wa_fieldcat-ref_tabname 'AUFK'.
      wa_fieldcat-ref_fieldname 'AUFNR'.
    ENDIF.

    APPEND wa_fieldcat TO gt_fieldcat.
    CLEAR wa_fieldcat.
  END-OF-DEFINITION.
  FILL_FIELD :
        'RBUKRS'         '公司代码',
        'GJAHR'          '财年',
        'MONAT'          '会计期间',
        'AWREF'          '原开票凭证',
        'AWITEM'         '原开票项目',
        'WERKS'          '工厂',
        'PRCTR'          '利润中心',
        'KUNAG'          '售达方',
        'VBUND'          '贸易伙伴',
        'MATNR'          '物料',
        'MAKTG'          '物料描述',
        'RACCT'          '科目号',
        'RHCUR'          '公司代码货币',
        'VGBEL'          '交货单',
        'VGPOS'          '行项目',
        'FTHSL'          '原分摊金额',
        'VBELN'          '开票凭证',
        'POSNR'          '开票项目',
        'BUDAT'          '过账日期'.

ENDFORM.

FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.

FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
                    IS_SELFIELD 
TYPE SLIS_SELFIELD.
  DATA:   REF TYPE REF TO CL_GUI_ALV_GRID.
  DATA :  LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
  RANGESL_WERKS FOR T001W-WERKS.
  RANGESL_MATNR FOR MARA-MATNR.
  DATA:   L_BUKRS TYPE T001K-BUKRS.

  LV_STABLE-ROW '1'.
  LV_STABLE-COL '1'.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID REF.
  CALL METHOD REF->CHECK_CHANGED_DATA.

  CASE I_UCOMM.
    WHEN 'POST_T'.
      CLEAR GT_RETURN[] .
      PERFORM FRM_DATA_POST_T .
      LOOP AT GT_RETURN WHERE TYPE 'E'.
      ENDLOOP.
      IF SY-SUBRC 0.
        DEMO=>MAIN( ).
      ELSE .
        MESSAGE '模拟过账成功,可以进行正式过账!' TYPE 'S' .
      ENDIF.
    WHEN 'POST'.

      IF GT_RETURN[] IS INITIAL.
        MESSAGE '请先进行模拟过账!TYPE 'S' DISPLAY LIKE 'W'.
      ELSE .
        LOOP AT GT_RETURN WHERE TYPE 'E'.
        ENDLOOP.
        IF SY-SUBRC 0.
          MESSAGE '模拟过账时出错!TYPE 'S' DISPLAY LIKE 'E'.
        ELSE .
          CLEAR GT_ZTFI122 .
          SELECT SINGLE INTO CORRESPONDING FIELDS OF GT_ZTFI122 FROM ZTFI122
          
WHERE RBUKRS P_BUKRS
            
AND FISCYEARPER P_BUDAT(6)
            .

          DATA LV_FLAG TYPE C .
          CLEAR LV_FLAG .
          SELECT SINGLE ZFLAG INTO LV_FLAG FROM ZTIR094
            
WHERE ZPNAME 'ZFI122'
            .

          IF LV_FLAG IS NOT INITIAL.

            IF GT_ZTFI122 IS NOT INITIAL.
              MESSAGE '当前选择的期间已经过账,不能重复执行!' TYPE 'S' DISPLAY LIKE 'E'.
            ELSE .

              CLEAR GT_RETURN[] .
              PERFORM FRM_DATA_POST .

              LOOP AT GT_RETURN WHERE TYPE 'E'.
              ENDLOOP.
              IF SY-SUBRC 0.
                DEMO=>MAIN( ).
              ELSE .
                CLEAR GT_ZTFI122[].
                LOOP AT GT_DATA.
                  MOVE-CORRESPONDING GT_DATA TO GT_ZTFI122 .
                  GT_ZTFI122-FISCYEARPER P_BUDAT(6) .
                  APPEND GT_ZTFI122 .
                  CLEAR  GT_ZTFI122 .
                ENDLOOP.
                MODIFY ZTFI122 FROM TABLE GT_ZTFI122[] .
                COMMIT WORK .
                MESSAGE '期间过账成功TYPE 'S' .
              ENDIF.

            ENDIF.

          ELSE .

              CLEAR GT_RETURN[] .
              PERFORM FRM_DATA_POST .

              LOOP AT GT_RETURN WHERE TYPE 'E'.
              ENDLOOP.
              IF SY-SUBRC 0.
                DEMO=>MAIN( ).
              ELSE .
                CLEAR GT_ZTFI122[].
                LOOP AT GT_DATA.
                  MOVE-CORRESPONDING GT_DATA TO GT_ZTFI122 .
                  GT_ZTFI122-FISCYEARPER P_BUDAT(6) .
                  APPEND GT_ZTFI122 .
                  CLEAR  GT_ZTFI122 .
                ENDLOOP.
                MODIFY ZTFI122 FROM TABLE GT_ZTFI122[] .
                COMMIT WORK .
                MESSAGE '期间过账成功TYPE 'S' .
              ENDIF.

            IF GT_ZTFI122 IS NOT INITIAL.
              MESSAGE '当前选择的期间已经过账,未启用重复过帐检查!' TYPE 'W' .
            ENDIF.

          ENDIF.

        ENDIF.
      ENDIF.

  ENDCASE.

  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST_T
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_T .
  DATA:
    TEMP_MONTH(2),            "输入月份
    HEADER_TXT(25),           "取会计年月+固定文本制费及研发费分摊
    TEMP_AUT_MSG(30),
    LAST_DATA          LIKE SY-DATUM"一个月的最后一天
    TEMP_OBJ_KEY       TYPE AWKEY,  "是否生成
    HEADER             LIKE BAPIACHE09  OCCURS WITH HEADER LINE,
    WA_ACCOUNTGL       LIKE BAPIACGL09  OCCURS WITH HEADER LINE,
    LT_ACCOUNTGL       TYPE STANDARD TABLE OF BAPIACGL09,
    WA_CURRENCY_AMOUNT LIKE BAPIACCR09  OCCURS WITH HEADER LINE,
    LT_CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09 WITH HEADER LINE,
    IT_EXTENSION2      TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE,
    LT_RETURN          LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    GST_RETURN         LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    LS_ZFI002          TYPE ZFI002,
    FT_FLAG   ,               "= ‘X'表示分摊过
    LV_ANSWER(1),
    TEMP_BWTAR_AUFNR   LIKE AFPO-AUFNR.
  DATAGS_EXTENSION2  TYPE ZSFI_EXTEN,                              "会计凭证过账增强extension2
        LT_EXTENSION2  TYPE TABLE OF BAPIPAREX WITH HEADER LINE.     "返回参数

  DATALV_OBJ_TYPE    LIKE BAPIACHE09-OBJ_TYPE,
        LV_OBJ_KEY     LIKE BAPIACHE09-OBJ_KEY,
        LV_OBJ_SYS     LIKE BAPIACHE09-OBJ_SYS.

  DATALV_DMBTR       TYPE BAPIWRBTR,
        LV_LINES       TYPE SY-TABIX,
        ZCOUNT         TYPE SY-TABIX,
        ZCOUNTA        TYPE SY-TABIX,
        ZCOUNTB        TYPE SY-TABIX,
        ZCOUNTC        TYPE SY-TABIX,
        LV_WRBTR       TYPE BSEG-WRBTR,
        DO_POST        TYPE CHAR1,
        LS_EXTEN       TYPE ZSFI_EXTEN.
  DATALS_BKPF        TYPE BKPF,
        LS_REVERSAL    TYPE BAPIACREV.
  DATAGV_OBJ_TYPE    TYPE BAPIACHE09-OBJ_TYPE,                      "参考过程
        GV_OBJ_KEY     TYPE BAPIACHE09-OBJ_KEY,                       "对象键值
        GV_OBJ_SYS     TYPE BAPIACHE09-OBJ_SYS.
  DATA LV_BELNR_01     TYPE BKPF-BELNR.
  DATA LV_WAERS        TYPE T001-WAERS.

  CLEAR GST_RETURN[] .
*会计凭证抬头数据
  CLEAR HEADER.
  HEADER_TXT '开票凭证冲销后冲回成本 ' .
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'ML'.          "凭证类型
  HEADER-COMP_CODE  P_BUKRS.       "公司代码
*  HEADER-BUS_ACT    = 'RFBU'.        "业务事务
  HEADER-FISC_YEAR  P_BUDAT(4).    "财年
  HEADER-FIS_PERIOD P_BUDAT+4(2).  "会计期间
  HEADER-HEADER_TXT HEADER_TXT.    "凭证抬头文本

  DATA LV_ROWCNT TYPE I.
  DATA LV_ZCOUNT TYPE I.
  DATA LV_ZCOUNT_01 TYPE I.
  DESCRIBE TABLE GT_DATA[] LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA.

*    写入分录1
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL .                       "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  '1406010500'.                              "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

*    写入分录2
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL * -1.                   "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACCT.                             "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    LOOP AT LT_CURRENCY_AMOUNT WHERE AMT_DOCCUR <> 0.
    ENDLOOP.
    IF SY-SUBRC 0.
      CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
        EXPORTING
          DOCUMENTHEADER HEADER
*        IMPORTING
*          OBJ_TYPE       = LV_OBJ_TYPE
*          OBJ_KEY        = LV_OBJ_KEY
*          OBJ_SYS        = LV_OBJ_SYS
        TABLES
          ACCOUNTGL      LT_ACCOUNTGL         "总帐科目项
          CURRENCYAMOUNT LT_CURRENCY_AMOUNT   "货币项目
          EXTENSION2     LT_EXTENSION2
          
RETURN         LT_RETURN.           "返回值

        CLEAR LT_RETURN.
        LOOP AT LT_RETURN .
          APPEND LT_RETURN TO GST_RETURN .
          CLEAR LT_RETURN .
        ENDLOOP.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.

    FREE:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_RETURN.

  ELSE .

    LV_ZCOUNT LV_ROWCNT.
    CLEAR :LV_LINES,LV_ZCOUNT_01.
    CLEAR ZCOUNT.

    LOOP AT GT_DATA.

      ZCOUNT ZCOUNT + 1.
      IF ZCOUNT > 499.
        CLEAR:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_EXTENSION2[],LT_RETURN.
        LV_LINES 0.
        ZCOUNT 1.
        LV_ZCOUNT LV_ROWCNT LV_ZCOUNT_01.
        CLEAR LV_LINES.
      ENDIF.

      LV_ZCOUNT_01 LV_ZCOUNT_01 + 1.

*    写入借方
      ADD TO LV_LINES.

      IF LV_ZCOUNT >= 499 AND ZCOUNT 499 OR LV_ZCOUNT < 499 AND LV_ZCOUNT ZCOUNT ) .
        DO_POST 'X'.
      ENDIF.

*    写入分录1
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL .                       "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  '1406010500'.                              "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

*    写入分录2
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL * -1.                   "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACCT.                             "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.
        LOOP AT LT_CURRENCY_AMOUNT WHERE AMT_DOCCUR <> 0.
        ENDLOOP.
        IF SY-SUBRC 0.
          CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
            EXPORTING
              DOCUMENTHEADER HEADER
*            IMPORTING
*              OBJ_TYPE       = LV_OBJ_TYPE
*              OBJ_KEY        = LV_OBJ_KEY
*              OBJ_SYS        = LV_OBJ_SYS
            TABLES
              ACCOUNTGL      LT_ACCOUNTGL         "总帐科目项
              CURRENCYAMOUNT LT_CURRENCY_AMOUNT   "货币项目
              EXTENSION2     LT_EXTENSION2
              
RETURN         LT_RETURN.           "返回值

            CLEAR LT_RETURN.
            LOOP AT LT_RETURN .
              APPEND LT_RETURN TO GST_RETURN .
              CLEAR LT_RETURN .
            ENDLOOP.

          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.

        FREE:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_RETURN.
        DO_POST ''.
      ENDIF.

    ENDLOOP.

  ENDIF.

  SORT GST_RETURN[] BY MESSAGE .
  DELETE ADJACENT DUPLICATES FROM GST_RETURN[] COMPARING MESSAGE.

  LOOP AT GST_RETURN.
    GST_RETURN-MESSAGE '模拟过账:开票凭证冲销后冲回成本 ' && GST_RETURN-MESSAGE .
    APPEND GST_RETURN TO GT_RETURN .
    CLEAR  GST_RETURN .
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST .
  DATA:
    TEMP_MONTH(2),            "输入月份
    HEADER_TXT(25),           "取会计年月+固定文本制费及研发费分摊
    TEMP_AUT_MSG(30),
    LAST_DATA          LIKE SY-DATUM"一个月的最后一天
    TEMP_OBJ_KEY       TYPE AWKEY,  "是否生成
    HEADER             LIKE BAPIACHE09  OCCURS WITH HEADER LINE,
    WA_ACCOUNTGL       LIKE BAPIACGL09  OCCURS WITH HEADER LINE,
    LT_ACCOUNTGL       TYPE STANDARD TABLE OF BAPIACGL09,
    WA_CURRENCY_AMOUNT LIKE BAPIACCR09  OCCURS WITH HEADER LINE,
    LT_CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09 WITH HEADER LINE,
    IT_EXTENSION2      TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE,
    LT_RETURN          LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    GST_RETURN         LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    LS_ZFI002          TYPE ZFI002,
    FT_FLAG   ,               "= ‘X'表示分摊过
    LV_ANSWER(1),
    TEMP_BWTAR_AUFNR   LIKE AFPO-AUFNR.
  DATAGS_EXTENSION2  TYPE ZSFI_EXTEN,                              "会计凭证过账增强extension2
        LT_EXTENSION2  TYPE TABLE OF BAPIPAREX WITH HEADER LINE.     "返回参数

  DATALV_OBJ_TYPE    LIKE BAPIACHE09-OBJ_TYPE,
        LV_OBJ_KEY     LIKE BAPIACHE09-OBJ_KEY,
        LV_OBJ_SYS     LIKE BAPIACHE09-OBJ_SYS.

  DATALV_DMBTR       TYPE BAPIWRBTR,
        LV_LINES       TYPE SY-TABIX,
        ZCOUNT         TYPE SY-TABIX,
        ZCOUNTA        TYPE SY-TABIX,
        ZCOUNTB        TYPE SY-TABIX,
        ZCOUNTC        TYPE SY-TABIX,
        LV_WRBTR       TYPE BSEG-WRBTR,
        DO_POST        TYPE CHAR1,
        LS_EXTEN       TYPE ZSFI_EXTEN.
  DATALS_BKPF        TYPE BKPF,
        LS_REVERSAL    TYPE BAPIACREV.
  DATAGV_OBJ_TYPE    TYPE BAPIACHE09-OBJ_TYPE,                      "参考过程
        GV_OBJ_KEY     TYPE BAPIACHE09-OBJ_KEY,                       "对象键值
        GV_OBJ_SYS     TYPE BAPIACHE09-OBJ_SYS.
  DATA LV_BELNR_01     TYPE BKPF-BELNR.
  DATA LV_WAERS        TYPE T001-WAERS.

  CLEAR GST_RETURN[] .
*会计凭证抬头数据
  CLEAR HEADER.
  HEADER_TXT '开票凭证冲销后冲回成本 ' .
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'ML'.          "凭证类型
  HEADER-COMP_CODE  P_BUKRS.       "公司代码
*  HEADER-BUS_ACT    = 'RFBU'.        "业务事务
  HEADER-FISC_YEAR  P_BUDAT(4).    "财年
  HEADER-FIS_PERIOD P_BUDAT+4(2).  "会计期间
  HEADER-HEADER_TXT HEADER_TXT.    "凭证抬头文本

  DATA LV_ROWCNT TYPE I.
  DATA LV_ZCOUNT TYPE I.
  DATA LV_ZCOUNT_01 TYPE I.
  DESCRIBE TABLE GT_DATA[] LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA.

*    写入分录1
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL .                       "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  '1406010500'.                              "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

*    写入分录2
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL * -1.                   "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACCT.                             "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    LOOP AT LT_CURRENCY_AMOUNT WHERE AMT_DOCCUR <> 0.
    ENDLOOP.
    IF SY-SUBRC 0.
     CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
       EXPORTING
         DOCUMENTHEADER HEADER
       IMPORTING
         OBJ_TYPE       LV_OBJ_TYPE
         OBJ_KEY        
LV_OBJ_KEY
         OBJ_SYS        
LV_OBJ_SYS
       
TABLES
         ACCOUNTGL      LT_ACCOUNTGL         "总帐科目项
         CURRENCYAMOUNT LT_CURRENCY_AMOUNT   "货币项目
         EXTENSION2     LT_EXTENSION2
         
RETURN         LT_RETURN.           "返回值

     CLEAR LT_RETURN.
     LOOP AT LT_RETURN .
       APPEND LT_RETURN TO GST_RETURN .
       CLEAR LT_RETURN .
     ENDLOOP.

     LOOP AT LT_RETURN WHERE TYPE 'E'.
     ENDLOOP.

     IF SY-SUBRC .
       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
     ELSE.
       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
         EXPORTING
           WAIT 'X'.
     ENDIF.

    ENDIF .
    FREE:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_RETURN.

  ELSE .

    LV_ZCOUNT LV_ROWCNT.
    CLEAR :LV_LINES,LV_ZCOUNT_01.
    CLEAR ZCOUNT.
    LOOP AT GT_DATA.

      ZCOUNT ZCOUNT + 1.
      IF ZCOUNT > 499.
        CLEAR:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_EXTENSION2[],LT_RETURN.
        LV_LINES 0.
        ZCOUNT 1.
        LV_ZCOUNT LV_ROWCNT LV_ZCOUNT_01.
        CLEAR LV_LINES.
      ENDIF.

      LV_ZCOUNT_01 LV_ZCOUNT_01 + 1.

*    写入借方
      ADD TO LV_LINES.

      IF LV_ZCOUNT >= 499 AND ZCOUNT 499 OR LV_ZCOUNT < 499 AND LV_ZCOUNT ZCOUNT ) .
        DO_POST 'X'.
      ENDIF.

*    写入分录1
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL .                       "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  '1406010500'.                              "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

*    写入分录2
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-FTHSL * -1.                   "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACCT.                             "科目
      WA_ACCOUNTGL-ITEM_TEXT   HEADER_TXT.                                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA-WERKS.                             "工厂
      WA_ACCOUNTGL-TRADE_ID    GT_DATA-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNAG.                             "客户
      WA_ACCOUNTGL-MATERIAL    GT_DATA-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VGBEL && GT_DATA-VGPOS  .          "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      GS_EXTENSION2-POSNR LV_LINES.
      IF GT_DATA-FTHSL  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      GS_EXTENSION2-VBUND    GT_DATA-VBUND.                               "贸易伙伴
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.

        LOOP AT LT_CURRENCY_AMOUNT WHERE AMT_DOCCUR <> 0.
        ENDLOOP.
        IF SY-SUBRC 0.
          CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
            EXPORTING
              DOCUMENTHEADER HEADER
            IMPORTING
              OBJ_TYPE       LV_OBJ_TYPE
              OBJ_KEY        
LV_OBJ_KEY
              OBJ_SYS        
LV_OBJ_SYS
            
TABLES
              ACCOUNTGL      LT_ACCOUNTGL          "总帐科目项
              CURRENCYAMOUNT LT_CURRENCY_AMOUNT    "货币项目
              EXTENSION2     LT_EXTENSION2
              
RETURN         LT_RETURN.            "返回值

          CLEAR LT_RETURN.
          LOOP AT LT_RETURN .
            APPEND LT_RETURN TO GST_RETURN .
            CLEAR LT_RETURN .
          ENDLOOP.

          LOOP AT LT_RETURN WHERE TYPE 'E'.
          ENDLOOP.

          IF SY-SUBRC .
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                WAIT 'X'.
          ENDIF.
        ENDIF .
        CLEAR:LT_ACCOUNTGL[],LT_CURRENCY_AMOUNT[],LT_EXTENSION2[],LT_RETURN[].
        CLEAR LV_LINES .
        DO_POST ''.
      ENDIF.

    ENDLOOP.

  ENDIF.

  SORT GST_RETURN[] BY MESSAGE .
  DELETE ADJACENT DUPLICATES FROM GST_RETURN[] COMPARING MESSAGE.

  LOOP AT GST_RETURN.
    GST_RETURN-MESSAGE '正式过账:开票凭证冲销后冲回成本 ' && GST_RETURN-MESSAGE .
    APPEND GST_RETURN TO GT_RETURN .
    CLEAR  GST_RETURN .
  ENDLOOP.

ENDFORM.

INITIALIZATION.
  PERFORM FRM_EXCLUDE_OPTION.

AT SELECTION-SCREEN OUTPUT.
  PERFORM SCREEN_OUTPUT.

AT SELECTION-SCREEN.
  PERFORM SCREEN_SETTING.

START-OF-SELECTION.
  PERFORM FOM_GETDATA.
  PERFORM FRM_DISPLAY.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值