*&---------------------------------------------------------------------*
*& 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' ITSELF
CONTROLS: 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 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 0 .
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(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_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.
FI-成品未分配差异调整(开发笔记)
最新推荐文章于 2022-11-09 21:29:54 发布