主代码
*&---------------------------------------------------------------------*
*& Report ZFIR202
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFIR202.
INCLUDE ZFIR202T.
INCLUDE ZFIR202S.
INCLUDE ZFIR202F.
ZFIR202T 定义字段结构等
*&---------------------------------------------------------------------*
*& 包含 ZFIR202T
*&---------------------------------------------------------------------*
TABLES: ztmm062a.
TYPES: BEGIN OF ty_detial,
* box TYPE c,
bukrs TYPE t001-bukrs , "公司代码
gjahr TYPE gjahr , "年度
monat TYPE acdoca-poper , "期间
END OF ty_detial.
DATA: gt_output TYPE TABLE OF ty_detial,
gs_output TYPE ty_detial.
DATA: lv_monat TYPE char2,
lv_losgr TYPE ckmlprkeko-losgr.
DATA: gs_layout TYPE lvc_s_layo."alv需要布局
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat.
DATA:it_out01 TYPE TABLE OF ty_detial.
DATA:is_excel TYPE ty_excel.
选择屏幕:带有在选择屏幕增加按钮跳转表格维护生成器,F4搜索帮助,以及后台下载布置
*&---------------------------------------------------------------------*
*& 包含 ZFIR202S
*&---------------------------------------------------------------------*
TABLES:t001w,bkpf,ztmm2094,tgsb,bsid,sscrfields.
DATA functxt TYPE smp_dyntxt. "SMP_DYNTXT(菜单制作器:动态文本的程序接口)
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_bukrs TYPE t001-bukrs OBLIGATORY."公司代码
SELECT-OPTIONS:s_werks FOR t001w-werks."工厂
PARAMETERS: p_gjahr TYPE gjahr OBLIGATORY."年度
SELECT-OPTIONS:s_monat FOR bsid-monat."期间
SELECT-OPTIONS:s_zmtype FOR ztmm2094-zmtype."车型
SELECT-OPTIONS:s_gsber FOR tgsb-gsber."业务范围
PARAMETERS:p_sum RADIOBUTTON GROUP g1 USER-COMMAND uc1 DEFAULT 'X', "USER-COMMAND UC1
p_detial RADIOBUTTON GROUP g1.
SELECTION-SCREEN SKIP 1.
PARAMETERS: c_h AS CHECKBOX USER-COMMAND com.
SELECTION-SCREEN SKIP 1.
*PARAMETERS: p_line TYPE i DEFAULT 60000.
SELECTION-SCREEN END OF BLOCK block1.
"增加预留的选择屏幕按钮
SELECTION-SCREEN FUNCTION KEY 1.
"初始化
INITIALIZATION.
CLEAR functxt.
functxt-icon_id = icon_table_settings. "图标,可以通过ICON查找
functxt-icon_text = '维护【零件和MTCO映射关系表】'."描述
sscrfields-functxt_01 = functxt.
"如果还有其他按钮依次添加到functxt_02、functxt_03、functxt_04、functxt_05中
AT SELECTION-SCREEN OUTPUT.
* LOOP AT SCREEN.
* IF c_h = abap_true.
* IF screen-name = 'P_ELINE'.
* screen-invisible = '0'.
* MODIFY SCREEN.
* ENDIF.
* ELSE.
* IF screen-name = 'P_ELINE'.
* screen-invisible = '1'.
* MODIFY SCREEN.
* ENDIF.
* ENDIF.
* ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_bukrs."按F4键时触发
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'T001' "参照表
fieldname = 'BUKRS' "参照字段
dynpprog = sy-repid "指定执行程序
dynpnr = sy-dynnr "指定执行程序的屏蔽编码
dynprofield = 'P_BUKRS'. "触发事件的屏幕字段名称
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
CALL TRANSACTION 'ZTFI3005' .
*CALL FUNCTION 'TH_CREATE_MODE'
* EXPORTING
* transaktion = 'ZTFI3005'
* EXCEPTIONS
* max_sessions = 1
* internal_error = 2
* no_authority = 3
* OTHERS = 4.
ENDCASE.
START-OF-SELECTION.
PERFORM frm_load.
IF c_h <> 'X'.
PERFORM frm_select_data.
PERFORM frm_set_alv.
PERFORM frm_dis_alv.
ENDIF.
END-OF-SELECTION.
ZFIR202F:取值以及后台操作等
*&---------------------------------------------------------------------*
*& 包含 ZFIR202F
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_select_data .
*---------------------1.0销售数据取值逻辑
SELECT a~bukrs ,
substring( a~fkdat,1,4 ) AS gjahr ,
substring( a~fkdat,5,2 ) AS monat,
a~vbeln,
a~waerk,
a~fkdat,
a~kurrf,
a~knumv,
a~vbtyp,
a~kunag,
i~name1,
b~werks,
b~posnr,
b~vgbel,
b~vgpos,
b~matnr,
b~gsber,
b~vrkme AS meins,
b~fkimg AS qrsrsl,
b~netwr,
b~mwsbp,
b~aubel,
b~aupos,
b~vgtyp,
b~auref,
c~wadat_ist,
e~butxt,
f~maktx,
g~gtext,
d~kwert AS bzcb,
h~mtart ,
h~kzkfg ##DB_FEATURE_MODE[TABLE_LEN_MAX1]
FROM vbrk AS a
JOIN vbrp AS b ON a~vbeln = b~vbeln
LEFT JOIN likp AS c ON b~vgbel = c~vbeln
LEFT JOIN t001 AS e ON a~bukrs = e~bukrs
JOIN prcd_elements AS d ON a~knumv = d~knumv AND b~posnr = d~kposn AND ( kschl = 'ZPR2' OR kschl = 'ZPR1' )
LEFT JOIN makt AS f ON f~spras = '1' AND b~matnr = f~matnr
LEFT JOIN tgsbt AS g ON g~gsber = b~gsber
LEFT JOIN mara AS h ON b~matnr = h~matnr
LEFT JOIN kna1 AS i ON a~kunag = i~kunnr
WHERE a~bukrs = @p_bukrs
AND substring( a~fkdat,1,4 ) = @p_gjahr
AND substring( a~fkdat,5,2 ) IN @s_monat
AND a~rfbsk = 'C'
AND b~werks IN @s_werks
AND ( b~fkimg <> '0' OR b~netwr <> '0' )
INTO TABLE @DATA(lt_xs).
MOVE-CORRESPONDING lt_xs TO gt_xs.
SORT gt_xs BY bukrs gjahr monat.
*---------------------2.0零件领用数据取值逻辑
SELECT a~bukrs ,
a~werks ,
substring( a~budat_mkpf,1,4 ) AS gjahr ,
substring( a~budat_mkpf,5,2 ) AS monat,
a~mblnr ,
a~zeile ,
a~budat_mkpf,
a~matnr ,
a~pargb AS gsber ,
a~waers ,
a~meins ,
a~menge AS qrsrsl ,
a~dmbtr AS bzcb,
a~shkzg ,
b~maktx,
c~gtext,
d~butxt,
e~mtart ,
e~kzkfg
FROM mseg AS a
LEFT JOIN makt AS b ON b~spras = '1' AND a~matnr = b~matnr
LEFT JOIN tgsbt AS c ON a~pargb = c~gsber
LEFT JOIN t001 AS d ON a~bukrs = d~bukrs
LEFT JOIN mara AS e ON a~matnr = e~matnr
WHERE a~bukrs = @p_bukrs
AND substring( budat_mkpf,1,4 ) = @p_gjahr
AND substring( budat_mkpf,5,2 ) IN @s_monat
AND ( bwart = 'Z37' OR bwart = 'Z38' OR bwart = 'Z47' OR bwart = 'Z48' )
AND menge <> '0'
AND a~werks IN @s_werks
INTO TABLE @DATA(lt_lj).
MOVE-CORRESPONDING lt_lj TO gt_lj.
SORT gt_lj BY bukrs gjahr monat.
*--------------为gt_out赋值
LOOP AT gt_xs ASSIGNING FIELD-SYMBOL(<fs_xs>).
* IF <fs_xs>-kwert = '0'.
* <fs_xs>-fkimg = 0.
* ENDIF.
IF <fs_xs>-vbtyp = 'N' OR <fs_xs>-vbtyp = 'O' OR <fs_xs>-vbtyp = '6'.
<fs_xs>-qrsrsl = <fs_xs>-qrsrsl * -1.
<fs_xs>-netwr = <fs_xs>-netwr * -1.
<fs_xs>-mwsbp = <fs_xs>-mwsbp * -1.
<fs_xs>-bzcb = <fs_xs>-bzcb * -1.
ENDIF.
MOVE-CORRESPONDING <fs_xs> TO gs_output.
gs_output-zebelp1 = <fs_xs>-aupos.
gs_output-ebelp = <fs_xs>-aupos.
APPEND gs_output TO gt_output.
CLEAR gs_output.
ENDLOOP.
LOOP AT gt_lj ASSIGNING FIELD-SYMBOL(<fs_lj>).
* IF <fs_lj>-DMBTR = '0'.
* <fs_lj>-MENGE = 0.
* ENDIF.
* <fs_lj>-waers = 'CNY'.
IF <fs_lj>-shkzg = 'S'.
<fs_lj>-qrsrsl = <fs_lj>-qrsrsl * -1.
<fs_lj>-bzcb = <fs_lj>-bzcb * -1.
ENDIF.
MOVE-CORRESPONDING <fs_lj> TO gs_output.
gs_output-kurrf = '1'.
gs_output-waerk = 'CNY'.
APPEND gs_output TO gt_output.
CLEAR gs_output.
ENDLOOP.
"没有数据终止执行
CHECK gt_output IS NOT INITIAL.
*---------------------3.0共用逻辑
"公司代码描述
* SELECT SINGLE butxt
* FROM t001
* WHERE bukrs = @p_bukrs
* INTO @DATA(lv_butxt).
"物料描述
* SELECT matnr,
* maktx
* FROM makt
* FOR ALL ENTRIES IN @gt_output
* WHERE spras = '1' AND matnr = @gt_output-matnr
* INTO TABLE @DATA(lt_maktx).
"业务范围描述
* SELECT gsber,
* gtext
* FROM tgsbt
* FOR ALL ENTRIES IN @gt_output
* WHERE gsber = @gt_output-gsber
* INTO TABLE @DATA(lt_gsber).
"车型的前提条件
* SELECT a~matnr,
* a~mtart,
* a~kzkfg
* FROM mara AS a
* FOR ALL ENTRIES IN @gt_output
* WHERE matnr = @gt_output-matnr
* AND ( mtart = 'Z004' OR mtart = 'Z005' )
* AND kzkfg = ''
* INTO TABLE @DATA(lt_mara).
* SORT lt_mara BY matnr mtart.
SELECT a~matnr,
a~zebeln1 AS aubel,
a~zebelp1 AS zebelp1,
a~zmtype
FROM ztmm2094 AS a
FOR ALL ENTRIES IN @gt_output
WHERE a~zebeln1 = @gt_output-aubel
AND a~zebelp1 = @gt_output-zebelp1
AND a~matnr = @gt_output-matnr
AND zstat_sto1 = 'S'
INTO TABLE @DATA(lt_zmtype).
SORT lt_zmtype BY matnr.
* LOOP AT lt_mara INTO DATA(ls_mara).
* IF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = ''.
* gs_zmtype-zmtype = ls_mara-matnr+0(12).
* gs_zmtype-matnr = ls_mara-matnr.
*
* ELSEIF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = 'X'.
* READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = ls_mara-matnr .
* gs_zmtype-zmtype = ls_zmtype-zmtype.
* gs_zmtype-matnr = ls_mara-matnr.
* ENDIF.
* APPEND gs_zmtype TO gt_zmtype.
* CLEAR gs_zmtype.
* ENDLOOP.
"vin码
SELECT a~posnr ,
a~lief_nr,
b~sernr
FROM ser01 AS a
JOIN objk AS b ON a~obknr = b~obknr
FOR ALL ENTRIES IN @gt_output
WHERE a~posnr = @gt_output-vgpos AND a~lief_nr = @gt_output-vgbel
INTO TABLE @DATA(lt_vin).
*-------------4.0成本数据取值
"kalnr
"VBRP-VGTYP=J,VBRP-AUREF=X
SELECT b~matnr,
b~bwkey,
a~ebeln AS aubel,
a~ebelp,
b~kalnr
FROM ekkn AS a
JOIN ckmlhd AS b ON a~vbeln = b~vbeln AND a~vbelp = b~posnr
JOIN @gt_output AS c ON a~ebeln = c~aubel AND a~ebelp = c~ebelp
WHERE c~vgtyp = 'J'
AND c~auref = 'X'
AND a~zekkn = '1'
INTO TABLE @DATA(lt_kalnr).
* SORT lt_kalnr BY matnr bwkey aubel aupos kalnr.
"否则
SELECT a~matnr,
a~bwkey,
a~vbeln AS aubel,
a~posnr AS aupos,
a~kalnr
FROM ckmlhd AS a
FOR ALL ENTRIES IN @gt_output
WHERE a~matnr = @gt_output-matnr
AND a~bwkey = @gt_output-werks
AND a~posnr = @gt_output-aupos
AND a~vbeln = @gt_output-aubel
INTO TABLE @DATA(lt_kalnr2).
SORT lt_kalnr2 BY matnr bwkey aubel aupos kalnr.
"如取不到
SELECT a~matnr,
a~bwkey,
a~kalnr
FROM ckmlhd AS a
FOR ALL ENTRIES IN @gt_output
WHERE a~matnr = @gt_output-matnr
AND a~bwkey = @gt_output-werks
AND a~posnr = ''
AND a~vbeln = ''
INTO TABLE @DATA(lt_kalnr3).
SORT lt_kalnr3 BY matnr bwkey kalnr.
LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_outkalnr>).
"kalnr
CLEAR lv_kalnr.
IF <fs_outkalnr>-vgtyp = 'J' AND <fs_outkalnr>-auref = 'X'.
READ TABLE lt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks aubel = <fs_outkalnr>-aubel ebelp = <fs_outkalnr>-ebelp .
IF ls_kalnr IS NOT INITIAL.
lv_kalnr = ls_kalnr-kalnr.
ENDIF.
ELSE.
READ TABLE lt_kalnr2 INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks aubel = <fs_outkalnr>-aubel aupos = <fs_outkalnr>-aupos .
IF ls_kalnr2 IS NOT INITIAL.
lv_kalnr = ls_kalnr2-kalnr.
ENDIF.
ENDIF.
IF lv_kalnr IS INITIAL.
READ TABLE lt_kalnr3 INTO DATA(ls_kalnr3) WITH KEY matnr = <fs_outkalnr>-matnr bwkey = <fs_outkalnr>-werks .
IF lt_kalnr3 IS NOT INITIAL.
lv_kalnr = ls_kalnr3-kalnr.
ENDIF.
ENDIF.
CLEAR ls_kalnr.
CLEAR ls_kalnr2.
CLEAR ls_kalnr3.
<fs_outkalnr>-kalnr = lv_kalnr.
ENDLOOP.
* SELECT a~matnr,
* a~bwkey,
* a~vbeln,
* a~posnr,
* a~kalnr
* FROM ckmlhd AS a
* FOR ALL ENTRIES IN @gt_output
* WHERE a~matnr = @gt_output-matnr
* AND a~bwkey = @gt_output-werks
* AND ( ( a~posnr = @gt_output-aupos AND a~vbeln = @gt_output-aubel ) OR ( a~posnr = '' AND a~vbeln = '' ) )
* INTO TABLE @DATA(lt_kalnr).
** SORT lt_kalnr BY matnr bwkey vbeln posnr.
* MOVE-CORRESPONDING lt_kalnr TO gt_kalnr.
* SELECT a~matnr,
* a~bwkey,
* a~vbeln,
* a~posnr,
* a~kalnr
* FROM ckmlhd AS a
* FOR ALL ENTRIES IN @gt_output
* WHERE a~matnr = @gt_output-matnr
*AND a~bwkey = @gt_output-werks
*AND a~posnr = ''
*AND a~vbeln = ''
* INTO TABLE @DATA(lt_kalnr2).
* into table @data(lt_kalnr2).
* SORT lt_kalnr2 BY matnr bwkey vbeln.
* SORT gt_kalnr BY matnr bwkey vbeln posnr.
* MOVE-CORRESPONDING lt_kalnr2 TO gt_kalnr2.
* DELETE ADJACENT DUPLICATES FROM gt_kalnr COMPARING matnr bwkey vbeln posnr.
* IF gt_kalnr IS NOT INITIAL.
* "标准LOSGR
* SELECT a~kalnr,
* a~losgr,
* a~bdatj,
* a~poper
* FROM ckmlprkeko AS a
* FOR ALL ENTRIES IN @gt_kalnr
* WHERE a~kalnr = @gt_kalnr-kalnr
* AND a~prtyp = 'S'
* INTO TABLE @DATA(lt_losgr).
* SORT lt_losgr BY kalnr bdatj poper.
*
* "实际LOSGR
* SELECT a~kalnr,
* a~losgr,
* a~bdatj,
* a~poper
* FROM ckmlprkeko AS a
* FOR ALL ENTRIES IN @gt_kalnr
* WHERE a~kalnr = @gt_kalnr-kalnr
* AND a~prtyp = 'V'
* INTO TABLE @DATA(lt_losgr2).
* SORT lt_losgr2 BY kalnr bdatj poper.
* ENDIF.
* SELECT a~matnr,
* a~losgr,
* a~werks
* FROM marc AS a
* FOR ALL ENTRIES IN @gt_output
* WHERE a~matnr = @gt_output-matnr AND a~werks = @gt_output-werks
* INTO TABLE @DATA(lt_mlosgr).
* SORT lt_mlosgr BY matnr werks.
"标准成本kst
SELECT a~kalnr ,
a~bdatj ,
a~poper ,
a~kst001 ,
a~kst003 ,
a~kst005 ,
a~kst007 ,
a~kst009 ,
a~kst011
FROM ckmlprkeph AS a
FOR ALL ENTRIES IN @gt_output
WHERE a~kalnr = @gt_output-kalnr
AND a~curtp = '10' AND prtyp = 'S' AND kkzst = '' AND keart = 'H'
AND poper IN @s_monat AND bdatj = @p_gjahr
INTO TABLE @DATA(lt_cb).
DELETE ADJACENT DUPLICATES FROM lt_cb COMPARING kalnr bdatj poper.
SORT lt_cb BY kalnr bdatj poper DESCENDING.
"实际成本kst
SELECT a~kalnr ,
a~bdatj ,
a~poper ,
a~kst001 ,
a~kst003 ,
a~kst005 ,
a~kst007 ,
a~kst009 ,
a~kst011
FROM ckmlprkeph AS a
FOR ALL ENTRIES IN @gt_output
WHERE a~kalnr = @gt_output-kalnr
AND a~curtp = '10' AND prtyp = 'V' AND kkzst = '' AND keart = 'H' AND poper IN @s_monat AND bdatj = @p_gjahr
INTO TABLE @DATA(lt_sjcb).
DELETE ADJACENT DUPLICATES FROM lt_sjcb COMPARING kalnr bdatj poper.
SORT lt_cb BY kalnr bdatj poper DESCENDING.
"实际成本A
SELECT rbukrs,
gjahr,
poper AS monat,
werks,
matnr,
rbusa AS gsber,"y业务范围
SUM( hsl ) AS hsl
FROM acdoca
WHERE rbukrs = @p_bukrs
AND gjahr = @p_gjahr
AND poper IN @s_monat
AND racct LIKE '6401%'
GROUP BY rbukrs , gjahr , poper , werks , matnr, rbusa
INTO TABLE @DATA(lt_hsl).
SORT lt_hsl BY rbukrs gjahr monat DESCENDING.
"实际成本B
SELECT a~bukrs,
a~gjahr,
a~monat,
a~werks,
a~matnr,
a~gsber,
SUM( qrsrsl ) AS qrsrsl
FROM @gt_output AS a
GROUP BY bukrs , gjahr , monat , werks , matnr , gsber
INTO TABLE @DATA(lt_qrsrslb).
* MOVE-CORRESPONDING lt_qrsrslb TO gt_qrsrsl.
"实际成本c
SELECT a~bukrs,
a~gjahr,
a~monat,
a~werks,
a~matnr,
a~gsber,
SUM( qrsrsl ) AS qrsrsl
FROM @gt_output AS a
WHERE a~qrsrsl > 0
GROUP BY bukrs , gjahr , monat , werks , matnr, gsber
INTO TABLE @DATA(lt_qrsrslc).
* MOVE-CORRESPONDING lt_qrsrslc TO gt_qrsrsl2.
LOOP AT lt_qrsrslb INTO DATA(ls_qrsrslb).
IF ls_qrsrslb-qrsrsl = 0."b=0
READ TABLE lt_qrsrslc INTO DATA(ls_qrsrslc) WITH KEY bukrs = ls_qrsrslb-bukrs gjahr = ls_qrsrslb-gjahr monat = ls_qrsrslb-monat werks = ls_qrsrslb-werks matnr = ls_qrsrslb-matnr gsber = ls_qrsrslb-gsber.
IF ls_qrsrslc-qrsrsl <> 0."c<>0 b= c
ls_qrsrslb-qrsrsl = ls_qrsrslc-qrsrsl.
ENDIF.
ENDIF.
MOVE-CORRESPONDING ls_qrsrslb TO gs_qrsrsl.
APPEND gs_qrsrsl TO gt_qrsrsl.
CLEAR gs_qrsrsl.
ENDLOOP.
SELECT *
FROM ztfi3005
INTO TABLE @DATA(lt_all3005).
SORT lt_all3005 BY zdyzc.
* LOOP AT gt_output INTO gs_output.
*
* lv_qrsrsl = lv_qrsrsl + gs_output-qrsrsl.
* IF gs_output-qrsrsl > 0.
* lv_qrsrsl2 = lv_qrsrsl2 + gs_output-qrsrsl.
* ENDIF.
*
* AT END OF gsber.
*
* gs_qrsrsl-bukrs = gs_output-bukrs .
* gs_qrsrsl-gjahr = gs_output-gjahr .
* gs_qrsrsl-monat = gs_output-monat .
* gs_qrsrsl-werks = gs_output-werks .
* gs_qrsrsl-matnr = gs_output-matnr .
* gs_qrsrsl-gsber = gs_output-gsber .
* gs_qrsrsl-qrsrsl = lv_qrsrsl .
* APPEND gs_qrsrsl TO gt_qrsrsl.
* CLEAR gs_qrsrsl.
* lv_qrsrsl = 0.
*
* gs_qrsrsl2-bukrs = gs_output-bukrs .
* gs_qrsrsl2-gjahr = gs_output-gjahr .
* gs_qrsrsl2-monat = gs_output-monat .
* gs_qrsrsl2-werks = gs_output-werks .
* gs_qrsrsl2-matnr = gs_output-matnr .
* gs_qrsrsl2-gsber = gs_output-gsber .
* gs_qrsrsl2-qrsrsl = lv_qrsrsl2 .
* APPEND gs_qrsrsl2 TO gt_qrsrsl2.
* CLEAR gs_qrsrsl2.
* lv_qrsrsl2 = 0.
* ENDAT.
* ENDLOOP.
SORT gt_output BY bukrs gjahr monat werks matnr gsber .
LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
CLEAR lv_kalnr.
"公司代码描述
* <fs_output>-butxt = lv_butxt .
"物料描述
* READ TABLE lt_maktx INTO DATA(ls_maktx) WITH KEY matnr = <fs_output>-matnr.
* <fs_output>-maktx = ls_maktx-maktx.
* CLEAR ls_maktx.
"业务范围描述
* READ TABLE lt_gsber INTO DATA(ls_gsber) WITH KEY gsber = <fs_output>-gsber.
* <fs_output>-gtext = ls_gsber-gtext.
* CLEAR ls_gsber.
"车型
IF ( <fs_output>-mtart = 'Z004' OR <fs_output>-mtart = 'Z005' ) AND <fs_output>-kzkfg = ''.
<fs_output>-zmtype = <fs_output>-matnr+0(12).
ELSEIF ( <fs_output>-mtart = 'Z004' OR <fs_output>-mtart = 'Z005' ) AND <fs_output>-kzkfg = 'X'.
READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = <fs_output>-matnr aubel = <fs_output>-aubel zebelp1 = <fs_output>-zebelp1.
IF sy-subrc = 0.
<fs_output>-zmtype = ls_zmtype-zmtype.
ENDIF.
ENDIF.
* READ TABLE gt_zmtype INTO DATA(ls_zmtype2) WITH KEY matnr = <fs_output>-matnr.
* <fs_output>-zmtype = ls_zmtype2-zmtype .
* CLEAR ls_zmtype2.
* READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = <fs_output>-matnr.
* READ TABLE lt_zmtype INTO DATA(ls_zmtype) WITH KEY matnr = <fs_output>-matnr.
* IF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg IS INITIAL.
* <fs_output>-zmtype = ls_mara-matnr+0(12) .
* ELSEIF ( ls_mara-mtart = 'Z004' OR ls_mara-mtart = 'Z005' ) AND ls_mara-kzkfg = 'X'.
* <fs_output>-zmtype = ls_zmtype-zmtype .
* ENDIF.
* CLEAR ls_mara.
* CLEAR ls_zmtype.
"vin码
READ TABLE lt_vin INTO DATA(ls_vin) WITH KEY posnr = <fs_output>-vgpos lief_nr = <fs_output>-vgbel.
<fs_output>-sernr = ls_vin-sernr.
CLEAR ls_vin.
"kalnr
* CLEAR lv_kalnr.
* IF <fs_output>-vgtyp = 'J' AND <fs_output>-auref = 'X'.
* READ TABLE lt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks aubel = <fs_output>-aubel aupos = <fs_output>-aupos BINARY SEARCH.
* IF ls_kalnr IS NOT INITIAL.
* lv_kalnr = ls_kalnr-kalnr.
* ENDIF.
* ELSE.
* READ TABLE lt_kalnr2 INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks aubel = <fs_output>-aubel aupos = <fs_output>-aupos BINARY SEARCH.
* IF ls_kalnr2 IS NOT INITIAL.
* lv_kalnr = ls_kalnr-kalnr.
* ENDIF.
* ENDIF.
* IF lv_kalnr IS INITIAL.
* READ TABLE lt_kalnr3 INTO DATA(ls_kalnr3) WITH KEY matnr = <fs_output>-matnr bwkey = <fs_output>-werks BINARY SEARCH.
* IF lt_kalnr3 IS NOT INITIAL.
* lv_kalnr = ls_kalnr3-kalnr.
* ENDIF.
* ENDIF.
* CLEAR ls_kalnr.
* CLEAR ls_kalnr2.
* CLEAR ls_kalnr3.
* <fs_output>-kalnr = lv_kalnr.
* READ TABLE gt_kalnr INTO DATA(ls_kalnr) WITH KEY matnr = <fs_output>-matnr
* bwkey = <fs_output>-werks
* vbeln = <fs_output>-aubel
* posnr = <fs_output>-aupos.
* IF ls_kalnr-kalnr IS INITIAL.
* READ TABLE gt_kalnr INTO DATA(ls_kalnr2) WITH KEY matnr = <fs_output>-matnr
* bwkey = <fs_output>-werks
* vbeln = ''
* posnr = ''.
* lv_kalnr = ls_kalnr2-kalnr.
* ELSE.
* lv_kalnr = ls_kalnr-kalnr.
* ENDIF.
* CLEAR ls_kalnr.
* <fs_output>-kalnr = lv_kalnr.
"LOSGR
* READ TABLE lt_losgr INTO DATA(ls_losgr2) WITH KEY kalnr = lv_kalnr
* bdatj = <fs_output>-gjahr
* poper = <fs_output>-monat.
*
* IF <fs_output>-budat_mkpf IS INITIAL AND <fs_output>-wadat_ist IS NOT INITIAL.
* READ TABLE lt_losgr INTO DATA(ls_losgr1) WITH KEY kalnr = lv_kalnr
* bdatj = <fs_output>-wadat_ist+0(4)
* poper = <fs_output>-wadat_ist+5(2).
* lv_losgr = ls_losgr1-losgr.
* ELSE.
* lv_losgr = ls_losgr2-losgr.
* ENDIF.
* IF lv_losgr IS INITIAL.
* READ TABLE lt_mlosgr INTO DATA(ls_mlosgr) WITH KEY matnr = <fs_output>-matnr
* werks = <fs_output>-werks.
* lv_losgr = ls_mlosgr-losgr.
* ENDIF.
* CLEAR ls_losgr1.
* CLEAR ls_losgr2.
* CLEAR ls_mlosgr.
"实际成本
READ TABLE lt_hsl INTO DATA(ls_hsl) WITH KEY rbukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr gsber = <fs_output>-gsber."实际成本a
DATA(lv_a) = ls_hsl-hsl.
CLEAR ls_hsl.
READ TABLE gt_qrsrsl INTO DATA(ls_qrsrsl) WITH KEY bukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr gsber = <fs_output>-gsber.
DATA(lv_b) = ls_qrsrsl-qrsrsl."实际成本b/c
CLEAR ls_qrsrsl.
<fs_output>-zact_cb = lv_a / lv_b * <fs_output>-qrsrsl.
lv_act_cb = <fs_output>-zact_cb.
* IF lv_b = 0."计算每一条确认收入数量为正数的实际成本=A/C*确认收入数量,最后一条数据倒挤。
* READ TABLE gt_qrsrsl2 INTO DATA(ls_qrsrsl2) WITH KEY bukrs = <fs_output>-bukrs gjahr = <fs_output>-gjahr monat = <fs_output>-monat werks = <fs_output>-werks matnr = <fs_output>-matnr gsber = <fs_output>-gsber."实际成本c
* DATA(lv_c) = ls_qrsrsl2-qrsrsl.
* CLEAR ls_qrsrsl2.
* IF lv_c <> '0'.
* <fs_output>-zact_cb = lv_a / lv_c * <fs_output>-qrsrsl.
* ENDIF.
* ELSE.
"计算每一条数据的实际成本=A/B*确认收入数量,最后一条数据倒挤;
* <fs_output>-zact_cb = lv_a / lv_b * <fs_output>-qrsrsl.
* ENDIF.
AT END OF gsber.
<fs_output>-zact_cb = lv_a - lv_sum_actcb.
lv_sum_actcb = 0.
lv_act_cb = 0.
ENDAT.
"最后一条数据倒挤。
lv_sum_actcb = lv_sum_actcb + lv_act_cb.
"标准组件
IF <fs_output>-budat_mkpf IS INITIAL AND <fs_output>-wadat_ist IS NOT INITIAL."过账日期为空,如果实际交互日期不为空值
IF <fs_output>-bzcb <> 0.
READ TABLE lt_cb INTO DATA(ls_cd) WITH KEY kalnr = lv_kalnr bdatj = <fs_output>-wadat_ist+0(4) poper = <fs_output>-wadat_ist+4(2) .
IF ls_cd IS NOT INITIAL.
lv_kst001 = ls_cd-kst001.
lv_kst003 = ls_cd-kst003.
lv_kst005 = ls_cd-kst005.
lv_kst007 = ls_cd-kst007.
lv_kst009 = ls_cd-kst009.
lv_kst011 = ls_cd-kst011.
CLEAR ls_cd.
ENDIF.
ENDIF.
* IF <fs_output>-zact_cb <> 0.
* READ TABLE lt_sjcb INTO DATA(ls_sjcb) WITH KEY kalnr = lv_kalnr bdatj = <fs_output>-wadat_ist+0(4) poper = <fs_output>-wadat_ist+4(2).
* IF ls_sjcb IS NOT INITIAL.
* lv_act_kst001 = ls_sjcb-kst001.
* lv_act_kst003 = ls_sjcb-kst003.
* lv_act_kst005 = ls_sjcb-kst005.
* lv_act_kst007 = ls_sjcb-kst007.
* lv_act_kst009 = ls_sjcb-kst009.
* lv_act_kst011 = ls_sjcb-kst011.
* CLEAR ls_sjcb.
* ENDIF.
* ENDIF.
ELSE."如果实际交互日期为空值,则取该行的年度、期间
IF <fs_output>-bzcb <> 0.
READ TABLE lt_cb INTO DATA(ls_cd2) WITH KEY kalnr = lv_kalnr
bdatj = <fs_output>-gjahr
poper = <fs_output>-monat
.
IF ls_cd2 IS NOT INITIAL.
lv_kst001 = ls_cd2-kst001.
lv_kst003 = ls_cd2-kst003.
lv_kst005 = ls_cd2-kst005.
lv_kst007 = ls_cd2-kst007.
lv_kst009 = ls_cd2-kst009.
lv_kst011 = ls_cd2-kst011.
CLEAR ls_cd2.
ENDIF.
ENDIF.
* IF <fs_output>-zact_cb <> 0.
* READ TABLE lt_sjcb INTO DATA(ls_sjcb2) WITH KEY kalnr = lv_kalnr
* bdatj = <fs_output>-gjahr
* poper = <fs_output>-monat.
* IF ls_sjcb2 IS NOT INITIAL.
* lv_act_kst001 = ls_sjcb2-kst001.
* lv_act_kst003 = ls_sjcb2-kst003.
* lv_act_kst005 = ls_sjcb2-kst005.
* lv_act_kst007 = ls_sjcb2-kst007.
* lv_act_kst009 = ls_sjcb2-kst009.
* lv_act_kst011 = ls_sjcb2-kst011.
* CLEAR ls_sjcb2.
* ENDIF.
* ENDIF.
ENDIF.
"标准成本组件计算
IF <fs_output>-bzcb = 0 .
<fs_output>-zstan_zc = 0.
<fs_output>-zstan_fc = 0.
<fs_output>-zstan_rg = 0.
<fs_output>-zstan_dl = 0.
<fs_output>-zstan_zj = 0.
<fs_output>-zstan_qt = 0.
ELSE.
"如果KST001/KST003/KST005/KST007/KST009/KST011均为零或者取不到值,则原材料-主材(标准)=标准成本,其余组件为零
IF ( lv_kst001 = 0 AND lv_kst003 = 0 AND lv_kst005 = 0 AND lv_kst007 = 0 AND lv_kst009 = 0 AND lv_kst011 = 0 )
OR ( lv_kst001 IS INITIAL AND lv_kst003 IS INITIAL AND lv_kst005 IS INITIAL AND lv_kst007 IS INITIAL AND lv_kst009 IS INITIAL AND lv_kst011 IS INITIAL )..
<fs_output>-zstan_zc = <fs_output>-bzcb.
<fs_output>-zstan_fc = 0.
<fs_output>-zstan_rg = 0.
<fs_output>-zstan_dl = 0.
<fs_output>-zstan_zj = 0.
<fs_output>-zstan_qt = 0.
ELSE.
"abcd
lv_stan_sum = lv_kst001 + lv_kst003 + lv_kst005 + lv_kst007 + lv_kst009 + lv_kst011.
lv_stan_a = lv_kst001 / lv_stan_sum .
lv_stan_b = lv_kst003 / lv_stan_sum .
lv_stan_c = lv_kst005 / lv_stan_sum .
lv_stan_d = lv_kst007 / lv_stan_sum .
lv_stan_e = lv_kst009 / lv_stan_sum.
"abcd **标准成本
<fs_output>-zstan_zc = lv_stan_a * <fs_output>-bzcb.
<fs_output>-zstan_fc = lv_stan_b * <fs_output>-bzcb.
<fs_output>-zstan_rg = lv_stan_c * <fs_output>-bzcb.
<fs_output>-zstan_dl = lv_stan_d * <fs_output>-bzcb.
<fs_output>-zstan_zj = lv_stan_e * <fs_output>-bzcb.
"倒挤
<fs_output>-zstan_qt = <fs_output>-bzcb - <fs_output>-zstan_zc
- <fs_output>-zstan_fc
- <fs_output>-zstan_rg
- <fs_output>-zstan_dl
- <fs_output>-zstan_zj.
ENDIF.
ENDIF.
READ TABLE lt_all3005 INTO DATA(ls_all3005) WITH KEY zdyzc = <fs_output>-zmtype+0(2) BINARY SEARCH.
IF sy-subrc = 0.
<fs_output>-zljbs = ls_all3005-zljbs.
ENDIF.
* "实际组件
* IF ( lv_act_kst001 = 0 AND lv_act_kst003 = 0 AND lv_act_kst005 = 0 AND lv_act_kst007 = 0 AND lv_act_kst009 = 0 AND lv_act_kst011 = 0 ) OR <fs_output>-zact_cb = 0.
* <fs_output>-zact_zc = <fs_output>-zact_cb.
* <fs_output>-zact_fc = 0.
* <fs_output>-zact_rg = 0.
* <fs_output>-zact_dl = 0.
* <fs_output>-zact_zj = 0.
* ELSEIF lv_act_kst001 IS INITIAL AND lv_act_kst003 IS INITIAL AND lv_act_kst005 IS INITIAL AND lv_act_kst007 IS INITIAL AND lv_act_kst009 IS INITIAL AND lv_act_kst011 IS INITIAL .
*
* <fs_output>-zact_zc = 0.
* <fs_output>-zact_fc = 0.
* <fs_output>-zact_rg = 0.
* <fs_output>-zact_dl = 0.
* <fs_output>-zact_zj = 0.
* ELSE.
* lv_act_sum = lv_act_kst001 + lv_act_kst003 + lv_act_kst005 + lv_act_kst007 + lv_act_kst009 + lv_act_kst011.
* lv_act_a = lv_act_kst001 / lv_act_sum .
* lv_act_b = lv_act_kst003 / lv_act_sum .
* lv_act_c = lv_act_kst005 / lv_act_sum .
* lv_act_d = lv_act_kst007 / lv_act_sum .
* lv_act_e = lv_act_kst009 / lv_act_sum .
*
* <fs_output>-zact_zc = lv_act_a * <fs_output>-zact_cb.
* <fs_output>-zact_fc = lv_act_b * <fs_output>-zact_cb.
* <fs_output>-zact_rg = lv_act_c * <fs_output>-zact_cb.
* <fs_output>-zact_dl = lv_act_d * <fs_output>-zact_cb.
* <fs_output>-zact_zj = lv_act_e * <fs_output>-zact_cb.
*
* <fs_output>-zact_qt = <fs_output>-zact_cb - <fs_output>-zact_zc - <fs_output>-zact_fc - <fs_output>-zact_rg - <fs_output>-zact_dl - <fs_output>-zact_zj.
* ENDIF.
* "其他手工分摊的成本E/F
* lv_sum_actcb = lv_sum_actcb + <fs_output>-zact_cb.
* IF <fs_output>-zmtype IS NOT INITIAL.
* lv_sum_qrsrs = lv_sum_qrsrs + <fs_output>-qrsrsl.
* ENDIF.
*
* AT END OF monat.
* gs_cost-bukrs = <fs_output>-bukrs.
* gs_cost-gjahr = <fs_output>-gjahr.
* gs_cost-monat = <fs_output>-monat.
* gs_cost-qrsrsl = lv_sum_qrsrs.
* gs_cost-zact_cb = lv_sum_actcb.
*
* APPEND gs_cost TO gt_cost.
* CLEAR gs_cost.
* lv_sum_actcb = 0.
* lv_sum_qrsrs = 0.
* ENDAT.
ENDLOOP.
UNASSIGN <fs_output>.
"其他手工分摊的成本
"汇总物料编码(排除参与过实际成本运算的ACDOCA条目hsl
DATA: gr_zljbs TYPE RANGE OF zeljbs,
gw_zljbs LIKE LINE OF gr_zljbs,
lv_zljbs TYPE string.
* 宏定义
DEFINE set_range.
gw_zljbs-sign = 'I'.
gw_zljbs-option = 'CP'.
gw_zljbs-low = &1.
APPEND gw_zljbs TO gr_zljbs.
END-OF-DEFINITION.
SELECT DISTINCT zljbs
FROM ztfi3005
INTO TABLE @DATA(lt_ztfi3005).
SORT lt_ztfi3005 BY zljbs.
LOOP AT lt_ztfi3005 INTO DATA(ls_ztfi3005).
CLEAR lv_zljbs.
lv_zljbs = '*' && ls_ztfi3005-zljbs && '*'.
set_range lv_zljbs.
ENDLOOP.
SELECT DISTINCT a~bukrs,
a~gjahr,
a~monat,
a~matnr,
a~werks,
a~gsber
"公司代码、年度、期间、工厂、物料、业务范围
FROM @gt_output AS a
INTO TABLE @DATA(lt_out).
SORT lt_out BY bukrs gjahr monat matnr werks gsber DESCENDING.
SELECT DISTINCT rbukrs,
a~gjahr,
a~poper AS monat,
a~matnr,
a~werks,
a~rbusa,
hsl
* hsl
FROM acdoca AS a
* FOR ALL ENTRIES IN @ztfi3005
FOR ALL ENTRIES IN @lt_out
WHERE rbukrs = @p_bukrs
AND a~gjahr = @p_gjahr
AND a~poper IN @s_monat
AND a~racct LIKE '6401%'
AND a~matnr IN @gr_zljbs
AND ( a~poper <> @lt_out-monat OR a~werks <> @lt_out-werks OR a~matnr <> @lt_out-matnr OR a~rbusa <> @lt_out-gsber )
* GROUP BY rbukrs , a~gjahr , a~poper , a~matnr
INTO TABLE @DATA(lt_acdoca).
SORT lt_acdoca BY rbukrs gjahr monat matnr werks rbusa DESCENDING.
LOOP AT lt_out INTO DATA(ls_same) .
DELETE lt_acdoca WHERE rbukrs = ls_same-bukrs AND gjahr = ls_same-gjahr AND werks = ls_same-werks AND matnr = ls_same-matnr AND rbusa = ls_same-gsber AND monat = ls_same-monat.
ENDLOOP.
SELECT a~rbukrs,
a~gjahr,
a~monat,
a~matnr,
SUM( hsl ) AS hsl
FROM @lt_acdoca AS a
GROUP BY a~rbukrs , a~gjahr , a~monat , a~matnr
INTO TABLE @DATA(lt_di).
SORT lt_di BY rbukrs gjahr monat matnr DESCENDING.
LOOP AT lt_di INTO DATA(ls_di).
LOOP AT lt_ztfi3005 INTO DATA(ls_ztfi30052).
CLEAR gs_ysgx.
SEARCH ls_di-matnr FOR ls_ztfi30052-zljbs.
IF sy-subrc = 0.
READ TABLE gt_ysgx INTO gs_ysgx WITH KEY bukrs = ls_di-rbukrs gjahr = ls_di-gjahr monat = ls_di-monat zljbs = ls_ztfi30052-zljbs.
IF sy-subrc = 0.
gs_ysgx-hsl = gs_ysgx-hsl + ls_di-hsl.
MODIFY gt_ysgx FROM gs_ysgx TRANSPORTING hsl WHERE bukrs = gs_ysgx-bukrs AND gjahr = gs_ysgx-gjahr AND monat = gs_ysgx-monat AND zljbs = gs_ysgx-zljbs.
ELSE.
gs_ysgx-bukrs = ls_di-rbukrs.
gs_ysgx-gjahr = ls_di-gjahr.
gs_ysgx-monat = ls_di-monat.
gs_ysgx-hsl = ls_di-hsl.
gs_ysgx-zljbs = ls_ztfi30052-zljbs.
APPEND gs_ysgx TO gt_ysgx.
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
"汇总车型qrsrsl
SELECT
a~bukrs,
a~gjahr,
a~monat,
b~zljbs,
SUM( a~qrsrsl ) AS qrsrsl
FROM @gt_output AS a
JOIN ztfi3005 AS b ON substring( a~zmtype,1,2 ) = b~zdyzc
GROUP BY bukrs , gjahr , monat , b~zljbs
INTO TABLE @DATA(gt_fi).
SORT gt_fi BY bukrs gjahr monat zljbs DESCENDING.
CLEAR lv_sum_cost .
CLEAR lv_qt_cost .
"第一次分摊
SORT gt_output BY bukrs gjahr monat zljbs zmtype.
LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output3>) .
* READ TABLE lt_all3005 INTO DATA(ls_all3005) WITH KEY zdyzc = <fs_output3>-zmtype+0(2) BINARY SEARCH.
* IF sy-subrc = 0.
* DATA(lv_ljbs) = ls_all3005-zljbs.
* ENDIF.
READ TABLE gt_ysgx INTO DATA(ls_ysgx) WITH KEY bukrs = <fs_output3>-bukrs gjahr = <fs_output3>-gjahr monat = <fs_output3>-monat zljbs = <fs_output3>-zljbs.
IF sy-subrc = 0.
DATA(lv_di) = ls_ysgx-hsl.
ENDIF.
READ TABLE gt_fi INTO DATA(gs_fi) WITH KEY bukrs = <fs_output3>-bukrs gjahr = <fs_output3>-gjahr monat = <fs_output3>-monat zljbs = <fs_output3>-zljbs.
IF sy-subrc = 0 AND gs_fi-qrsrsl <> 0.
DATA(lv_fi) = gs_fi-qrsrsl.
<fs_output3>-zqt_cost = lv_di / lv_fi * <fs_output3>-qrsrsl.
ENDIF.
CLEAR lv_qt_cost.
lv_qt_cost = <fs_output3>-zqt_cost.
"倒挤
AT END OF zljbs.
<fs_output3>-zqt_cost = lv_di - lv_sum_cost.
lv_sum_cost = 0.
lv_qt_cost = 0.
ENDAT.
lv_sum_cost = lv_sum_cost + lv_qt_cost.
CLEAR lv_di.
CLEAR lv_fi.
ENDLOOP.
UNASSIGN <fs_output3>.
"汇总实际成本E
SELECT
a~bukrs,
a~gjahr,
a~monat,
SUM( a~zact_cb ) AS zact_cb
FROM @gt_output AS a
GROUP BY bukrs , gjahr , monat
INTO TABLE @DATA(gt_e).
SORT gt_e BY bukrs gjahr monat.
"汇总车型字段不为空的所有行的确认收入数量F
SELECT
a~bukrs,
a~gjahr,
a~monat,
SUM( qrsrsl ) AS qrsrsl
FROM @gt_output AS a
WHERE zmtype <> ''
GROUP BY bukrs , gjahr , monat
INTO TABLE @DATA(gt_f).
SORT gt_f BY bukrs gjahr monat.
"汇总已赋值的实际成本-手工分摊G
SELECT
a~bukrs,
a~gjahr,
a~monat,
SUM( zqt_cost ) AS zqt_cost
FROM @gt_output AS a
GROUP BY bukrs , gjahr , monat
INTO TABLE @DATA(gt_g).
SORT gt_g BY bukrs gjahr monat.
"其他手工分摊的成本D
SELECT rbukrs,
gjahr,
poper AS monat,
SUM( hsl ) AS hsl
FROM acdoca
WHERE rbukrs = @p_bukrs
AND gjahr = @p_gjahr
AND poper IN @s_monat
AND racct LIKE '6401%'
GROUP BY rbukrs , gjahr ,poper
INTO TABLE @DATA(lt_hsld).
SORT lt_hsld BY rbukrs gjahr monat DESCENDING.
LOOP AT lt_hsld INTO DATA(ls_have) WHERE hsl <> 0.
READ TABLE gt_output INTO DATA(ls_out) WITH KEY bukrs = ls_have-rbukrs gjahr = ls_have-gjahr monat = ls_have-monat.
IF sy-subrc <> 0 .
DATA ls_null TYPE ty_detial.
ls_null-bukrs = ls_have-rbukrs.
ls_null-gjahr = ls_have-gjahr.
ls_null-monat = ls_have-monat.
ls_null-zqt_cost = ls_have-hsl.
APPEND ls_null TO gt_output.
CLEAR ls_null.
ENDIF.
ENDLOOP.
CLEAR lv_sum_cost .
CLEAR lv_qt_cost .
SORT gt_output BY bukrs gjahr monat zmtype.
LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output2>) .
"其他手工分摊的成本
"D
READ TABLE lt_hsld INTO DATA(ls_hsld) WITH KEY rbukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
DATA(lv_d) = ls_hsld-hsl.
CLEAR ls_hsld.
"EFG
READ TABLE gt_e INTO DATA(gs_e) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
READ TABLE gt_f INTO DATA(gs_f) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
READ TABLE gt_g INTO DATA(gs_g) WITH KEY bukrs = <fs_output2>-bukrs gjahr = <fs_output2>-gjahr monat = <fs_output2>-monat.
DATA(lv_f) = gs_f-qrsrsl.
DATA(lv_e) = gs_e-zact_cb.
DATA(lv_g) = gs_g-zqt_cost.
CLEAR gs_e.
CLEAR gs_f.
CLEAR gs_g.
IF <fs_output2>-zmtype IS NOT INITIAL.
IF lv_f <> 0.
<fs_output2>-zqt_cost = <fs_output2>-zqt_cost + ( lv_d - lv_e - lv_g ) / lv_f * <fs_output2>-qrsrsl.
ENDIF.
* ELSE.
* <fs_output2>-zqt_cost = 0.
ENDIF.
CLEAR lv_qt_cost.
lv_qt_cost = <fs_output2>-zqt_cost.
"倒挤
AT END OF monat.
IF lv_f IS NOT INITIAL.
<fs_output2>-zqt_cost = lv_d - lv_e - lv_sum_cost.
ELSEIF ( lv_d - lv_e - lv_g ) <> 0.
IF <fs_output2>-zqt_cost IS INITIAL .
DATA ls_output TYPE ty_detial.
ls_output-bukrs = <fs_output2>-bukrs.
ls_output-gjahr = <fs_output2>-gjahr.
ls_output-monat = <fs_output2>-monat.
ls_output-zqt_cost = lv_d - lv_e .
INSERT ls_output INTO gt_output .
CLEAR ls_output.
ENDIF.
* UPDATE gt_output FROM ls_output.
ENDIF.
CLEAR lv_d .
CLEAR lv_e .
CLEAR lv_f .
CLEAR lv_g .
lv_sum_cost = 0.
lv_qt_cost = 0.
ENDAT.
lv_sum_cost = lv_sum_cost + lv_qt_cost.
"实际成本+实际成本-手工分摊
* lv_act_cost = <fs_output2>-zqt_cost + <fs_output2>-zact_cb.
IF <fs_output2>-zact_cb = 0 .
<fs_output2>-zact_zc = 0.
<fs_output2>-zact_fc = 0.
<fs_output2>-zact_rg = 0.
<fs_output2>-zact_dl = 0.
<fs_output2>-zact_zj = 0.
ELSE.
"过账日期不为空 /(如果实际交互日期为空值,则取该行的年度、期间
IF <fs_output2>-budat_mkpf IS INITIAL AND <fs_output2>-wadat_ist IS NOT INITIAL.
READ TABLE lt_sjcb INTO DATA(ls_sjcb) WITH KEY kalnr = <fs_output2>-kalnr bdatj = <fs_output2>-wadat_ist+0(4) poper = <fs_output2>-wadat_ist+4(2).
IF ls_sjcb IS NOT INITIAL.
lv_act_kst001 = ls_sjcb-kst001.
lv_act_kst003 = ls_sjcb-kst003.
lv_act_kst005 = ls_sjcb-kst005.
lv_act_kst007 = ls_sjcb-kst007.
lv_act_kst009 = ls_sjcb-kst009.
lv_act_kst011 = ls_sjcb-kst011.
CLEAR ls_sjcb.
ENDIF.
ELSE.
READ TABLE lt_sjcb INTO DATA(ls_sjcb2) WITH KEY kalnr = <fs_output2>-kalnr
bdatj = <fs_output2>-gjahr
poper = <fs_output2>-monat.
IF ls_sjcb2 IS NOT INITIAL.
lv_act_kst001 = ls_sjcb2-kst001.
lv_act_kst003 = ls_sjcb2-kst003.
lv_act_kst005 = ls_sjcb2-kst005.
lv_act_kst007 = ls_sjcb2-kst007.
lv_act_kst009 = ls_sjcb2-kst009.
lv_act_kst011 = ls_sjcb2-kst011.
CLEAR ls_sjcb2.
ENDIF.
ENDIF.
ENDIF.
IF lv_act_kst001 = 0 AND lv_act_kst003 = 0 AND lv_act_kst005 = 0 AND lv_act_kst007 = 0 AND lv_act_kst009 = 0 AND lv_act_kst011 = 0.
<fs_output2>-zact_zc = <fs_output2>-zact_cb.
<fs_output2>-zact_fc = 0.
<fs_output2>-zact_rg = 0.
<fs_output2>-zact_dl = 0.
<fs_output2>-zact_zj = 0.
ELSE.
"KST001+KST003+KST005+KST007+KST009+KST011
CLEAR lv_act_sum.
lv_act_sum = lv_act_kst001 + lv_act_kst003 + lv_act_kst005 + lv_act_kst007 + lv_act_kst009 + lv_act_kst011.
"abcd
lv_act_a = lv_act_kst001 / lv_act_sum .
lv_act_b = lv_act_kst003 / lv_act_sum .
lv_act_c = lv_act_kst005 / lv_act_sum .
lv_act_d = lv_act_kst007 / lv_act_sum .
lv_act_e = lv_act_kst009 / lv_act_sum .
"abcd * (实际成本+实际成本-手工分摊)
<fs_output2>-zact_zc = lv_act_a * <fs_output2>-zact_cb.
<fs_output2>-zact_fc = lv_act_b * <fs_output2>-zact_cb.
<fs_output2>-zact_rg = lv_act_c * <fs_output2>-zact_cb.
<fs_output2>-zact_dl = lv_act_d * <fs_output2>-zact_cb.
<fs_output2>-zact_zj = lv_act_e * <fs_output2>-zact_cb."lv_act_cost.
"倒挤
<fs_output2>-zact_qt = <fs_output2>-zact_cb - <fs_output2>-zact_zc - <fs_output2>-zact_fc - <fs_output2>-zact_rg - <fs_output2>-zact_dl - <fs_output2>-zact_zj.
ENDIF.
*----------5.0所有数据处理完之后,再限制工厂、车型、业务范围
* IF <fs_output2>-werks IN s_werks AND <fs_output2>-gsber = p_gjahr AND <fs_output2>-zmtype IN s_zmtype.
* MOVE-CORRESPONDING <fs_output2> TO gs_detial.
* APPEND gs_detial TO gt_detial.
* CLEAR gs_detial.
* ENDIF.
*去除matnr的前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = <fs_output2>-matnr
IMPORTING
output = <fs_output2>-matnr.
ENDLOOP.
UNASSIGN <fs_output2>.
*----------5.0所有数据处理完之后,再限制工厂、车型、业务范围
SELECT *
FROM @gt_output AS a
WHERE werks IN @s_werks
AND gsber IN @s_gsber
AND zmtype IN @s_zmtype
INTO TABLE @DATA(lt_detial).
MOVE-CORRESPONDING lt_detial TO gt_detial.
IF p_sum = 'X'.
*---------汇总取值逻辑
SELECT a~bukrs ,
a~butxt ,
a~werks ,
a~gjahr ,
a~monat ,
a~zmtype ,
a~gsber ,
a~gtext ,
a~meins ,
a~waerk ,
a~kurrf ,
SUM( a~qrsrsl ) AS qrsrsl ,
SUM( a~netwr ) AS netwr ,
SUM( a~mwsbp ) AS mwsbp ,
SUM( a~bzcb ) AS bzcb ,
SUM( a~zstan_zc ) AS zstan_zc,
SUM( a~zstan_fc ) AS zstan_fc,
SUM( a~zstan_rg ) AS zstan_rg,
SUM( a~zstan_dl ) AS zstan_dl,
SUM( a~zstan_zj ) AS zstan_zj,
SUM( a~zstan_qt ) AS zstan_qt,
SUM( a~zact_cb ) AS zact_cb ,
SUM( a~zact_zc ) AS zact_zc ,
SUM( a~zact_fc ) AS zact_fc ,
SUM( a~zact_rg ) AS zact_rg ,
SUM( a~zact_dl ) AS zact_dl ,
SUM( a~zact_zj ) AS zact_zj ,
SUM( a~zact_qt ) AS zact_qt ,
SUM( a~zqt_cost ) AS zqt_cost
FROM @gt_output AS a
WHERE werks IN @s_werks
AND gsber IN @s_gsber
AND zmtype IN @s_zmtype
GROUP BY bukrs ,
butxt ,
werks ,
gjahr ,
monat ,
zmtype,
gsber ,
gtext ,
meins ,
waerk ,
kurrf
INTO TABLE @DATA(lt_sum).
MOVE-CORRESPONDING lt_sum TO gt_sum.
LOOP AT gt_sum ASSIGNING FIELD-SYMBOL(<fs_sum>).
IF <fs_sum>-qrsrsl = 0.
<fs_sum>-zunit_sjcb = 0 .
<fs_sum>-zunit_zc = 0 .
<fs_sum>-zunit_fc = 0 .
<fs_sum>-zunit_zjrg = 0 .
<fs_sum>-zunit_dl = 0 .
<fs_sum>-zunit_zj = 0 .
<fs_sum>-zunit_qt = 0 .
<fs_sum>-zunit_cost = 0 .
ELSE.
<fs_sum>-zunit_sjcb = <fs_sum>-zact_cb / <fs_sum>-qrsrsl.
<fs_sum>-zunit_zc = <fs_sum>-zact_zc / <fs_sum>-qrsrsl.
<fs_sum>-zunit_fc = <fs_sum>-zact_fc / <fs_sum>-qrsrsl.
<fs_sum>-zunit_zjrg = <fs_sum>-zact_rg / <fs_sum>-qrsrsl.
<fs_sum>-zunit_dl = <fs_sum>-zact_dl / <fs_sum>-qrsrsl.
<fs_sum>-zunit_zj = <fs_sum>-zact_zj / <fs_sum>-qrsrsl.
<fs_sum>-zunit_qt = <fs_sum>-zact_qt / <fs_sum>-qrsrsl.
<fs_sum>-zunit_cost = <fs_sum>-zqt_cost / <fs_sum>-qrsrsl.
ENDIF.
ENDLOOP.
SORT gt_sum BY bukrs werks gjahr monat vgbel vgpos mblnr zeile.
ENDIF.
SORT gt_detial BY bukrs werks gjahr monat zmtype gsber.
IF sy-batch = abap_true.
PERFORM frm_to_excel.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_PF_STATUS
*&---------------------------------------------------------------------*
FORM set_pf_status1 USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDRD1' .
ENDFORM.
*& Form FRM_DIS_ALV
*&---------------------------------------------------------------------*
* alv输出
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_dis_alv .
DATA: lv_grid TYPE lvc_s_glay.
* lv_grid-edt_cll_cb = 'X'.
CHECK c_h <> 'X'.
IF p_sum = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS1'
i_grid_settings = lv_grid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = gt_sum.
ENDIF.
IF p_detial = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS1'
i_grid_settings = lv_grid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = gt_detial.
ENDIF.
ENDFORM. " FRM_ALV
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV
*&---------------------------------------------------------------------*
* alv设置
*---------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_alv.
DATA: l_colpos TYPE lvc_s_fcat-col_pos VALUE 0.
*&---------------------------------------------------------------------*
*& 定义宏
*&---------------------------------------------------------------------*
DEFINE macro_fill_fcat.
CLEAR gs_fieldcat.
&1 = &1 + 1.
gs_fieldcat-col_pos = &1.
gs_fieldcat-fieldname = &2.
gs_fieldcat-ref_table = &3.
gs_fieldcat-ref_field = &4. "内表中数量参照字段
gs_fieldcat-coltext = &5.
gs_fieldcat-outputlen = &6.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
FIELD-SYMBOLS: <fs_fieldcat> TYPE lvc_s_fcat.
CLEAR gt_fieldcat.
IF p_detial = 'X'.
macro_fill_fcat:
* l_colpos 'BOX' '' '' '',
l_colpos 'BUKRS' '' '' '公司代码' '',
l_colpos 'BUTXT' '' '' '公司代码描述' '',
l_colpos 'WERKS' '' '' '工厂' '',
l_colpos 'GJAHR' '' '' '年度' '',
l_colpos 'MONAT' '' '' '期间' '',
l_colpos 'VBELN' '' '' '发票号' '',
l_colpos 'POSNR' '' '' '发票行' '',
l_colpos 'FKDAT' '' '' '开票日期' '',
l_colpos 'KUNAG' '' '' '客户编码' '',
l_colpos 'NAME1' '' '' '客户名称' '',
l_colpos 'VGBEL' '' '' '交货单' '',
l_colpos 'VGPOS' '' '' '交货单行' '',
l_colpos 'WADAT_IST' '' '' '实际交货日期' '',
l_colpos 'MBLNR' '' '' '物料凭证号 ' '',
l_colpos 'ZEILE' '' '' '物料凭证行' '',
l_colpos 'BUDAT_MKPF' '' '' '过账日期' '',
l_colpos 'MATNR' '' '' '物料号' '40',
l_colpos 'MAKTX' '' '' '物料描述' '',
l_colpos 'ZMTYPE' '' '' '车型' '',
l_colpos 'SERNR' '' '' 'VIN码' '',
l_colpos 'GSBER' '' '' '业务范围' '',
l_colpos 'GTEXT' '' '' '业务范围描述' '',
l_colpos 'MEINS' '' '' '单位' '',
l_colpos 'WAERK' '' '' '币种' '',
l_colpos 'KURRF' '' '' '汇率' '',
l_colpos 'QRSRSL' '' '' '确认收入数量' '',
l_colpos 'NETWR' '' '' '收入金额' '',
l_colpos 'MWSBP' '' '' '税额' '',
l_colpos 'BZCB' '' '' '标准成本' '',
l_colpos 'ZSTAN_ZC' '' '' '原材料-主材(标准)' '',
l_colpos 'ZSTAN_FC' '' '' '原材料-辅材(标准)' '',
l_colpos 'ZSTAN_RG' '' '' '直接人工(标准)' '',
l_colpos 'ZSTAN_DL' '' '' '制费-动力(标准)' '',
l_colpos 'ZSTAN_ZJ' '' '' '制费-折旧(标准)' '',
l_colpos 'ZSTAN_QT' '' '' '制费-其他(标准)' '',
l_colpos 'ZACT_CB' '' '' '实际成本' '',
l_colpos 'ZQT_COST' '' '' '实际成本-手工分摊' '',
l_colpos 'ZACT_ZC' '' '' '原材料-主材(实际)' '',
l_colpos 'ZACT_FC' '' '' '原材料-辅材(实际)' '',
l_colpos 'ZACT_RG' '' '' '直接人工(实际)' '',
l_colpos 'ZACT_DL' '' '' '制费-动力(实际)' '',
l_colpos 'ZACT_ZJ' '' '' '制费-折旧(实际)' '',
l_colpos 'ZACT_QT' '' '' '制费-其他(实际)' ''
.
ENDIF.
IF p_sum = 'X'.
macro_fill_fcat:
* l_colpos 'BOX' '' '' '',
l_colpos 'BUKRS' '' '' '公司代码' '',
l_colpos 'BUTXT' '' '' '公司代码描述' '',
l_colpos 'WERKS' '' '' '工厂' '',
l_colpos 'GJAHR' '' '' '年度' '',
l_colpos 'MONAT' '' '' '期间' '',
l_colpos 'ZMTYPE' '' '' '车型' '',
l_colpos 'GSBER' '' '' '业务范围' '',
l_colpos 'GTEXT' '' '' '业务范围描述' '',
l_colpos 'MEINS' '' '' '单位' '',
l_colpos 'WAERK' '' '' '币种' '',
l_colpos 'KURRF' '' '' '汇率' '',
l_colpos 'QRSRSL' '' '' '确认收入数量' '',
l_colpos 'NETWR' '' '' '收入金额' '',
l_colpos 'MWSBP' '' '' '税额' '',
l_colpos 'BZCB' '' '' '标准成本' '',
l_colpos 'ZSTAN_ZC' '' '' '原材料-主材(标准)' '',
l_colpos 'ZSTAN_FC' '' '' '原材料-辅材(标准)' '',
l_colpos 'ZSTAN_RG' '' '' '直接人工(标准)' '',
l_colpos 'ZSTAN_DL' '' '' '制费-动力(标准)' '',
l_colpos 'ZSTAN_ZJ' '' '' '制费-折旧(标准)' '',
l_colpos 'ZSTAN_QT' '' '' '制费-其他(标准)' '',
l_colpos 'ZACT_CB' '' '' '实际成本' '',
l_colpos 'ZQT_COST' '' '' '实际成本-手工分摊' '',
l_colpos 'ZACT_ZC' '' '' '原材料-主材(实际)' '',
l_colpos 'ZACT_FC' '' '' '原材料-辅材(实际)' '',
l_colpos 'ZACT_RG' '' '' '直接人工(实际)' '',
l_colpos 'ZACT_DL' '' '' '制费-动力(实际)' '',
l_colpos 'ZACT_ZJ' '' '' '制费-折旧(实际)' '',
l_colpos 'ZACT_QT' '' '' '制费-其他(实际)' '',
l_colpos 'ZUNIT_SJCB' '' '' '单位-实际成本' '',
l_colpos 'ZUNIT_COST' '' '' '单位-实际成本-手工分摊' '',
l_colpos 'ZUNIT_ZC' '' '' '单位-原材料-主材(实际)' '',
l_colpos 'ZUNIT_FC' '' '' '单位-原材料-辅材(实际)' '',
l_colpos 'ZUNIT_ZJRG' '' '' '单位-直接人工(实际)' '',
l_colpos 'ZUNIT_DL' '' '' '单位-制费-动力(实际) ' '' ,
l_colpos 'ZUNIT_ZJ' '' '' '单位-制费-折旧(实际)' '',
l_colpos 'ZUNIT_QT' '' '' '单位-制费-其他(实际)' ''
.
ENDIF.
CLEAR gs_layout.
gs_layout-zebra = 'X'."设置斑马线
gs_layout-sel_mode = 'A'.
* gs_layout-no_rowmark = 'X'.
gs_layout-cwidth_opt = 'X'."优化列宽设置
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_LOAD
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& --> P1 TEXT
*& <-- P2 TEXT
*&---------------------------------------------------------------------*
FORM frm_load .
IF c_h = abap_true."后台执行
DATA: lv_job_name LIKE tbtco-jobname, "作业名
lv_job_nr LIKE tbtco-jobcount, "作业号
lv_job_released TYPE c,
lv_job_start_sofort TYPE c,
lv_print_parameters TYPE pri_params.
DATA:lt_rspar TYPE TABLE OF rsparams,
lt_rspar_buffer TYPE TABLE OF rsparams,
lw_line LIKE LINE OF lt_rspar.
"如果是要传给PARAMETER 根据需求设置屏幕参数
"公司代码
lw_line-selname = 'P_BUKRS'.
lw_line-kind = 'P'.
lw_line-sign = 'I'.
lw_line-option = 'EQ'.
lw_line-low = p_bukrs.
APPEND lw_line TO lt_rspar.
lw_line-selname = 'P_GJAHR'.
lw_line-kind = 'P'.
lw_line-sign = 'I'.
lw_line-option = 'EQ'.
lw_line-low = p_gjahr.
APPEND lw_line TO lt_rspar.
lw_line-selname = 'P_DETIAL'.
lw_line-kind = 'P'.
lw_line-sign = 'I'.
lw_line-option = 'EQ'.
lw_line-low = p_detial.
APPEND lw_line TO lt_rspar.
"R_PDF
lw_line-selname = 'P_SUM'.
lw_line-kind = 'P'.
lw_line-sign = 'I'.
lw_line-option = 'EQ'.
lw_line-low = p_sum.
APPEND lw_line TO lt_rspar.
* lw_line-selname = 'C_EXCEL'.
* lw_line-kind = 'P'.
* lw_line-sign = 'I'.
* lw_line-option = 'EQ'.
* lw_line-low = c_excel.
* APPEND lw_line TO lt_rspar.
"p_eline
* lw_line-selname = 'P_ELINE'.
* lw_line-kind = 'P'.
* lw_line-sign = 'I'.
* lw_line-option = 'EQ'.
* lw_line-low = p_eline.
* APPEND lw_line TO lt_rspar.
lt_rspar_buffer = CORRESPONDING #( s_werks[] ).
LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_werks>).
<fs_werks>-selname = 'S_WERKS'.
<fs_werks>-kind = 'S'.
ENDLOOP.
APPEND LINES OF lt_rspar_buffer TO lt_rspar.
lt_rspar_buffer = CORRESPONDING #( s_monat[] ).
LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_monat>).
<fs_monat>-selname = 'S_MONAT'.
<fs_monat>-kind = 'S'.
ENDLOOP.
APPEND LINES OF lt_rspar_buffer TO lt_rspar.
lt_rspar_buffer = CORRESPONDING #( s_zmtype[] ).
LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_zmtype>).
<fs_zmtype>-selname = 'S_ZMTYPE'.
<fs_zmtype>-kind = 'S'.
ENDLOOP.
APPEND LINES OF lt_rspar_buffer TO lt_rspar.
lt_rspar_buffer = CORRESPONDING #( s_gsber[] ).
LOOP AT lt_rspar_buffer ASSIGNING FIELD-SYMBOL(<fs_gsber>).
<fs_gsber>-selname = 'S_GSBER'.
<fs_gsber>-kind = 'S'.
ENDLOOP.
APPEND LINES OF lt_rspar_buffer TO lt_rspar.
lv_job_name = 'ZFIR202' .
"打开JOB 通过JOB NAME 获得JOB号
CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobname = lv_job_name
IMPORTING
jobcount = lv_job_nr
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.
IF sy-subrc = 0.
SUBMIT (lv_job_name)
WITH SELECTION-TABLE lt_rspar
USER sy-uname " MANDATORY
VIA JOB lv_job_name NUMBER lv_job_nr AND RETURN.
"运行结束 关闭JOB
IF sy-subrc = 0.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = lv_job_nr
jobname = lv_job_name
strtimmed = 'X'
IMPORTING
job_was_released = lv_job_released
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.
IF syst-subrc <> 0.
MESSAGE '关闭后台作业出错' TYPE 'I'.
ELSE.
MESSAGE '后台JOB开始运行' TYPE 'I'.
ENDIF.
ENDIF.
ENDIF.
RETURN.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form TO_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_to_excel.
IF p_detial = 'X'.
CHECK gt_detial IS NOT INITIAL.
ENDIF.
IF p_sum = 'X'.
CHECK gt_sum IS NOT INITIAL.
ENDIF.
*&-------------------------------------------------*
*& 后台执行
*&-------------------------------------------------*
DATA: lt_line TYPE ztts_lines.
CONSTANTS: c_key TYPE i VALUE 26101957."密钥
CONSTANTS: c_pwd(10) VALUE 'Hand@2018'.
CONSTANTS: c_user(6) VALUE 'SAPFTP'.
CONSTANTS: c_host(14) VALUE '10.88.61.117'.
* *SAPFTPA:表示以SAP服务器为目的地,上传与下载都会放在SAP服务器上;SAPFTP:以Client端为目的地
CONSTANTS: c_rfcdest LIKE rfcdes-rfcdest VALUE 'SAPFTPA'.
DATA:lv_pwd(40).
DATA:lv_command(99),
lv_len TYPE i,
lv_hdl TYPE i.
DATA: BEGIN OF lt_result OCCURS 0,
line(100) TYPE c,
END OF lt_result.
DATA:lv_filename TYPE char128.
DATA oref TYPE REF TO cx_root.
DATA: BEGIN OF lt_data_txt OCCURS 0 ,
line(500),
END OF lt_data_txt.
DATA: BEGIN OF lt_data_binary OCCURS 0,
x(2000) TYPE x,
END OF lt_data_binary.
DATA: lv_binary_len TYPE i.
DATA: l_codepage(4) TYPE n .
DATA: l_encoding(20).
CONSTANTS:
c_tab TYPE c VALUE cl_bcs_convert=>gc_tab,
c_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf,
c_mimetype TYPE char64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
DATA: v_xattach TYPE xstring.
DATA: lv_string TYPE string.
DATA lv_shsl TYPE string.
DATA lv_hhsl TYPE string.
DATA lv_netpr TYPE string.
* IF sy-batch = abap_true."后台执行
" 将密码转化为SAP的格式
lv_len = strlen( c_pwd ).
CALL FUNCTION 'HTTP_SCRAMBLE'
EXPORTING
source = c_pwd
sourcelen = lv_len
key = c_key
IMPORTING
destination = lv_pwd. "加密密码
TRY .
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
user = c_user
password = lv_pwd
host = c_host
rfc_destination = c_rfcdest
IMPORTING
handle = lv_hdl.
CATCH cx_root INTO oref.
MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDTRY.
lv_command = 'cd' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.
TRY .
PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
IF sy-subrc <> 0.
lv_command = 'mkdir' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.
PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
lv_command = 'cd' && | | && p_bukrs && 'ZFIR202 ' && sy-datum && sy-uzeit.
PERFORM frm_ftp_commond TABLES lt_result USING lv_command lv_hdl.
ENDIF.
CATCH cx_root INTO oref.
MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
PERFORM frm_disconnect USING lv_hdl c_rfcdest.
RETURN.
ENDTRY.
* ENDIF.
*&-------------------------------------------------*
DATA: g_fm_name TYPE rs38l_fnam.
DATA: lw_result TYPE ssfcrescl,
gw_result TYPE ssfcrescl,
gw_output TYPE ssfcompop,
g_filename TYPE string,
g_bin_filesize TYPE i,
gt_lines TYPE STANDARD TABLE OF tline,
gw_control TYPE ssfctrlop.
DATA: lt_item TYPE zttfi_05_item,
lw_item TYPE ty_detial,
lw_head TYPE zsfi_05_head,
lv_racct TYPE string,
lv_char2 TYPE char4.
DATA: lt_bin TYPE TABLE OF xstring,
l_bin TYPE xstring.
DATA: lv_index TYPE i.
DATA: lv_fsum TYPE zpercentage.
DATA: lv_csum TYPE zpercentage.
DATA: lv_tnum TYPE i.
DATA l_desktopdirectory TYPE string.
IF p_sum = 'X'.
lv_tnum = lines( gt_sum ).
MOVE-CORRESPONDING gt_sum TO it_out01.
ELSEIF p_detial = 'X'.
lv_tnum = lines( gt_detial ).
MOVE-CORRESPONDING gt_detial TO it_out01.
ENDIF.
DATA(lv_path_name) = |mx{ sy-datum }-{ sy-uzeit }|.
"获取公司描述
SELECT SINGLE bukrs, butxt FROM t001 INTO @DATA(lw_t001) WHERE bukrs = @p_bukrs AND spras = @sy-langu.
DATA: lv_lines TYPE i,
lv_suffix TYPE i,
lv_flag TYPE c VALUE abap_false,
i_page TYPE string,
e_page TYPE string,
i_page_total TYPE string,
lv_mod TYPE i,
lt_string_table TYPE string_table,
lv_racct_la TYPE string,
lv_total TYPE string,
lv_de_head TYPE string,
lv_sum_head TYPE string
.
* IF p_eline IS INITIAL.
DATA(p_eline) = 60000 .
* ENDIF.
CONCATENATE lv_de_head
'公司代码' c_tab
'公司代码描述' c_tab
'工厂' c_tab
'年度' c_tab
'期间' c_tab
'发票号' c_tab
'发票行' c_tab
'开票日期' c_tab
'客户编码' c_tab
'客户中文名称' c_tab
'交货单' c_tab
'交货单行' c_tab
'实际交货日期' c_tab
'物料凭证号 ' c_tab
'物料凭证行' c_tab
'过账日期' c_tab
'物料号' c_tab
'物料描述' c_tab
'车型' c_tab
'VIN码' c_tab
'业务范围' c_tab
'业务范围描述' c_tab
'单位' c_tab
'币种' c_tab
'汇率' c_tab
'确认收入数量' c_tab
'收入金额' c_tab
'税额' c_tab
'标准成本' c_tab
'原材料-主材(标准)' c_tab
'原材料-辅材(标准)' c_tab
'直接人工(标准)' c_tab
'制费-动力(标准)' c_tab
'制费-折旧(标准)' c_tab
'制费-其他(标准)' c_tab
'实际成本' c_tab
'实际成本-手工分摊' c_tab
'原材料-主材(实际)' c_tab
'原材料-辅材(实际)' c_tab
'直接人工(实际)' c_tab
'制费-动力(实际)' c_tab
'制费-折旧(实际)' c_tab
'制费-其他(实际)' c_crlf
INTO lv_de_head.
CONCATENATE lv_sum_head
'公司代码' c_tab
'公司代码描述' c_tab
'工厂' c_tab
'年度' c_tab
'期间' c_tab
'车型' c_tab
'业务范围' c_tab
'业务范围描述' c_tab
'单位' c_tab
'币种' c_tab
'汇率' c_tab
'确认收入数量' c_tab
'收入金额' c_tab
'税额' c_tab
'标准成本' c_tab
'原材料-主材(标准)' c_tab
'原材料-辅材(标准)' c_tab
'直接人工(标准)' c_tab
'制费-动力(标准)' c_tab
'制费-折旧(标准)' c_tab
'制费-其他(标准)' c_tab
'实际成本' c_tab
'实际成本-手工分摊' c_tab
'原材料-主材(实际)' c_tab
'原材料-辅材(实际)' c_tab
'直接人工(实际)' c_tab
'制费-动力(实际)' c_tab
'制费-折旧(实际)' c_tab
'制费-其他(实际)' c_tab
'单位-实际成本' c_tab
'单位-实际成本-手工分摊' c_tab
'单位-原材料-主材(实际)' c_tab
'单位-原材料-辅材(实际)' c_tab
'单位-直接人工(实际)' c_tab
'单位-制费-动力(实际) ' c_tab
'单位-制费-折旧(实际)' c_tab
'单位-制费-其他(实际)' c_crlf
INTO lv_sum_head.
LOOP AT it_out01 ASSIGNING FIELD-SYMBOL(<fs_out01>).
lv_index = lv_index + 1.
lv_fsum = floor( lv_index / p_eline ).
lv_csum = ceil( lv_index / p_eline ).
CLEAR is_excel.
MOVE-CORRESPONDING <fs_out01> TO is_excel.
IF p_detial = 'X'.
IF lv_index = 1 OR lv_flag = abap_true.
CONCATENATE lv_string
lv_de_head
INTO lv_string.
lv_flag = abap_false.
ENDIF.
CONCATENATE lv_string
is_excel-bukrs c_tab
is_excel-butxt c_tab
is_excel-werks c_tab
is_excel-gjahr c_tab
is_excel-monat c_tab
is_excel-vbeln c_tab
is_excel-posnr c_tab
is_excel-fkdat c_tab
is_excel-kunag c_tab
is_excel-name1 c_tab
is_excel-vgbel c_tab
is_excel-vgpos c_tab
is_excel-wadat_ist c_tab
is_excel-mblnr c_tab
is_excel-zeile c_tab
is_excel-budat_mkpf c_tab
is_excel-matnr c_tab
is_excel-maktx c_tab
is_excel-zmtype c_tab
is_excel-sernr c_tab
is_excel-gsber c_tab
is_excel-gtext c_tab
is_excel-meins c_tab
is_excel-waerk c_tab
is_excel-kurrf c_tab
is_excel-qrsrsl c_tab
is_excel-netwr c_tab
is_excel-mwsbp c_tab
is_excel-bzcb c_tab
is_excel-zstan_zc c_tab
is_excel-zstan_fc c_tab
is_excel-zstan_rg c_tab
is_excel-zstan_dl c_tab
is_excel-zstan_zj c_tab
is_excel-zstan_qt c_tab
is_excel-zact_cb c_tab
is_excel-zqt_cost c_tab
is_excel-zact_zc c_tab
is_excel-zact_fc c_tab
is_excel-zact_rg c_tab
is_excel-zact_dl c_tab
is_excel-zact_zj c_tab
is_excel-zact_qt c_crlf
INTO lv_string.
ELSEIF p_sum = 'X'.
IF lv_index = 1 OR lv_flag = abap_true.
CONCATENATE lv_string
lv_sum_head
INTO lv_string.
lv_flag = abap_false.
ENDIF.
CONCATENATE lv_string
is_excel-bukrs c_tab
is_excel-butxt c_tab
is_excel-werks c_tab
is_excel-gjahr c_tab
is_excel-monat c_tab
is_excel-zmtype c_tab
is_excel-gsber c_tab
is_excel-gtext c_tab
is_excel-meins c_tab
is_excel-waerk c_tab
is_excel-kurrf c_tab
is_excel-qrsrsl c_tab
is_excel-netwr c_tab
is_excel-mwsbp c_tab
is_excel-bzcb c_tab
is_excel-zstan_zc c_tab
is_excel-zstan_fc c_tab
is_excel-zstan_rg c_tab
is_excel-zstan_dl c_tab
is_excel-zstan_zj c_tab
is_excel-zstan_qt c_tab
is_excel-zact_cb c_tab
is_excel-zqt_cost c_tab
is_excel-zact_zc c_tab
is_excel-zact_fc c_tab
is_excel-zact_rg c_tab
is_excel-zact_dl c_tab
is_excel-zact_zj c_tab
is_excel-zact_qt c_tab
is_excel-zunit_sjcb c_tab
is_excel-zunit_cost c_tab
is_excel-zunit_zc c_tab
is_excel-zunit_fc c_tab
is_excel-zunit_zjrg c_tab
is_excel-zunit_dl c_tab
is_excel-zunit_zj c_tab
is_excel-zunit_qt c_crlf
INTO lv_string.
ENDIF.
IF ( lv_index = lv_tnum ) OR ( lv_index = p_eline ) OR ( lv_fsum >= lv_csum ) .
lv_suffix = lv_suffix + 1.
IF p_detial = 'X'.
lv_char2 = 'mx'.
* CONCATENATE lv_string
* is_excel-bukrs c_tab
* is_excel-butxt c_tab
* is_excel-werks c_tab
* is_excel-gjahr c_tab
* is_excel-monat c_tab
* is_excel-vbeln c_tab
* is_excel-posnr c_tab
* is_excel-fkdat c_tab
* is_excel-vgbel c_tab
* is_excel-vgpos c_tab
* is_excel-wadat_ist c_tab
* is_excel-mblnr c_tab
* is_excel-zeile c_tab
* is_excel-budat_mkpf c_tab
* is_excel-matnr c_tab
* is_excel-maktx c_tab
* is_excel-zmtype c_tab
* is_excel-sernr c_tab
* is_excel-gsber c_tab
* is_excel-gtext c_tab
* is_excel-meins c_tab
* is_excel-waerk c_tab
* is_excel-kurrf c_tab
* is_excel-qrsrsl c_tab
* is_excel-netwr c_tab
* is_excel-mwsbp c_tab
* is_excel-bzcb c_tab
* is_excel-zstan_zc c_tab
* is_excel-zstan_fc c_tab
* is_excel-zstan_rg c_tab
* is_excel-zstan_dl c_tab
* is_excel-zstan_zj c_tab
* is_excel-zstan_qt c_tab
* is_excel-zact_cb c_tab
* is_excel-zqt_cost c_tab
* is_excel-zact_zc c_tab
* is_excel-zact_fc c_tab
* is_excel-zact_rg c_tab
* is_excel-zact_dl c_tab
* is_excel-zact_zj c_tab
* is_excel-zact_qt c_crlf
* INTO lv_string.
ELSEIF p_sum = 'X'.
lv_char2 = 'hz'.
* CONCATENATE lv_string
* is_excel-bukrs c_tab
* is_excel-butxt c_tab
* is_excel-werks c_tab
* is_excel-gjahr c_tab
* is_excel-monat c_tab
* is_excel-zmtype c_tab
* is_excel-gsber c_tab
* is_excel-gtext c_tab
* is_excel-meins c_tab
* is_excel-waerk c_tab
* is_excel-kurrf c_tab
* is_excel-qrsrsl c_tab
* is_excel-netwr c_tab
* is_excel-mwsbp c_tab
* is_excel-bzcb c_tab
* is_excel-zstan_zc c_tab
* is_excel-zstan_fc c_tab
* is_excel-zstan_rg c_tab
* is_excel-zstan_dl c_tab
* is_excel-zstan_zj c_tab
* is_excel-zstan_qt c_tab
* is_excel-zact_cb c_tab
* is_excel-zqt_cost c_tab
* is_excel-zact_zc c_tab
* is_excel-zact_fc c_tab
* is_excel-zact_rg c_tab
* is_excel-zact_dl c_tab
* is_excel-zact_zj c_tab
* is_excel-zact_qt c_tab
* is_excel-zunit_sjcb c_tab
* is_excel-zunit_cost c_tab
* is_excel-zunit_zc c_tab
* is_excel-zunit_fc c_tab
* is_excel-zunit_zjrg c_tab
* is_excel-zunit_dl c_tab
* is_excel-zunit_zj c_tab
* is_excel-zunit_qt c_crlf
* INTO lv_string.
ENDIF.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = lv_string
mimetype = c_mimetype
IMPORTING
buffer = v_xattach
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc = 0.
CONCATENATE cl_abap_char_utilities=>byte_order_mark_little
v_xattach INTO v_xattach IN BYTE MODE.
ENDIF.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = v_xattach
TABLES
binary_tab = lt_line.
DESCRIBE TABLE lt_line LINES DATA(lv_num).
lv_binary_len = lv_num * 255.
IF lv_suffix IS NOT INITIAL.
lv_filename = p_bukrs && '-' && p_gjahr && '-' && lv_char2 && s_monat-low && s_monat-high && '(' && lv_suffix && ')' && '.xls'.
ELSE.
lv_filename = p_bukrs && '-' && p_gjahr && '-' && lv_char2 && s_monat-low && s_monat-high && '.xls'.
ENDIF.
TRY .
CALL FUNCTION 'FTP_R3_TO_SERVER'
EXPORTING
handle = lv_hdl
fname = lv_filename
blob_length = lv_binary_len
TABLES
blob = lt_line "二进制输出
EXCEPTIONS
tcpip_error = 1
command_error = 2
data_error = 3.
IF sy-subrc = 0.
WRITE:/ '上传成功:' , lv_filename .
lv_flag = abap_true.
ELSE.
WRITE:/ '上传时发生了错误:' , lv_filename .
ENDIF.
CATCH cx_root INTO oref.
MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
WRITE:/ '上传时发生了错误' , lv_filename .
"RETURN.
ENDTRY.
CLEAR: lt_line, lv_string, v_xattach.
ENDIF.
ENDLOOP.
* IF sy-batch = abap_true.
PERFORM frm_disconnect USING lv_hdl c_rfcdest.
* ENDIF.
ENDFORM.
*
**&---------------------------------------------------------------------*
**& Form FRM_DISCONNECT
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**& --> LV_HDL
**& --> C_RFCDEST
**&---------------------------------------------------------------------*
FORM frm_disconnect USING pv_hdl
pv_rfcdest.
"关闭SAP与其他系统的连接
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
handle = pv_hdl.
"关闭SAP与其他系统的RFC连接.
CALL FUNCTION 'RFC_CONNECTION_CLOSE'
EXPORTING
destination = pv_rfcdest
EXCEPTIONS
OTHERS = 1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FTP_COMMOND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LT_RESULT
*& --> LV_COMMAND
*& --> LV_HDL
*&---------------------------------------------------------------------*
FORM frm_ftp_commond TABLES pt_result TYPE table
USING pv_command
pv_hdl.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
handle = pv_hdl
command = pv_command
TABLES
data = pt_result
EXCEPTIONS
error_message = 99
OTHERS = 34.
ENDFORM.