*&---------------------------------------------------------------------**& 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输出所需变量DATA: S_LAYOUT TYPE SLIS_LAYOUT_ALV, GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.DATA: GT_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.DATA: GS_ZTFI94A TYPE ZTFI94A .DATA: U_BUDAT TYPE BUDAT.DATA: N_BUDAT TYPE BUDAT.TYPES: BEGIN 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.DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GT_DATA_C TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GT_DATA_D TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GT_DATA_E TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GT_DATA_F TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GT_DATA_G TYPE TABLE OF GTS_DATA WITH HEADER LINE.DATA: GS_DATA TYPE GTS_DATA .DATA: GT_REVERSAL TYPE TABLE OF BAPIACREV WITH HEADER LINE.DATA: GT_ZTFI94B TYPE TABLE OF ZTFI94B WITH HEADER LINE.SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.PARAMETERS: P_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' ITSELFCONTROLS: C_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 SCROLLBARMODULE 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 TABLECONTROLMODULE 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 0 .ENDMODULE.*&SPWIZARD: INPUT MODULE FOR TC 'C_TAB'. DO NOT CHANGE THIS LINE!*&SPWIZARD: PROCESS USER COMMANDMODULE 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(0K) WITH TEXT-115 SPACE SPACE SPACE.ENDFORM.*&---------------------------------------------------------------------**& Form FOM_GETDATA*&---------------------------------------------------------------------**& text*&---------------------------------------------------------------------**& --> p1 text*& <-- p2 text*&---------------------------------------------------------------------*FORM FOM_GETDATA . FIELD-SYMBOLS <FS> . DATA: G_FIELD(40). DATA: GS_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 + 1 . 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 = 0 . 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 * -1 . 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 = 0 . 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 * -1 . 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 = 0 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. DATA: REF TYPE REF TO CL_GUI_ALV_GRID. DATA : LV_STABLE TYPE LVC_S_STBL. "刷新稳定性 RANGES: L_WERKS FOR T001W-WERKS. RANGES: L_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 0 WITH HEADER LINE, WA_ACCOUNTGL LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE, LT_ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09, WA_CURRENCY_AMOUNT LIKE BAPIACCR09 OCCURS 0 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 0 WITH HEADER LINE, GST_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE, LS_ZFI002 TYPE ZFI002, FT_FLAG , "= ‘X'表示分摊过 LV_ANSWER(1), TEMP_BWTAR_AUFNR LIKE AFPO-AUFNR. DATA: GS_EXTENSION2 TYPE ZSFI_EXTEN, "会计凭证过账增强extension2 LT_EXTENSION2 TYPE TABLE OF BAPIPAREX WITH HEADER LINE. "返回参数 DATA: LV_OBJ_TYPE LIKE BAPIACHE09-OBJ_TYPE, LV_OBJ_KEY LIKE BAPIACHE09-OBJ_KEY, LV_OBJ_SYS LIKE BAPIACHE09-OBJ_SYS. DATA: LV_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. DATA: LS_BKPF TYPE BKPF, LS_REVERSAL TYPE BAPIACREV. DATA: GV_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 1 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 = ABS( GT_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 1 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 = ABS( GT_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 1 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 = ABS( GT_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 1 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 = ABS( GT_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 . DATA: GS_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 0 WITH HEADER LINE, WA_ACCOUNTGL LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE, LT_ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09, WA_CURRENCY_AMOUNT LIKE BAPIACCR09 OCCURS 0 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 0 WITH HEADER LINE, GST_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE, LS_ZFI002 TYPE ZFI002, FT_FLAG , "= ‘X'表示分摊过 LV_ANSWER(1), TEMP_BWTAR_AUFNR LIKE AFPO-AUFNR. DATA: GS_EXTENSION2 TYPE ZSFI_EXTEN, "会计凭证过账增强extension2 LT_EXTENSION2 TYPE TABLE OF BAPIPAREX WITH HEADER LINE. "返回参数 DATA: LV_OBJ_TYPE LIKE BAPIACHE09-OBJ_TYPE, LV_OBJ_KEY LIKE BAPIACHE09-OBJ_KEY, LV_OBJ_SYS LIKE BAPIACHE09-OBJ_SYS. DATA: LV_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. DATA: LS_BKPF TYPE BKPF, LS_REVERSAL TYPE BAPIACREV. DATA: GV_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 0 WITH HEADER LINE, WA_ACCOUNTGL LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE, LT_ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09, WA_CURRENCY_AMOUNT LIKE BAPIACCR09 OCCURS 0 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 0 WITH HEADER LINE, GST_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE, LS_ZFI002 TYPE ZFI002, FT_FLAG , "= ‘X'表示分摊过 LV_ANSWER(1), TEMP_BWTAR_AUFNR LIKE AFPO-AUFNR. DATA: GS_EXTENSION2 TYPE ZSFI_EXTEN, "会计凭证过账增强extension2 LT_EXTENSION2 TYPE TABLE OF BAPIPAREX WITH HEADER LINE. "返回参数 DATA: LV_OBJ_TYPE LIKE BAPIACHE09-OBJ_TYPE, LV_OBJ_KEY LIKE BAPIACHE09-OBJ_KEY, LV_OBJ_SYS LIKE BAPIACHE09-OBJ_SYS. DATA: LV_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. DATA: LS_BKPF TYPE BKPF, LS_REVERSAL TYPE BAPIACREV. DATA: GV_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 1 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 = ABS( GT_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 1 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 = ABS( GT_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 = 0 . 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 1 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 = ABS( GT_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 1 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 = ABS( GT_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 = 0 . 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 . DATA: GS_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 0 WITH HEADER LINE, WA_ACCOUNTGL LIKE BAPIACGL09 OCCURS 0 WITH HEADER LINE, LT_ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09, WA_CURRENCY_AMOUNT LIKE BAPIACCR09 OCCURS 0 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 0 WITH HEADER LINE, GST_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE, LS_ZFI002 TYPE ZFI002, FT_FLAG , "= ‘X'表示分摊过 LV_ANSWER(1), TEMP_BWTAR_AUFNR LIKE AFPO-AUFNR. DATA: GS_EXTENSION2 TYPE ZSFI_EXTEN, "会计凭证过账增强extension2 LT_EXTENSION2 TYPE TABLE OF BAPIPAREX WITH HEADER LINE. "返回参数 DATA: LV_OBJ_TYPE LIKE BAPIACHE09-OBJ_TYPE, LV_OBJ_KEY LIKE BAPIACHE09-OBJ_KEY, LV_OBJ_SYS LIKE BAPIACHE09-OBJ_SYS. DATA: LV_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. DATA: LS_BKPF TYPE BKPF, LS_REVERSAL TYPE BAPIACREV. DATA: GV_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 = 0 . 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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 1 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 = ABS( GT_DATA_D-LKLMG ) . "数量 ELSE . WA_ACCOUNTGL-QUANTITY = ABS( GT_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 = 0 . 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 . DATA: LV_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. DATA: LS_BKPF TYPE BKPF, LS_REVERSAL TYPE BAPIACREV. DATA: LT_RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE. DATA: GST_RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE. DATA: GV_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. 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----------------------------------------* DATA: L_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 = STRLEN( P_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_NAME) TO <TC>.*&SPWIZARD: get the table, which belongs to the tc * CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline*&SPWIZARD: get looplines of TableControl * CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME. ASSIGN (L_LINES_NAME) TO <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> + 1 . 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_NAME) TO <TC>.*&SPWIZARD: get the table, which belongs to the tc * CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body ASSIGN (L_TABLE_NAME) TO <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_NAME) TO <TC>.*&SPWIZARD: get looplines of TableControl * CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME. ASSIGN (L_TC_LINES_NAME) TO <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_NAME) TO <TC>.*&SPWIZARD: get the table, which belongs to the tc * CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body ASSIGN (L_TABLE_NAME) TO <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_NAME) TO <TC>.*&SPWIZARD: get the table, which belongs to the tc * CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body ASSIGN (L_TABLE_NAME) TO <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_linesINITIALIZATION. 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.