FI-成品未分配差异调整(开发笔记)

*&---------------------------------------------------------------------*
*& Report ZFIR094
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2018-10-16
*& Program Type        :  Report
*& Description         :  成品未分配差异调整
*&---------------------------------------------------------------------*
REPORT ZFIR094.

*&---------------------------------------------------------------------*
*& 包含               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.
DATAGS_ZTFI94A  TYPE ZTFI94A .
DATAU_BUDAT   TYPE BUDAT.
DATAN_BUDAT   TYPE BUDAT.
TYPESBEGIN OF GTS_DATA,

        VBELN_IM      TYPE  MSEG-VBELN_IM,          "交货单
        VBELP_IM      TYPE  MSEG-VBELP_IM,          "DN行项目
        RBUKRS        TYPE  ACDOCA-RBUKRS,          "公司代码
        WERKS         TYPE  ACDOCA-WERKS,           "工厂
        PRCTR         TYPE  MSEG-PRCTR,             "利润中心
        FISCYEARPER   TYPE  ACDOCA-FISCYEARPER,     "年度期间
        KUNNR         TYPE  MSEG-KUNNR,             "客户
        VBUND         TYPE  KNA1-VBUND,             "贸易伙伴
        MATNR         TYPE  ACDOCA-MATNR,           "成品
        MAKTG         TYPE  MAKT-MAKTG,             "成品描述
        RACCT         TYPE  ACDOCA-RACCT,           "差异科目
        HSL           TYPE  ACDOCA-HSL,             "未分配差异
        RHCUR         TYPE  ACDOCA-RHCUR,           "币别
        MEINS         TYPE  MSEG-MEINS,             "基本单位
        MENGE         TYPE  MSEG-MENGE,             "交货数量
        DFNGE         TYPE  MSEG-MENGE,             "当期分配交货数量
        LKLMG         TYPE  VBRP-FKLMG,             "累计开票数量
        DKLMG         TYPE  VBRP-FKLMG,             "当期开票数量
        UKLMG         TYPE  VBRP-FKLMG,             "未开票数量
        FCSPC         TYPE  ACDOCA-HSL,             "发出商品金额
        FCCCT         TYPE  ACDOCA-RACCT,           "发出商品科目
        ZCBJE         TYPE  ACDOCA-HSL,             "成本金额
        KONTS         TYPE  T030-KONTS,             "成本科目
        BKLAS         TYPE  MBEW-BKLAS,             "评估类
        GZDAT         TYPE  VBRK-FKDAT,             "过账日期
        CXDAT         TYPE  VBRK-FKDAT,             "冲销日期

        DMATNR        TYPE  MSEG-MATNR,             "成品
        DWERKS        TYPE  MSEG-WERKS,             "工厂
        SHKZG         TYPE  MSEG-SHKZG,             "借贷标识
        WEMPF         TYPE  MSEG-WEMPF,             "收货方
        FKDAT         TYPE  VBRK-FKDAT,             "出具发票日期
        FKLMG         TYPE  VBRP-FKLMG,             "开票数量
        VGBEL         TYPE  VBRP-VGBEL,             "交货单
        VGPOS         TYPE  VBRP-VGPOS,             "DN行项目
        SHKZT         TYPE  VBRP-SHKZG,             "退货项目

      END OF GTS_DATA.

DATAGT_DATA   TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_C TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_D TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_E TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_F TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_G TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGS_DATA   TYPE GTS_DATA .
DATAGT_REVERSAL TYPE TABLE OF BAPIACREV WITH HEADER LINE.
DATAGT_ZTFI94B  TYPE TABLE OF ZTFI94B WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERSP_BUKRS LIKE ACDOCA-RBUKRS MODIF ID C1 OBLIGATORY ,              "公司代码
            P_BUDAT LIKE ACDOCA-BUDAT  MODIF ID C1 OBLIGATORY .              "截止日期
SELECTION-SCREEN END OF BLOCK B1.

*&SPWIZARD: DECLARATION OF TABLECONTROL 'C_TAB' ITSELF
CONTROLSC_TAB TYPE TABLEVIEW USING SCREEN 0100.

*&SPWIZARD: LINES OF TABLECONTROL 'C_TAB'
DATA:     G_C_TAB_LINES  LIKE SY-LOOPC.

DATA:     OK_CODE LIKE SY-UCOMM.
*&---------------------------------------------------------------------*
*& 包含               ZFIR094_PBO
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
 SET PF-STATUS '0100'.
 SET TITLEBAR '100'.
ENDMODULE.

*&SPWIZARD: OUTPUT MODULE FOR TC 'C_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE C_TAB_CHANGE_TC_ATTR OUTPUT.
  DESCRIBE TABLE GT_RETURN LINES C_TAB-lines.
ENDMODULE.

*&SPWIZARD: OUTPUT MODULE FOR TC 'C_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE C_TAB_GET_LINES OUTPUT.
  G_C_TAB_LINES SY-LOOPC.
ENDMODULE.
*&---------------------------------------------------------------------*
*& 包含               ZFIR094_PAI
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  EXIT01  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE EXIT01 INPUT.
 LEAVE TO SCREEN .
ENDMODULE.

*&SPWIZARD: INPUT MODULE FOR TC 'C_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE C_TAB_USER_COMMAND INPUT.
  OK_CODE SY-UCOMM.
  PERFORM USER_OK_TC USING    'C_TAB'
                              'GT_RETURN'
                              ' '
                     CHANGING OK_CODE.
  SY-UCOMM OK_CODE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& 包含               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(0KWITH TEXT-115 SPACE SPACE SPACE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  FIELD-SYMBOLS <FS> .
  DATAG_FIELD(40).
  DATAGS_ZTFI94 TYPE ZTFI94.
*取所选期间的第一天
  U_BUDAT P_BUDAT(6&& '01' .
*取所选期间的最后一天
  CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
    EXPORTING
       I_DATE        P_BUDAT
    
IMPORTING
       E_DATE        P_BUDAT
       
.
*取所选期间次月的第一天
  N_BUDAT P_BUDAT + .

  CLEAR GT_DATA[] .
  SELECT
    ACDOCA~RBUKRS
    ACDOCA
~WERKS
    ACDOCA
~FISCYEARPER
    ACDOCA
~MATNR
    ACDOCA
~RACCT
    ACDOCA
~HSL
    ACDOCA
~RHCUR
  
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
    
FROM ACDOCA
    
WHERE ACDOCA~RBUKRS  =  P_BUKRS
      
AND ACDOCA~BUDAT  <=  P_BUDAT
      
AND ACDOCA~RLDNR   =  '0L'
      AND ACDOCA~RRCTY   =   0
      AND ACDOCA~RACCT   =  '1405010200'
      .

  CLEAR GT_DATA_C[] .
  GT_DATA_C[] GT_DATA[] .
  SORT GT_DATA BY WERKS MATNR RACCT .
  DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING WERKS MATNR RACCT.
  LOOP AT GT_DATA.
    CLEAR GT_DATA-HSL .
    LOOP AT GT_DATA_C WHERE WERKS GT_DATA-WERKS
                        
AND MATNR GT_DATA-MATNR
                        
AND RACCT GT_DATA-RACCT
                        
.
      GT_DATA-HSL GT_DATA-HSL + GT_DATA_C-HSL .
      CLEAR GT_DATA_C .
    ENDLOOP.

    SELECT SINGLE BKLAS INTO GT_DATA-BKLAS FROM MBEW
      
WHERE BWKEY GT_DATA-WERKS
        
AND MATNR GT_DATA-MATNR
        
.

    SELECT SINGLE KONTS INTO GT_DATA-KONTS FROM T030
      
WHERE KTOPL 'CP11'
        AND KTOSL 'GBB'
        AND KOMOK 'VAX'
        AND BKLAS GT_DATA-BKLAS
        
.
    MODIFY GT_DATA .
    CLEAR GT_DATA .
  ENDLOOP.
  DELETE GT_DATA[] WHERE HSL .

  IF GT_DATA[] IS NOT INITIAL .

*只取成品
    CLEAR GT_DATA_D[].
    SELECT
      MSEG~VBELN_IM
      MSEG
~VBELP_IM
      MSEG
~MEINS
      MSEG
~MENGE
      MSEG
~PRCTR
      MSEG
~SHKZG
      MSEG
~KUNNR
      MSEG
~WEMPF
      MSEG
~MATNR AS DMATNR
      MSEG
~WERKS AS DWERKS
    
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_D[]
      
FROM MSEG
      
FOR ALL ENTRIES IN GT_DATA[]
      
WHERE MSEG~MATNR GT_DATA-MATNR
        
AND MSEG~WERKS GT_DATA-WERKS
        
AND MSEG~BWART IN '601','602','633','634','643','644' )
        AND MSEG~BUDAT_MKPF <= P_BUDAT
        
.

    CLEAR GT_DATA_E[] .
    GT_DATA_E[] GT_DATA_D[] .
    SORT GT_DATA_D BY VBELN_IM VBELP_IM .
    DELETE ADJACENT DUPLICATES FROM GT_DATA_D[] COMPARING VBELN_IM VBELP_IM.
    LOOP AT GT_DATA_D.
      CLEAR GT_DATA_D-MENGE .
      LOOP AT GT_DATA_E WHERE VBELN_IM GT_DATA_D-VBELN_IM
                          
AND VBELP_IM GT_DATA_D-VBELP_IM
                          
.
        IF GT_DATA_E-SHKZG 'S'.
          GT_DATA_E-MENGE GT_DATA_E-MENGE * -.
        ENDIF.
        GT_DATA_D-MENGE GT_DATA_D-MENGE + GT_DATA_E-MENGE .
        CLEAR GT_DATA_E .
      ENDLOOP.
      IF GT_DATA_D-KUNNR IS INITIAL .
        GT_DATA_D-KUNNR GT_DATA_D-WEMPF .
      ENDIF.

      SELECT SINGLE VBUND INTO GT_DATA_D-VBUND FROM KNA1
        
WHERE KUNNR GT_DATA_D-KUNNR
          
.

      MODIFY GT_DATA_D .
      CLEAR GT_DATA_D .
    ENDLOOP.
    DELETE GT_DATA_D[] WHERE MENGE .

    IF GT_DATA_D[] IS NOT INITIAL.

      CLEAR GT_DATA_F[] .
      SELECT
         VBRK~FKDAT
         VBRP
~VGBEL
         VBRP
~VGPOS
         VBRP
~FKLMG
         VBRP
~SHKZG AS SHKZT
       
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_F[]
         
FROM VBRK
         INNER 
JOIN VBRP ON VBRK~VBELN VBRP~VBELN
         
FOR ALL ENTRIES IN GT_DATA_D[]
         
WHERE VBRP~VGBEL  GT_DATA_D-VBELN_IM
           
AND VBRP~VGPOS  GT_DATA_D-VBELP_IM
           
AND VBRK~BUCHK  'C'
           AND VBRK~FKDAT <= P_BUDAT
           
.

      CLEAR GT_DATA_G[] .
      GT_DATA_G[] GT_DATA_F[] .
      SORT GT_DATA_F BY VGBEL VGPOS .
      DELETE ADJACENT DUPLICATES FROM GT_DATA_F[] COMPARING VGBEL VGPOS.
      LOOP AT GT_DATA_F.
        CLEAR GT_DATA_F-FKLMG .
        CLEAR GT_DATA_F-LKLMG .
        CLEAR GT_DATA_F-DKLMG .
        LOOP AT GT_DATA_G WHERE VGBEL GT_DATA_F-VGBEL
                            
AND VGPOS GT_DATA_F-VGPOS
                            
.
          IF GT_DATA_G-SHKZT 'X'.
            GT_DATA_G-FKLMG GT_DATA_G-FKLMG * -.
          ENDIF.

          GT_DATA_F-LKLMG GT_DATA_F-LKLMG + GT_DATA_G-FKLMG .

          IF GT_DATA_G-FKDAT >= U_BUDAT.
            GT_DATA_F-DKLMG GT_DATA_F-DKLMG + GT_DATA_G-FKLMG .
          ENDIF.

          CLEAR GT_DATA_G .
        ENDLOOP.

        MODIFY GT_DATA_F .
        CLEAR  GT_DATA_F .
      ENDLOOP.

    ENDIF.

    LOOP AT GT_DATA_D.

      READ TABLE GT_DATA WITH KEY MATNR GT_DATA_D-DMATNR WERKS GT_DATA_D-DWERKS .
      GT_DATA_D-RBUKRS      GT_DATA-RBUKRS .
      GT_DATA_D-WERKS       GT_DATA-WERKS .
      GT_DATA_D-FISCYEARPER GT_DATA-FISCYEARPER .
      GT_DATA_D-MATNR       GT_DATA-MATNR .
      GT_DATA_D-RACCT       GT_DATA-RACCT .
      GT_DATA_D-HSL         GT_DATA-HSL .
      GT_DATA_D-RHCUR       GT_DATA-RHCUR .
      GT_DATA_D-BKLAS       GT_DATA-BKLAS .
      GT_DATA_D-KONTS       GT_DATA-KONTS .

      READ TABLE GT_DATA_F WITH KEY VGBEL GT_DATA_D-VBELN_IM VGPOS GT_DATA_D-VBELP_IM .
      GT_DATA_D-FKDAT       GT_DATA_F-FKDAT .
      GT_DATA_D-VGBEL       GT_DATA_F-VGBEL .
      GT_DATA_D-VGPOS       GT_DATA_F-VGPOS .
      GT_DATA_D-LKLMG       GT_DATA_F-LKLMG .
      GT_DATA_D-DKLMG       GT_DATA_F-DKLMG .
      GT_DATA_D-SHKZT       GT_DATA_F-SHKZT .

      SELECT SINGLE MAKTG INTO GT_DATA_D-MAKTG FROM MAKT
        
WHERE MATNR GT_DATA_D-MATNR
          
AND SPRAS 1
          .
*当期分配交货数量:交货数量 加上 当期开票数量 减去 累计开票数量;
      GT_DATA_D-DFNGE GT_DATA_D-MENGE + GT_DATA_D-DKLMG GT_DATA_D-LKLMG .
*未开票数量:交货数量 减去 累计开票数量
      GT_DATA_D-UKLMG GT_DATA_D-MENGE GT_DATA_D-LKLMG .
*发出商品金额:该成品的未分配差异 除以 该成品对应的交货单的交货数量汇总数 乘以 该条目的未开票数量;
    IF GT_DATA_D-MENGE * GT_DATA_D-UKLMG <> 0.
      GT_DATA_D-FCSPC GT_DATA_D-HSL / GT_DATA_D-MENGE * GT_DATA_D-UKLMG.
    ENDIF.
*ZTFI94
    CLEAR GS_ZTFI94 .
    SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
      
WHERE BUKRS P_BUKRS
      
.
      IF GS_ZTFI94-ZSFDQ IS INITIAL.
*成本金额:自建表中公司代码的是否当期为空时 该成品的未分配差异 除以 该成品对应的交货单的交货数量汇总数 乘以 该条目的累计开票数量;
      GT_DATA_D-ZCBJE GT_DATA_D-HSL / GT_DATA_D-MENGE * GT_DATA_D-LKLMG.
      ELSE .
*成本金额:自建表中公司代码的是否当期不为空时该成品的未分配差异 除以 该成品对应的交货单的当期分配交货数量汇总数 乘以 该条目的当期开票数量;
      GT_DATA_D-ZCBJE GT_DATA_D-HSL / GT_DATA_D-MENGE * GT_DATA_D-DKLMG.
      ENDIF.

      GT_DATA_D-FCCCT '1406010100'.
      GT_DATA_D-GZDAT P_BUDAT.
      GT_DATA_D-CXDAT N_BUDAT.

*删除发出商品金额、成本金额均等于0的条目
      IF GT_DATA_D-FCSPC AND GT_DATA_D-ZCBJE 0.
        DELETE GT_DATA_D .
      ELSE .
        MODIFY GT_DATA_D .
      ENDIF.

      CLEAR  GT_DATA_D .
    ENDLOOP.

  ELSE .
    MESSAGE 'NO_DATA!'TYPE'S'DISPLAY LIKE 'E'.
  ENDIF.

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_D[].
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'         '公司代码',
        'WERKS'          '工厂',
        'PRCTR'          '利润中心',
        'FISCYEARPER'    '年度期间',
        'KUNNR'          '客户',
        'VBUND'          '贸易伙伴',
        'MATNR'          '成品',
        'MAKTG'          '成品描述',
        'RACCT'          '差异科目',
        'HSL'            '未分配差异',
        'RHCUR'          '币别',
        'VBELN_IM'       '交货单',
        'VBELP_IM'       'DN行项目',
        'MEINS'          '基本单位',
        'MENGE'          '交货数量',
        'DFNGE'          '当期分配交货数量',
        'LKLMG'          '累计开票数量',
        'DKLMG'          '当期开票数量',
        'UKLMG'          '未开票数量',
        'FCSPC'          '发出商品金额',
        'FCCCT'          '发出商品科目',
        'ZCBJE'          '成本金额',
        'KONTS'          '成本科目',
        'BKLAS'          '评估类',
        'GZDAT'          '过账日期',
        'CXDAT'          '冲销日期'.

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.
  DATAREF 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_TF .
      PERFORM FRM_DATA_POST_TC .
      LOOP AT GT_RETURN WHERE TYPE 'E'.
      ENDLOOP.
      IF SY-SUBRC 0.
        CALL SCREEN 100 STARTING AT 20 3
        ENDING AT 130 20.
      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 .
          SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94A FROM ZTFI94A
          
WHERE BUKRS P_BUKRS
            
AND BUDAT P_BUDAT(6)
            .
          IF SY-SUBRC 0.
            MESSAGE '当前选择的期间已经过账,不能重复执行!' TYPE 'S' DISPLAY LIKE 'E'.
          ELSE .

            CLEAR GT_RETURN[] .
            CLEAR GT_REVERSAL[] .
            PERFORM FRM_DATA_POST_F .
            PERFORM FRM_DATA_POST_C .
            IF GT_REVERSAL[] IS NOT INITIAL.
              PERFORM FRM_DATA_POST_REV_C .
            ENDIF.

            LOOP AT GT_RETURN WHERE TYPE 'E'.
            ENDLOOP.
            IF SY-SUBRC 0.
              CALL SCREEN 100 STARTING AT 20 3
              ENDING AT 130 20.
            ELSE .
              CLEAR GS_ZTFI94A .
              GS_ZTFI94A-BUKRS P_BUKRS .
              GS_ZTFI94A-BUDAT P_BUDAT .
              MODIFY ZTFI94A FROM GS_ZTFI94A .
              CLEAR GT_ZTFI94B[].
              LOOP AT GT_DATA_D.
                MOVE-CORRESPONDING GT_DATA_D to GT_ZTFI94B .
                APPEND GT_ZTFI94B .
                CLEAR  GT_ZTFI94B .
              ENDLOOP.
              MODIFY ZTFI94B FROM TABLE GT_ZTFI94B[] .
              COMMIT WORK .
              MESSAGE '期间过账成功TYPE 'S' .
            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_TF .
  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,
    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,
        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[] .
*会计凭证抬头数据
  HEADER_TXT '未分配差异调整到发出商品'.
  CLEAR HEADER.
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'SA'.          "凭证类型
  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_D LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA_D.
*    写入借方
      ADD TO LV_LINES.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-FCSPC.                        "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-FCCCT.                             "发出商品科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



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

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    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.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    CLEAR:HEADER.
    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_D.

      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.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-FCSPC.                        "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-FCCCT.                             "发出商品科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



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

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.
        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.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        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_TC
*&---------------------------------------------------------------------*
*& text成本凭证:
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_TC .
  DATAGS_ZTFI94 TYPE ZTFI94.
  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,
    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,
        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[] .
*会计凭证抬头数据
  HEADER_TXT '未分配差异调整到主营业务成本'.
  CLEAR HEADER.
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'SA'.          "凭证类型
  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_D LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA_D.
*    写入借方
      ADD TO LV_LINES.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE.                        "成本金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-KONTS.                             "成本科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
        GS_EXTENSION2-XNEGP 'X'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



*    写入贷方
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE * -1.                   "取负数的成本金额,
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    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.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    CLEAR:HEADER.
    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_D.

      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.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE.                        "成本金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-KONTS.                             "成本科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
        GS_EXTENSION2-XNEGP 'X'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



*    写入贷方
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE * -1.                   "取负数的成本金额,
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.
        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.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

        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_F
*&---------------------------------------------------------------------*
*& text发出商品凭证:
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_F .
  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,
    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,
        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[] .
*会计凭证抬头数据
  HEADER_TXT '未分配差异调整到发出商品'.
  CLEAR HEADER.
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'SA'.          "凭证类型
  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_D LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA_D.
*    写入借方
      ADD TO LV_LINES.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-FCSPC.                        "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-FCCCT.                             "发出商品科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



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

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    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.

      CLEAR GT_REVERSAL .
      GT_REVERSAL-OBJ_TYPE LV_OBJ_TYPE .
      GT_REVERSAL-OBJ_KEY  LV_OBJ_KEY .
      GT_REVERSAL-OBJ_SYS  LV_OBJ_SYS .
      APPEND GT_REVERSAL .

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT 'X'.
    ENDIF.

    CLEAR:HEADER.
    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_D.

      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.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-FCSPC.                        "金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-FCCCT.                             "发出商品科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



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

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到发出商品'.                    "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)
      WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-UKLMG ) .                     "数量
      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-FCSPC  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.
        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'.

          CLEAR GT_REVERSAL .
          GT_REVERSAL-OBJ_TYPE LV_OBJ_TYPE .
          GT_REVERSAL-OBJ_KEY  LV_OBJ_KEY .
          GT_REVERSAL-OBJ_SYS  LV_OBJ_SYS .
          APPEND GT_REVERSAL .

        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_C
*&---------------------------------------------------------------------*
*& text成本凭证:
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_C .
  DATAGS_ZTFI94 TYPE ZTFI94.
  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,
    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,
        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[] .
*会计凭证抬头数据
  HEADER_TXT '未分配差异调整到主营业务成本'.
  CLEAR HEADER.
  HEADER-DOC_DATE   P_BUDAT.       "凭证日期
  HEADER-PSTNG_DATE P_BUDAT.       "凭证中的过帐日期
  HEADER-USERNAME   SY-UNAME.      "用户名
  HEADER-DOC_TYPE   'SA'.          "凭证类型
  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_D LINES LV_ROWCNT.
  CLEAR GST_RETURN .
  IF LV_ROWCNT < 499.
    LOOP AT GT_DATA_D.
*    写入借方
      ADD TO LV_LINES.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE.                        "成本金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-KONTS.                             "成本科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
        GS_EXTENSION2-XNEGP 'X'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



*    写入贷方
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE * -1.                   "取负数的成本金额,
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

    ENDLOOP.

    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.

    CLEAR:HEADER.
    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_D.

      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.

      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE.                        "成本金额
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-KONTS.                             "成本科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '40'.
      ELSE.
        GS_EXTENSION2-BSCHL '50'.
        GS_EXTENSION2-XNEGP 'X'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.



*    写入贷方
      ADD TO LV_LINES.
      CLEAR WA_CURRENCY_AMOUNT.
      WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                               "会计凭证行项目编号
      WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA_D-RHCUR.                        "货币码
      WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA_D-ZCBJE * -1.                   "取负数的成本金额,
      APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

      CLEAR WA_ACCOUNTGL.
      WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                   "会计凭证行项目编号
      WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA_D-RACCT.                             "差异科目
      WA_ACCOUNTGL-ITEM_TEXT   '未分配差异调整到主营业务成本'.                "项目文本
      WA_ACCOUNTGL-PROFIT_CTR  GT_DATA_D-PRCTR.                             "利润中心
      WA_ACCOUNTGL-PLANT       GT_DATA_D-WERKS.                             "工厂
      WA_ACCOUNTGL-TR_PART_BA  GT_DATA_D-VBUND.                             "贸易伙伴
      WA_ACCOUNTGL-MATERIAL    GT_DATA_D-MATNR.                             "物料编号(18 个字符)
      WA_ACCOUNTGL-BASE_UOM    GT_DATA_D-MEINS.                             "基本计量单位 个字符)

*ZTFI94
      CLEAR GS_ZTFI94 .
      SELECT SINGLE INTO CORRESPONDING FIELDS OF GS_ZTFI94 FROM ZTFI94
        
WHERE BUKRS P_BUKRS
        
.

      IF GS_ZTFI94-ZSFDQ IS INITIAL.
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-LKLMG ) .                     "数量
      ELSE .
        WA_ACCOUNTGL-QUANTITY    ABSGT_DATA_D-DKLMG ) .                     "数量
      ENDIF.

      WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA_D-VBELN_IM && GT_DATA_D-VBELP_IM .   "分配号
      APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

      CLEAR GS_EXTENSION2.
      CLEAR LT_EXTENSION2.
      IF GT_DATA_D-ZCBJE  > 0.
        GS_EXTENSION2-BSCHL '50'.
      ELSE.
        GS_EXTENSION2-BSCHL '40'.
      ENDIF.
      LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
      LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
      APPEND LT_EXTENSION2.

      IF DO_POST 'X'.
        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.

        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_ACC_POST_C
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_REV_C .
  DATALV_DMBTR    TYPE BAPIWRBTR,
        LV_LINES    TYPE SY-TABIX,
        ZCOUNT      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.
  DATALT_RETURN   TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
  DATAGST_RETURN  TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
  DATAGV_OBJ_TYPE TYPE BAPIACHE09-OBJ_TYPE,                      "参考过程
        GV_OBJ_KEY  TYPE BAPIACHE09-OBJ_KEY,                       "对象键值
        GV_OBJ_SYS  TYPE BAPIACHE09-OBJ_SYS.
  DATALV_BELNR_01 TYPE BKPF-BELNR.
  DATALV_WAERS    TYPE T001-WAERS.



  LOOP AT GT_REVERSAL.
    CLEAR LS_REVERSAL .
    LS_REVERSAL-OBJ_TYPE   GT_REVERSAL-OBJ_TYPE.
    LS_REVERSAL-OBJ_KEY    GT_REVERSAL-OBJ_KEY.
    LS_REVERSAL-OBJ_KEY_R  GT_REVERSAL-OBJ_KEY_R.
    LS_REVERSAL-PSTNG_DATE N_BUDAT.
    LS_REVERSAL-COMP_CODE  P_BUKRS.
    LS_REVERSAL-REASON_REV '03'.

    CLEAR LS_BKPF .
    SELECT SINGLE BUKRS GJAHR BUDAT MONAT AWTYP AWKEY STGRD GLVOR
      
FROM BKPF
     
INTO CORRESPONDING FIELDS OF LS_BKPF
      
WHERE BELNR GT_REVERSAL-OBJ_KEY(10)
          AND  BUKRS P_BUKRS
          
AND  GJAHR P_BUDAT(4).

    CLEAR LT_RETURN[] .
    CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
      EXPORTING
        REVERSAL LS_REVERSAL
        BUS_ACT  
LS_BKPF-GLVOR
      
IMPORTING
        OBJ_TYPE GV_OBJ_TYPE
        OBJ_KEY  
GV_OBJ_KEY
        OBJ_SYS  
GV_OBJ_SYS
      
TABLES
        RETURN   LT_RETURN.

    LOOP AT GT_RETURN WHERE TYPE 'E'.
      APPEND GT_RETURN TO GST_RETURN .
      CLEAR GT_RETURN .
    ENDLOOP.

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

  ENDLOOP.

  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.
*----------------------------------------------------------------------*
*   INCLUDE TABLECONTROL_FORMS                                         *
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  USER_OK_TC                                               *
*&---------------------------------------------------------------------*
 FORM USER_OK_TC USING    P_TC_NAME TYPE DYNFNAM
                          P_TABLE_NAME
                          P_MARK_NAME
                 
CHANGING P_OK      LIKE SY-UCOMM.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
   DATAL_OK              TYPE SY-UCOMM,
         L_OFFSET          TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

*&SPWIZARD: Table control specific operations                          *
*&SPWIZARD: evaluate TC name and operations                            *
   SEARCH P_OK FOR P_TC_NAME.
   IF SY-SUBRC <> 0.
     EXIT.
   ENDIF.
   L_OFFSET STRLENP_TC_NAME 1.
   L_OK P_OK+L_OFFSET.
*&SPWIZARD: execute general and TC specific operations                 *
   CASE L_OK.
     WHEN 'INSR'.                      "insert row
       PERFORM FCODE_INSERT_ROW USING    P_TC_NAME
                                         P_TABLE_NAME
.
       CLEAR P_OK.

     WHEN 'DELE'.                      "delete row
       PERFORM FCODE_DELETE_ROW USING    P_TC_NAME
                                         P_TABLE_NAME
                                         P_MARK_NAME
.
       CLEAR P_OK.

     WHEN 'P--' OR                     "top of list
          'P-'  OR                     "previous page
          'P+'  OR                     "next page
          'P++'.                       "bottom of list
       PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
                                             L_OK
.
       CLEAR P_OK.
*     WHEN 'L--'.                       "total left
*       PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
*     WHEN 'L-'.                        "column left
*       PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
*     WHEN 'R+'.                        "column right
*       PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
*     WHEN 'R++'.                       "total right
*       PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
     WHEN 'MARK'.                      "mark all filled lines
       PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME
                                         P_TABLE_NAME
                                         P_MARK_NAME   
.
       CLEAR P_OK.

     WHEN 'DMRK'.                      "demark all filled lines
       PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
                                           P_TABLE_NAME
                                           P_MARK_NAME 
.
       CLEAR P_OK.

*     WHEN 'SASCEND'   OR
*          'SDESCEND'.                  "sort column
*       PERFORM FCODE_SORT_TC USING P_TC_NAME
*                                   l_ok.

   ENDCASE.

 ENDFORM.                              " USER_OK_TC

*&---------------------------------------------------------------------*
*&      Form  FCODE_INSERT_ROW                                         *
*&---------------------------------------------------------------------*
 FORM FCODE_INSERT_ROW
               
USING    P_TC_NAME           TYPE DYNFNAM
                        P_TABLE_NAME             
.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
   DATA L_LINES_NAME       LIKE FELD-NAME.
   DATA L_SELLINE          LIKE SY-STEPL.
   DATA L_LASTLINE         TYPE I.
   DATA L_LINE             TYPE I.
   DATA L_TABLE_NAME       LIKE FELD-NAME.
   FIELD-SYMBOLS <TC>                 TYPE CXTAB_CONTROL.
   FIELD-SYMBOLS <TABLE>              TYPE STANDARD TABLE.
   FIELD-SYMBOLS <LINES>              TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

   ASSIGN (P_TC_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <TABLE>.                "not headerline

*&SPWIZARD: get looplines of TableControl                              *
   CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
   ASSIGN (L_LINES_NAMETO <LINES>.

*&SPWIZARD: get current line                                           *
   GET CURSOR LINE L_SELLINE.
   IF SY-SUBRC <> 0.                   " append line to table
     L_SELLINE <TC>-LINES 1.
*&SPWIZARD: set top line                                               *
     IF L_SELLINE > <LINES>.
       <TC>-TOP_LINE L_SELLINE <LINES> + .
     ELSE.
       <TC>-TOP_LINE 1.
     ENDIF.
   ELSE.                               " insert line into table
     L_SELLINE <TC>-TOP_LINE + L_SELLINE 1.
     L_LASTLINE <TC>-TOP_LINE + <LINES> 1.
   ENDIF.
*&SPWIZARD: set new cursor line                                        *
   L_LINE L_SELLINE <TC>-TOP_LINE + 1.

*&SPWIZARD: insert initial line                                        *
   INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.
   <TC>-LINES <TC>-LINES 1.
*&SPWIZARD: set cursor                                                 *
   SET CURSOR LINE L_LINE.

 ENDFORM.                              " FCODE_INSERT_ROW

*&---------------------------------------------------------------------*
*&      Form  FCODE_DELETE_ROW                                         *
*&---------------------------------------------------------------------*
 FORM FCODE_DELETE_ROW
               
USING    P_TC_NAME           TYPE DYNFNAM
                        P_TABLE_NAME
                        P_MARK_NAME   
.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
   DATA L_TABLE_NAME       LIKE FELD-NAME.

   FIELD-SYMBOLS <TC>         TYPE CXTAB_CONTROL.
   FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.
   FIELD-SYMBOLS <WA>.
   FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

   ASSIGN (P_TC_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <TABLE>.                "not headerline

*&SPWIZARD: delete marked lines                                        *
   DESCRIBE TABLE <TABLE> LINES <TC>-LINES.

   LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *
     ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

     IF <MARK_FIELD> 'X'.
       DELETE <TABLE> INDEX SYST-TABIX.
       IF SY-SUBRC 0.
         <TC>-LINES <TC>-LINES 1.
       ENDIF.
     ENDIF.
   ENDLOOP.

 ENDFORM.                              " FCODE_DELETE_ROW

*&---------------------------------------------------------------------*
*&      Form  COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_TC_NAME  name of tablecontrol
*      -->P_OK       ok code
*----------------------------------------------------------------------*
 FORM COMPUTE_SCROLLING_IN_TC USING    P_TC_NAME
                                       P_OK
.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
   DATA L_TC_NEW_TOP_LINE     TYPE I.
   DATA L_TC_NAME             LIKE FELD-NAME.
   DATA L_TC_LINES_NAME       LIKE FELD-NAME.
   DATA L_TC_FIELD_NAME       LIKE FELD-NAME.

   FIELD-SYMBOLS <TC>         TYPE CXTAB_CONTROL.
   FIELD-SYMBOLS <LINES>      TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

   ASSIGN (P_TC_NAMETO <TC>.
*&SPWIZARD: get looplines of TableControl                              *
   CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.
   ASSIGN (L_TC_LINES_NAMETO <LINES>.


*&SPWIZARD: is no line filled?                                         *
   IF <TC>-LINES 0.
*&SPWIZARD: yes, ...                                                   *
     L_TC_NEW_TOP_LINE 1.
   ELSE.
*&SPWIZARD: no, ...                                                    *
     CALL FUNCTION 'SCROLLING_IN_TABLE'
          EXPORTING
               ENTRY_ACT             <TC>-TOP_LINE
               ENTRY_FROM            
1
               ENTRY_TO              <TC>-LINES
               LAST_PAGE_FULL        'X'
               LOOPS                 <LINES>
               OK_CODE               
P_OK
               OVERLAPPING           
'X'
          IMPORTING
               ENTRY_NEW             L_TC_NEW_TOP_LINE
          
EXCEPTIONS
*              NO_ENTRY_OR_PAGE_ACT  = 01
*              NO_ENTRY_TO           = 02
*              NO_OK_CODE_OR_PAGE_GO = 03
               OTHERS                0.
   ENDIF.

*&SPWIZARD: get actual tc and column                                   *
   GET CURSOR FIELD L_TC_FIELD_NAME
              AREA  L_TC_NAME
.

   IF SYST-SUBRC 0.
     IF L_TC_NAME P_TC_NAME.
*&SPWIZARD: et actual column                                           *
       SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
     ENDIF.
   ENDIF.

*&SPWIZARD: set the new top line                                       *
   <TC>-TOP_LINE L_TC_NEW_TOP_LINE.


 ENDFORM.                              " COMPUTE_SCROLLING_IN_TC

*&---------------------------------------------------------------------*
*&      Form  FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
*       marks all TableControl lines
*----------------------------------------------------------------------*
*      -->P_TC_NAME  name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_MARK_LINES USING P_TC_NAME
                               P_TABLE_NAME
                               P_MARK_NAME
.
*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE CXTAB_CONTROL.
  FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.
  FIELD-SYMBOLS <WA>.
  FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <TABLE>.                "not headerline

*&SPWIZARD: mark all filled lines                                      *
  LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *
     ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

     <MARK_FIELD> 'X'.
  ENDLOOP.
ENDFORM.                                          "fcode_tc_mark_lines

*&---------------------------------------------------------------------*
*&      Form  FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
*       demarks all TableControl lines
*----------------------------------------------------------------------*
*      -->P_TC_NAME  name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
                                 P_TABLE_NAME
                                 P_MARK_NAME 
.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE CXTAB_CONTROL.
  FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.
  FIELD-SYMBOLS <WA>.
  FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAMETO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *
   CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME"table body
   ASSIGN (L_TABLE_NAMETO <TABLE>.                "not headerline

*&SPWIZARD: demark all filled lines                                    *
  LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *
     ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

     <MARK_FIELD> SPACE.
  ENDLOOP.
ENDFORM.                                          "fcode_tc_mark_lines

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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值