REPORT zrfi_029.
TABLES:coep,afpo.
*ALV使用定义
TYPE-POOLS:slis.
*ALV属性使用定义
DATA: gs_repid TYPE sy-repid,
gs_fieldcat TYPE slis_t_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gs_sortinfo TYPE slis_t_sortinfo_alv.
DATA: as_fieldcat TYPE slis_fieldcat_alv.
DATA:t_ztfi023 LIKE TABLE OF ztfi023 WITH HEADER LINE.
DATA: BEGIN OF itab OCCURS 0.
include structure ztfi023.
DATA: maktx LIKE makt-maktx.
DATA:END OF itab.
DATA:itab1 LIKE TABLE OF itab WITH HEADER LINE,
itab2 LIKE TABLE OF itab WITH HEADER LINE.
DATA:BEGIN OF t_afpo OCCURS 0,
aufnr LIKE coep-aufnr,
END OF t_afpo.
DATA:BEGIN OF t_matnr OCCURS 0,
matnr LIKE mara-matnr,
werks LIKE marc-werks,
kdauf LIKE afpo-kdauf,
kdpos LIKE afpo-kdpos,
END OF t_matnr.
DATA:BEGIN OF t_kalnr OCCURS 0,
bwkey LIKE ckmlhd-bwkey,
matnr LIKE mara-matnr,
vbeln LIKE ckmlhd-vbeln,
posnr LIKE ckmlhd-posnr,
kalnr LIKE ckmlhd-kalnr,
END OF t_kalnr.
DATA:BEGIN OF t_coep OCCURS 0,
werks LIKE coep-werks,
gjahr LIKE coep-gjahr,
perio LIKE coep-perio,
belnr LIKE coep-belnr,
buzei LIKE coep-buzei,
aufnr LIKE coep-aufnr,
kstar LIKE coep-kstar,
wtgbtr LIKE coep-wtgbtr,
wrttp LIKE coep-wrttp,
END OF t_coep.
DATA:BEGIN OF t_fcml_rep_v OCCURS 0,
kalnr_mat LIKE fcml_rep_v-kalnr_mat,
gjahr LIKE mlauf-gjahr,
poper LIKE mlauf-poper,
belnr LIKE coep-belnr,
buzei LIKE coep-buzei,
categ LIKE fcml_rep_v-categ,
ptyp LIKE fcml_rep_v-ptyp,
psart LIKE fcml_rep_v-psart,
estprd LIKE fcml_rep_v-estprd,
lbkum LIKE fcml_rep_v-lbkum,
salk3 LIKE fcml_rep_v-salk3,
END OF t_fcml_rep_v.
DATA:BEGIN OF t_mlauf OCCURS 0,
werks LIKE mlauf-werks,
kalnr LIKE mlauf-kalnr,
aufnr LIKE mlauf-aufnr,
gjahr LIKE mlauf-gjahr,
poper LIKE mlauf-poper,
belnr LIKE coep-belnr,
buzei LIKE coep-buzei,
bwart LIKE mlauf-bwart,
menge LIKE mlauf-menge,
END OF t_mlauf.
"DATA:t_mlauf1 LIKE TABLE OF t_mlauf WITH HEADER LINE.
DATA:BEGIN OF t_bseg OCCURS 0,
werks LIKE bseg-werks,
aufnr LIKE bseg-aufnr,
gjahr LIKE bseg-gjahr,
monat LIKE bseg-h_monat,
belnr LIKE bseg-belnr,
buzei LIKE bseg-buzei,
shkzg LIKE bseg-shkzg,
dmbtr LIKE bseg-dmbtr,
END OF t_bseg.
DATA:t_bseg1 LIKE TABLE OF t_bseg WITH HEADER LINE.
DATA:BEGIN OF t_ckmlcr OCCURS 0,
bwkey LIKE ckmlhd-bwkey,
kalnr LIKE ckmlhd-kalnr,
matnr LIKE ckmlhd-matnr,
vbeln LIKE ckmlhd-vbeln,
posnr LIKE ckmlhd-posnr,
peinh LIKE ckmlcr-peinh,
pvprs LIKE ckmlcr-pvprs,
stprs LIKE ckmlcr-stprs,
END OF t_ckmlcr.
DATA:s_pvprs LIKE ckmlcr-pvprs,
s_stprs LIKE ckmlcr-stprs,
p_gjahr LIKE coep-gjahr,
p_perio LIKE coep-perio.
SELECTION-SCREEN:BEGIN OF BLOCK a WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:s_werks FOR coep-werks DEFAULT 'S100'.
PARAMETERS: s_gjahr LIKE coep-gjahr DEFAULT sy-datum(4),
s_perio LIKE coep-perio DEFAULT sy-datum+4(2) OBLIGATORY.
SELECT-OPTIONS:s_matnr FOR coep-matnr,
s_aufnr FOR coep-aufnr.
SELECTION-SCREEN:END OF BLOCK a.
SELECTION-SCREEN:BEGIN OF BLOCK b WITH FRAME TITLE TEXT-002.
PARAMETERS: p_so AS CHECKBOX DEFAULT 'X'.
SELECT-OPTIONS:s_vbeln FOR afpo-kdauf MODIF ID c,
s_posnr FOR afpo-kdpos MODIF ID c.
SELECTION-SCREEN:END OF BLOCK b.
SELECTION-SCREEN:BEGIN OF BLOCK c WITH FRAME TITLE TEXT-003.
PARAMETERS:p_zz AS CHECKBOX,
p_fp AS CHECKBOX.
SELECTION-SCREEN:END OF BLOCK c.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
* LOOP AT SCREEN.
* CASE screen-group1.
* WHEN 'C'.
* IF p_so = ''.
* screen-active = '0'.
* ELSE.
* screen-active = '1'.
* ENDIF.
* ENDCASE.
* MODIFY SCREEN.
* ENDLOOP.
START-OF-SELECTION.
PERFORM get_data.
"ALV全局属性
"PERFORM frm_set_alv_layo." CHANGING ws_layout.
PERFORM out_data .
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
"上一期间
IF s_perio = '001'.
p_gjahr = s_gjahr - 1.
p_perio = '012'.
ELSE.
p_gjahr = s_gjahr.
p_perio = s_perio - 1.
ENDIF.
SELECT a~werks a~gjahr a~perio a~objnr
b~kdauf b~kdpos b~matnr c~maktx b~aufnr b~dauat b~lgort b~psmng
d~bklas
FROM coep AS a
INNER JOIN afpo AS b ON a~aufnr = b~aufnr
INNER JOIN makt AS c ON b~matnr = c~matnr AND c~spras = '1'
INNER JOIN mbew AS d ON b~matnr = d~matnr AND a~werks = d~bwkey
INTO CORRESPONDING FIELDS OF TABLE itab1
WHERE a~kokrs = 'SS88'
AND a~werks IN s_werks
AND a~gjahr = s_gjahr AND a~perio = s_perio
AND b~matnr IN s_matnr
AND a~aufnr IN s_aufnr
AND a~wrttp = '04'
.
SORT itab1 BY werks gjahr perio objnr kdauf kdpos matnr aufnr dauat lgort .
DELETE ADJACENT DUPLICATES FROM itab1.
LOOP AT itab1.
t_afpo-aufnr = itab1-aufnr.
APPEND t_afpo.
t_matnr-matnr = itab1-matnr.
t_matnr-werks = itab1-werks.
t_matnr-kdauf = itab1-kdauf.
t_matnr-kdpos = itab1-kdpos.
APPEND t_matnr.
CLEAR:t_afpo,t_matnr,itab1.
ENDLOOP.
"抓成本估算号
IF t_matnr[] IS NOT INITIAL.
SORT t_matnr BY matnr werks kdauf kdpos.
SELECT bwkey matnr vbeln posnr kalnr
INTO CORRESPONDING FIELDS OF TABLE t_kalnr
FROM ckmlhd
FOR ALL ENTRIES IN t_matnr
WHERE matnr = t_matnr-matnr AND bwkey = t_matnr-werks AND vbeln = t_matnr-kdauf AND posnr = t_matnr-kdpos.
SORT t_kalnr BY matnr kalnr.
DELETE ADJACENT DUPLICATES FROM t_kalnr.
ENDIF.
" 定价单价
SELECT a~bwkey a~kalnr a~matnr a~vbeln a~posnr b~peinh b~pvprs b~stprs
INTO CORRESPONDING FIELDS OF TABLE t_ckmlcr
FROM ckmlhd AS a INNER JOIN ckmlcr AS b ON a~kalnr = b~kalnr
WHERE b~bdatj = s_gjahr AND b~poper = s_perio AND vprsv = 'V' AND a~bwkey IN s_werks.
SORT t_ckmlcr BY matnr vbeln posnr.
DELETE ADJACENT DUPLICATES FROM t_ckmlcr.
IF p_so = ''.
DELETE itab1 WHERE kdauf <> ''.
DELETE t_ckmlcr WHERE vbeln <> ''.
ELSE.
IF s_vbeln IS NOT INITIAL.
DELETE itab1 WHERE kdauf NOT IN s_vbeln AND kdpos NOT IN s_posnr.
DELETE t_ckmlcr WHERE vbeln NOT IN s_vbeln AND posnr NOT IN s_posnr.
ENDIF.
ENDIF.
IF t_afpo[] IS NOT INITIAL.
SORT t_afpo BY aufnr.
DELETE ADJACENT DUPLICATES FROM t_afpo.
"工单成本
SELECT werks gjahr perio belnr buzei aufnr kstar wtgbtr wrttp
INTO CORRESPONDING FIELDS OF TABLE t_coep
FROM coep
FOR ALL ENTRIES IN t_afpo
WHERE coep~kokrs = 'SS88'
"AND coep~werks IN s_werks " 报工差异还原不分工厂。
AND ( ( coep~gjahr = s_gjahr AND coep~perio <= s_perio ) OR coep~gjahr < s_gjahr )
AND coep~aufnr = t_afpo-aufnr
AND wrttp = '04'
.
"交货数量
SELECT werks kalnr aufnr gjahr poper belnr buzei bwart menge
INTO CORRESPONDING FIELDS OF TABLE t_mlauf
FROM mlauf
FOR ALL ENTRIES IN t_afpo
WHERE aufnr = t_afpo-aufnr
AND bwart IN ('101','102')
AND ( ( gjahr = s_gjahr AND poper <= s_perio ) OR gjahr < s_gjahr )
AND werks IN s_werks
.
"期末在制品金额
SELECT werks aufnr gjahr h_monat AS monat belnr buzei shkzg dmbtr
INTO CORRESPONDING FIELDS OF TABLE t_bseg
FROM bseg
FOR ALL ENTRIES IN t_afpo
WHERE aufnr = t_afpo-aufnr
AND hkont = '1406060001'
AND ( ( gjahr = s_gjahr AND h_monat <= s_perio ) OR gjahr < s_gjahr )
AND werks IN s_werks.
ENDIF.
IF t_kalnr[] IS NOT INITIAL.
"半成品差异
SELECT a~kalnr_mat a~bdatj AS gjahr a~poper a~estprd a~categ a~ptyp a~psart a~lbkum a~salk3
INTO CORRESPONDING FIELDS OF TABLE t_fcml_rep_v
FROM fcml_rep_v AS a
FOR ALL ENTRIES IN t_kalnr
WHERE a~kalnr_mat = t_kalnr-kalnr
AND ( ( a~categ = 'ZU' AND a~ptyp = 'BF' AND a~psart = 'MC' )
OR ( a~categ = 'ZU' AND a~ptyp = 'BF' AND a~psart = 'WC' )
OR ( a~categ = 'AB' AND a~psart = '' )
OR ( a~categ = 'ZU' AND a~psart = 'UP' )
)
AND a~bdatj = s_gjahr AND a~poper = s_perio
"AND ( ( a~bdatj = s_gjahr AND a~poper <= s_perio ) OR a~bdatj < s_gjahr )
.
ENDIF.
itab2[] = itab1[].
LOOP AT itab1 WHERE gjahr = s_gjahr AND perio = s_perio.
itab-werks = itab1-werks.
itab-gjahr = itab1-gjahr.
itab-perio = itab1-perio.
itab-aufnr = itab1-aufnr.
itab-kdauf = itab1-kdauf.
itab-kdpos = itab1-kdpos.
itab-matnr = itab1-matnr.
itab-maktx = itab1-maktx.
itab-dauat = itab1-dauat.
itab-bklas = itab1-bklas.
itab-lgort = itab1-lgort.
itab-psmng = itab1-psmng.
CALL FUNCTION 'STATUS_TEXT_EDIT'
EXPORTING
objnr = itab1-objnr
spras = '1'
bypass_buffer = 'X'
IMPORTING
line = itab-status
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
CLEAR:itab-kalnr.
READ TABLE t_kalnr WITH KEY matnr = itab-matnr vbeln = itab-kdauf posnr = itab-kdpos.
IF sy-subrc <> 0.
READ TABLE t_kalnr WITH KEY matnr = itab-matnr.
ENDIF.
itab-kalnr = t_kalnr-kalnr.
" 交货数量
LOOP AT t_mlauf WHERE kalnr = itab-kalnr AND aufnr = itab-aufnr.
IF t_mlauf-bwart = '102'.
t_mlauf-menge = 0 - abs( t_mlauf-menge ).
ENDIF.
IF ( t_mlauf-gjahr = s_gjahr AND t_mlauf-poper < s_perio ) OR t_mlauf-gjahr < s_gjahr. "期初交货数量
itab-qcqty = itab-qcqty + t_mlauf-menge.
ELSEIF t_mlauf-gjahr = s_gjahr AND t_mlauf-poper = s_perio. "本期交货数量
itab-bqqty = itab-bqqty + t_mlauf-menge.
ENDIF.
ENDLOOP.
" 材料 ,人工,制费。
LOOP AT t_coep WHERE aufnr = itab-aufnr.
IF ( t_coep-gjahr = s_gjahr AND t_coep-perio < s_perio ) OR t_coep-gjahr < s_gjahr. "期初材料 ,人工,制费
IF t_coep-kstar >= '5001010001' AND t_coep-kstar <= '5001010009'.
itab-qcmt = itab-qcmt + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010101'.
itab-qczjrg = itab-qczjrg + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010102'.
itab-qcjjrg = itab-qcjjrg + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010103'.
itab-qczjdx = itab-qczjdx + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010104'.
itab-qcsdhn = itab-qcsdhn + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010105'.
itab-qcqtzf = itab-qcqtzf + t_coep-wtgbtr.
ENDIF.
ELSEIF t_coep-gjahr = s_gjahr AND t_coep-perio = s_perio. "本期材料 ,人工,制费
IF t_coep-kstar >= '5001010001' AND t_coep-kstar <= '5001010009'.
itab-bqmt = itab-bqmt + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010101'.
itab-bqzjrg = itab-bqzjrg + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010102'.
itab-bqjjrg = itab-bqjjrg + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010103'.
itab-bqzjdx = itab-bqzjdx + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010104'.
itab-bqsdhn = itab-bqsdhn + t_coep-wtgbtr.
ELSEIF t_coep-kstar = '8001010105'.
itab-bqqtzf = itab-bqqtzf + t_coep-wtgbtr.
ENDIF.
ENDIF.
ENDLOOP.
" 差异
LOOP AT t_fcml_rep_v WHERE kalnr_mat = itab-kalnr.
* IF ( t_fcml_rep_v-gjahr = s_gjahr AND t_fcml_rep_v-poper < s_perio ) OR t_fcml_rep_v-gjahr < s_gjahr. "期初半成品差异
* READ TABLE t_mlauf WITH KEY gjahr = t_fcml_rep_v-gjahr poper = t_fcml_rep_v-poper aufnr = t_coep-aufnr. "判断相应期间工单有没有收货。有收货才抓差异
* IF sy-subrc = 0.
* IF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF'AND t_fcml_rep_v-psart = 'MC'.
* itab-qccy = itab-qccy + t_fcml_rep_v-estprd.
* ENDIF.
* ENDIF.
"ELSE. "本期所有工单都要考虑,就不分工单查。
IF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF'AND ( t_fcml_rep_v-psart = 'MC' OR t_fcml_rep_v-psart = 'WC' ).
"物料总差异
itab-wlzcy = itab-wlzcy + t_fcml_rep_v-estprd.
ELSEIF t_fcml_rep_v-categ = 'AB' AND t_fcml_rep_v-psart = '' .
"物料期初总库存数量
itab-lbkum1 = itab-lbkum1 + t_fcml_rep_v-lbkum.
itab-salk31 = itab-salk31 + t_fcml_rep_v-salk3.
ELSEIF t_fcml_rep_v-categ = 'ZU' AND t_fcml_rep_v-ptyp = 'BF' AND t_fcml_rep_v-psart = 'UP' . "
"物料本期收货总数量
itab-lbkum2 = itab-lbkum2 + t_fcml_rep_v-lbkum.
"itab-salk32 = itab-salk32 + t_fcml_rep_v-salk3.
ENDIF.
" ENDIF.
ENDLOOP.
"期初差异 " 抓上一期间的累计差异。
SELECT SINGLE ljcy INTO itab-qccy FROM ztfi023 WHERE gjahr = p_gjahr AND perio = p_perio AND werks = itab-werks AND aufnr = itab-aufnr.
"本期差异 :( 物料总差异/ 成本核算号的所有工单本期的合计交货数量 ) * 本工单本期的合计收货总数量
IF itab-lbkum2 <> 0.
itab-bqcy = ( itab-wlzcy / itab-lbkum2 ) * itab-bqqty.
ELSE.
itab-bqcy = 0.
ENDIF.
"累计
itab-ljmt = itab-qcmt + itab-bqmt.
itab-ljzjrg = itab-qczjrg + itab-bqzjrg.
itab-ljjjrg = itab-qcjjrg + itab-bqjjrg.
itab-ljzjdx = itab-qczjdx + itab-bqzjdx.
itab-ljsdhn = itab-qcsdhn + itab-bqsdhn.
itab-ljqtzf = itab-qcqtzf + itab-bqqtzf.
itab-ljcy = itab-qccy + itab-bqcy.
itab-ljqty = itab-qcqty + itab-bqqty.
itab-qcje = itab-qcmt + itab-qczjrg + itab-qcjjrg + itab-qczjdx + itab-qcsdhn + itab-qcqtzf." + itab-qccy.
itab-bqje = itab-bqmt + itab-bqzjrg + itab-bqjjrg + itab-bqzjdx + itab-bqsdhn + itab-bqqtzf." + itab-bqcy.
itab-ljje = itab-ljmt + itab-ljzjrg + itab-ljjjrg + itab-ljzjdx + itab-ljsdhn + itab-ljqtzf." + itab-ljcy.
"期末在制品金额
LOOP AT t_bseg WHERE aufnr = itab-aufnr.
IF t_bseg-shkzg = 'H'.
itab-qmzzje = itab-qmzzje - abs( t_bseg-dmbtr ).
ELSE.
itab-qmzzje = itab-qmzzje + abs( t_bseg-dmbtr ).
ENDIF.
ENDLOOP.
"期末在制品数量:订单数量 - 累计交货数量
itab-qmzzqty = itab-psmng - itab-ljqty.
"定期单价
IF p_so = ''.
READ TABLE t_ckmlcr WITH KEY matnr = itab-matnr.
ELSE.
READ TABLE t_ckmlcr WITH KEY matnr = itab-matnr vbeln = itab-kdauf posnr = itab-kdpos.
ENDIF.
IF sy-subrc = 0.
IF t_ckmlcr-peinh = 0.
t_ckmlcr-peinh = 1.
ENDIF.
s_pvprs = t_ckmlcr-pvprs / t_ckmlcr-peinh.
s_stprs = t_ckmlcr-stprs / t_ckmlcr-peinh.
ENDIF.
"期末完工金额
itab-qmhg = itab-ljje - itab-qmzzje.
"单位实际成本。
itab-sjcb = s_pvprs.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = itab-aufnr
IMPORTING
output = itab-aufnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = itab-matnr
IMPORTING
output = itab-matnr.
APPEND itab.
CLEAR:itab,itab1,itab2,t_coep,t_fcml_rep_v,t_mlauf,t_bseg,t_ckmlcr,s_pvprs.
ENDLOOP.
* 增加:工单在本期没有投入,没有收货,但上期有期末在制,
SELECT * INTO CORRESPONDING FIELDS OF TABLE t_ztfi023 FROM ztfi023 WHERE werks IN s_werks AND gjahr = p_gjahr AND perio = p_perio AND qmzzje <> 0.
IF sy-subrc = 0.
LOOP AT t_ztfi023.
READ TABLE itab WITH KEY werks = t_ztfi023-werks aufnr = t_ztfi023-aufnr+4(8).
IF sy-subrc <> 0.
itab-werks = t_ztfi023-werks.
itab-gjahr = s_gjahr.
itab-perio = s_perio.
itab-aufnr = t_ztfi023-aufnr.
itab-kdauf = t_ztfi023-kdauf.
itab-kdpos = t_ztfi023-kdpos.
itab-matnr = t_ztfi023-matnr.
SELECT SINGLE maktx INTO itab-maktx FROM makt WHERE matnr = t_ztfi023-matnr AND spras = sy-langu.
itab-dauat = t_ztfi023-dauat.
itab-bklas = t_ztfi023-bklas.
itab-lgort = t_ztfi023-lgort.
itab-psmng = t_ztfi023-psmng.
itab-status = t_ztfi023-status.
itab-qcmt = t_ztfi023-ljmt.
itab-qczjrg = t_ztfi023-ljzjrg.
itab-qcjjrg = t_ztfi023-ljjjrg.
itab-qczjdx = t_ztfi023-ljzjdx.
itab-qcsdhn = t_ztfi023-ljsdhn.
itab-qcqtzf = t_ztfi023-ljqtzf.
itab-qccy = t_ztfi023-ljcy.
itab-qcje = t_ztfi023-ljje.
itab-qcqty = t_ztfi023-ljqty.
itab-ljmt = t_ztfi023-ljmt.
itab-ljzjrg = t_ztfi023-ljzjrg.
itab-ljjjrg = t_ztfi023-ljjjrg.
itab-ljzjdx = t_ztfi023-ljzjdx.
itab-ljsdhn = t_ztfi023-ljsdhn.
itab-ljqtzf = t_ztfi023-ljqtzf.
itab-ljcy = t_ztfi023-ljcy.
itab-ljje = t_ztfi023-ljje.
itab-ljqty = t_ztfi023-ljqty.
itab-qmzzje = t_ztfi023-qmzzje.
itab-qmzzqty = t_ztfi023-qmzzqty.
itab-zzcy = t_ztfi023-zzcy.
itab-qmhg = t_ztfi023-qmhg.
itab-kalnr = t_ztfi023-kalnr.
itab-lbkum1 = t_ztfi023-lbkum1.
itab-salk31 = t_ztfi023-salk31.
itab-lbkum2 = t_ztfi023-lbkum2.
itab-wlzcy = t_ztfi023-wlzcy.
itab-sjcb = t_ztfi023-sjcb.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = itab-aufnr
IMPORTING
output = itab-aufnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = itab-matnr
IMPORTING
output = itab-matnr.
APPEND itab.
ENDIF.
CLEAR:itab,t_ztfi023.
ENDLOOP.
ENDIF.
IF p_fp = 'X' AND p_zz = ''. "完工
DELETE itab WHERE qmzzje <> 0.
ENDIF.
IF p_zz = 'X' AND p_fp = ''. "在制
DELETE itab WHERE qmzzje = 0.
ENDIF.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV_LAYO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- GS_LAYO
*&---------------------------------------------------------------------*
FORM frm_set_alv_layo CHANGING p_gs_layo TYPE lvc_s_layo.
*ALV界面呈现颜色交替
p_gs_layo-zebra = 'X'.
*选择方式
*A:行与列的选择,无法选择单元格
*B:单选,不可以多选行,不可以多选单元格(为空时,默认选B)
*C:多选行、列,不可以多选单元格
*D:多选行列,还可以多选单元格
p_gs_layo-sel_mode = 'D'.
*自动优化列宽,当这里指定后FCAT里COL_POT可不用重复指定
* P_GS_LAYO-CWIDTH_OPT = 'X'.
*是否出现细节屏幕
p_gs_layo-detailinit = 'X'.
*细节屏幕标题
p_gs_layo-detailtitl = ''.
*控制求和后是否出现在第一行
p_gs_layo-totals_bef = ''.
*复选框
" p_gs_layo-box_fname = 'SEL'.
ENDFORM.
*& Form OUT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM out_data .
CLEAR:gs_fieldcat,gs_fieldcat[].
SORT itab BY werks gjahr perio aufnr kdauf kdpos matnr .
PERFORM frm_field USING 'ITAB' 'WERKS' '工厂' 'X'.
PERFORM frm_field USING 'ITAB' 'GJAHR' '年' 'X'.
PERFORM frm_field USING 'ITAB' 'PERIO' '期间' 'X'.
PERFORM frm_field USING 'ITAB' 'AUFNR' '工单' 'X'.
IF p_so = 'X'.
PERFORM frm_field USING 'ITAB' 'KDAUF' '销售订单' 'X'.
PERFORM frm_field USING 'ITAB' 'KDPOS' '项目' 'X'.
ENDIF.
PERFORM frm_field USING 'ITAB' 'MATNR' '物料' 'X'.
PERFORM frm_field USING 'ITAB' 'MAKTX' '描述' 'X'.
PERFORM frm_field USING 'ITAB' 'DAUAT' '订单类型' 'X'.
PERFORM frm_field USING 'ITAB' 'BKLAS' '评估类' 'X'.
PERFORM frm_field USING 'ITAB' 'LGORT' '存储地点' 'X'.
PERFORM frm_field USING 'ITAB' 'PSMNG' '工单数量' 'X'.
PERFORM frm_field USING 'ITAB' 'STATUS' '工单状态' 'X'.
PERFORM frm_field USING 'ITAB' 'QCMT' '期初材料' 'X'.
PERFORM frm_field USING 'ITAB' 'QCZJRG' '期初直接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'QCJJRG' '期初间接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'QCZJDX' '期初折旧/摊销' 'X'.
PERFORM frm_field USING 'ITAB' 'QCSDHN' '期初水电耗能' 'X'.
PERFORM frm_field USING 'ITAB' 'QCQTZF' '期初其它制费' 'X'.
"PERFORM frm_field USING 'ITAB' 'QCCY' '期初承担其他差异' 'X'.
PERFORM frm_field USING 'ITAB' 'QCJE' '期初金额' 'X'.
PERFORM frm_field USING 'ITAB' 'QCQTY' '期初交货数量' 'X'.
PERFORM frm_field USING 'ITAB' 'BQMT' '本期材料' 'X'.
PERFORM frm_field USING 'ITAB' 'BQZJRG' '本期直接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'BQJJRG' '本期间接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'BQZJDX' '本期折旧/摊销' 'X'.
PERFORM frm_field USING 'ITAB' 'BQSDHN' '本期水电耗能' 'X'.
PERFORM frm_field USING 'ITAB' 'BQQTZF' '本期其它制费' 'X'.
"PERFORM frm_field USING 'ITAB' 'BQCY' '本期承担其他差异' 'X'.
PERFORM frm_field USING 'ITAB' 'BQJE' '本期金额' 'X'.
PERFORM frm_field USING 'ITAB' 'BQQTY' '本期交货数量' 'X'.
PERFORM frm_field USING 'ITAB' 'LJMT' '累计材料' 'X'.
PERFORM frm_field USING 'ITAB' 'LJZJRG' '累计直接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'LJJJRG' '累计间接人工' 'X'.
PERFORM frm_field USING 'ITAB' 'LJZJDX' '累计折旧/摊销' 'X'.
PERFORM frm_field USING 'ITAB' 'LJSDHN' '累计水电耗能' 'X'.
PERFORM frm_field USING 'ITAB' 'LJQTZF' '累计其它制费' 'X'.
"PERFORM frm_field USING 'ITAB' 'LJCY' '累计承担其他差异' 'X'.
PERFORM frm_field USING 'ITAB' 'LJJE' '累计金额' 'X'.
PERFORM frm_field USING 'ITAB' 'LJQTY' '累计交货数量' 'X'.
PERFORM frm_field USING 'ITAB' 'QMZZJE' '期末在制品金额' 'X'.
PERFORM frm_field USING 'ITAB' 'QMZZQTY' '期末在制品数量' 'X'.
PERFORM frm_field USING 'ITAB' 'QMHG' '期末完工金额' 'X'.
"PERFORM frm_field USING 'ITAB' 'KALNR' '成本估算号' 'X'.
"PERFORM frm_field USING 'ITAB' 'LBKUM1' '物料期初库存总数量' 'X'.
"PERFORM frm_field USING 'ITAB' 'SALK31' '物料期初总实际价值' 'X'.
"PERFORM frm_field USING 'ITAB' 'LBKUM2' '物料本期生产收货总数量' 'X'.
"PERFORM frm_field USING 'ITAB' 'WLZCY' '物料本期承担的其它总差异' 'X'.
"PERFORM frm_field USING 'ITAB' 'SJCB' '单位实际成本' 'X'.
"lv_title = ''.
*设置此变量后,ALV修改的数据按回车会立即更新内表数据
* gs_settings-edt_cll_cb = 'X'.
gs_layout-zebra = 'X'.
* gs_layout-get_selinfos = 'X'.
gs_layout-colwidth_optimize = 'X'.
* gs_layout-detail_popup = 'X'.
* gs_layout-info_fieldname = 'STYLE'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_save = 'A'
i_callback_pf_status_set = 'PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = gs_fieldcat[]
it_sort = gs_sortinfo[]
is_layout = gs_layout
TABLES
t_outtab = itab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " OUT_DATA
*&---------------------------------------------------------------------*
*& Form FRM_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TABNAME text
* -->P_FIELDNAME text
* -->P_SELTEXT text
* -->P_NO_ZERO text
*----------------------------------------------------------------------*
FORM frm_field USING p_tabname p_fieldname p_seltext p_no_zero.
as_fieldcat-tabname = p_tabname.
as_fieldcat-fieldname = p_fieldname.
as_fieldcat-seltext_l = p_seltext.
as_fieldcat-no_zero = p_no_zero.
APPEND as_fieldcat TO gs_fieldcat.
CLEAR as_fieldcat.
ENDFORM. "FRM_FIELD
*&---------------------------------------------------------------------*
*& Form PF_STATUS
*&---------------------------------------------------------------------*
* ALV 动态调用
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM pf_status USING rt_extab TYPE slis_t_extab.
* DATA: cmd_data TYPE TABLE OF sy-ucomm.
* APPEND 'CMD_VIEW' TO cmd_data.
SET PF-STATUS 'ZRFI_029' ." EXCLUDING cmd_data.
ENDFORM. "PF_STATUS
*&---------------------------------------------------------------------*
*& Form USER_COMMAND
*&---------------------------------------------------------------------*
* ALV 动态调用
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
* 将界面中的选择数据更新到内表中
*=====GET_GLOBALS_FROM_SLVC_FULLSCR start==========
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
*=====GET_GLOBALS_FROM_SLVC_FULLSCR end============
CASE r_ucomm.
WHEN 'F_SAVE' OR '&DATA_SAVE'.
* 保存数据
* IF s_gjahr < '2022'.
* MESSAGE '不能保存2022年以前的数据!' TYPE 'E'.
* EXIT.
* ENDIF.
* p_gjahr = s_gjahr.
* p_monat = s_budat2+4(2).
DELETE FROM ztfi023 WHERE gjahr = s_gjahr AND perio = s_perio AND werks IN s_werks.
COMMIT WORK AND WAIT.
CLEAR:t_ztfi023,t_ztfi023[].
LOOP AT itab.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = itab-matnr
IMPORTING
output = itab-matnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = itab-aufnr
IMPORTING
output = itab-aufnr.
t_ztfi023 = itab.
APPEND t_ztfi023.
ENDLOOP.
INSERT ztfi023 FROM TABLE t_ztfi023 ACCEPTING DUPLICATE KEYS.
IF sy-subrc = 0 .
MESSAGE '数据保存成功!' TYPE 'S'.
ELSE.
MESSAGE '数据保存失败,请重新保存!' TYPE 'E'.
ENDIF.
WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
STOP.
ENDCASE.
ENDFORM. "USER_COMMAND
*Text elements
*----------------------------------------------------------
* 001 筛选条件
* 002 筛选范围一
* 003 筛选范围二
*Selection texts
*----------------------------------------------------------
* P_FP 完工产品
* P_SO 订单库存
* P_ZZ 在制品
* S_AUFNR 工单
* S_GJAHR 会计年度
* S_MATNR 料号
* S_PERIO 期间
* S_POSNR 项目
* S_VBELN 销售订单
* S_WERKS 工厂
*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
* 数据保存成功!
Table: ZTFI023 Description: 生产成本结算单表
Row | Field name | Position | Key | Data element | Domain | Datatype | Length | Lowercase | Domain text |
---|
1 | MANDT | 1 | X | MANDT | MANDT | CLNT | 3 | | 集团 |
2 | WERKS | 2 | X | WERKS_D | WERKS | CHAR | 4 | | 工厂 |
3 | GJAHR | 3 | X | GJAHR | GJAHR | NUMC | 4 | | 会计年度 |
4 | PERIO | 4 | X | CO_PERIO | PERBL | NUMC | 3 | | 期间 |
5 | AUFNR | 5 | X | AUFNR | AUFNR | CHAR | 12 | | 订单号 |
6 | KDAUF | 6 | | KDAUF | VBELN | CHAR | 10 | | 销售订单数 |
7 | KDPOS | 7 | | KDPOS | NUM06 | NUMC | 6 | | 销售订单中的条款数 |
8 | MATNR | 8 | | MATNR | MATNR | CHAR | 40 | | 物料编号 |
9 | DAUAT | 9 | | AUFART | AUFART | CHAR | 4 | | 订单类型 |
10 | BKLAS | 10 | | BKLAS | BKLAS | CHAR | 4 | | 评估类 |
11 | LGORT | 11 | | LGORT_D | LGORT | CHAR | 4 | | 存储地点 |
12 | PSMNG | 12 | | GSMNG | MENG13 | QUAN | 13 | | 计划的订单总数量 |
13 | STATUS | 13 | | STTXT | TEXT40 | CHAR | 40 | X | 维护状态的描述 |
14 | QCMT | 14 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
15 | QCCY | 15 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
16 | QCZJRG | 16 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
17 | QCJJRG | 17 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
18 | QCZJDX | 18 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
19 | QCSDHN | 19 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
20 | QCQTZF | 20 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
21 | QCJE | 21 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
22 | QCQTY | 22 | | MENGE_D | MENG13 | QUAN | 13 | | 数量 |
23 | BQMT | 23 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
24 | BQCY | 24 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
25 | BQZJRG | 25 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
26 | BQJJRG | 26 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
27 | BQZJDX | 27 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
28 | BQSDHN | 28 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
29 | BQQTZF | 29 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
30 | BQJE | 30 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
31 | BQQTY | 31 | | MENGE_D | MENG13 | QUAN | 13 | | 数量 |
32 | LJMT | 32 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
33 | LJCY | 33 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
34 | LJZJRG | 34 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
35 | LJJJRG | 35 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
36 | LJZJDX | 36 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
37 | LJSDHN | 37 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
38 | LJQTZF | 38 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
39 | LJJE | 39 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
40 | LJQTY | 40 | | MENGE_D | MENG13 | QUAN | 13 | | 数量 |
41 | QMZZJE | 41 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
42 | QMZZQTY | 42 | | MENGE_D | MENG13 | QUAN | 13 | | 数量 |
43 | ZZCY | 43 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
44 | QMHG | 44 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
45 | KALNR | 45 | | CK_KALNR | CK_KALNR | NUMC | 12 | | 没有数量结构的成本估算的成本估算编号 |
46 | LBKUM1 | 46 | | LBKUM | MENG13V | QUAN | 13 | | 总计已估计库存 |
47 | SALK31 | 47 | | SALK3 | WERT13N | CURR | 13 | | 估价的总库存价值 |
48 | LBKUM2 | 48 | | LBKUM | MENG13V | QUAN | 13 | | 总计已估计库存 |
49 | SALK32 | 49 | | SALK3 | WERT13N | CURR | 13 | | 估价的总库存价值 |
50 | BQSHBTR | 50 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
51 | WLZCY | 51 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
52 | SJCB | 52 | | WRBTR | AFLE13D2O16N_TO_23D2O30N | CURR | 23 | | 凭证货币金额 |
53 | OBJNR | 53 | | J_OBJNR | J_OBJNR | CHAR | 22 | | 对象号 |
54 | KSTAR | 54 | | KSTAR | KSTAR | CHAR | 10 | | 成本要素 |
55 | WTGBTR | 55 | | WTGXXX | AFLE15D2O21S_TO_23D2O31S | CURR | 23 | | 交易货币中的总值 |