S_MATNR 物料号
S_UDATE 需求释放日期(速度慢)
S_VBELN 销售凭证
S_WERKS 工厂
*&---------------------------------------------------------------------*
*& Report ZSD_R_12
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report zsd_r_12.
type-pools: slis.
types: slis_t_fieldcat_alv type slis_fieldcat_alv occurs 1.
data: g_events_t type slis_t_event,
g_fieldcat_t type slis_t_fieldcat_alv,
g_layout_s type slis_layout_alv,
l_fieldcat_s type slis_fieldcat_alv.
data: v_objectid type cdhdr-objectid.
data: z_cdpos type cdpos_tab .
data: zcdpos1 like cdpos occurs 0 with header line.
data: z_cdhdr like cdhdr occurs 0 with header line.
data: z_cdhdr1 like cdhdr occurs 0 with header line.
data: stabkey type string.
tables: cdhdr,cdpos,marc,vbak,vbap,makt,afpo,aufm.
data:begin of itab occurs 0,
werks like marc-werks, "工厂
vbeln like vbak-vbeln, "销售订单
posnr like vbap-posnr, "项目
matnr like marc-matnr, "物料编码
maktx like makt-maktx, "物料描述
kbmeng like vbap-kbmeng, "销售订单数量
edatu like vbep-edatu, "销售订单交货日期
ettyp like vbep-ettyp, "销售订单状态
erdat like vbap-erdat, "cdhdr-udate, 销售订单下达日期(CN改成CP的时间)cdpos里面的修改时间
aufnr like afpo-aufnr, "生产工单号
psmng like afpo-psmng, "生产工单数量
wemng like afpo-wemng, "报工数量(总报工数量)
bldat like aufm-bldat, "每次报工入库入库时间(每次)
menge like aufm-menge, "每次报工入库数量
smenge like aufm-menge, "总计入库数量
kalab like mska-kalab, "现有库存
rfmng like vbfa-rfmng, "出货数量
lerdat like vbfa-erdat, "最后一次发货日期
kunnr like vbak-kunnr, "客户(售达方)
name1 like kna1-name1, "客户(售达方)
stat like jcds-stat, "工单状态
end of itab.
data:begin of itab_out occurs 0,
werks like marc-werks, "工厂
vbeln like vbak-vbeln, "销售订单
posnr like vbap-posnr, "项目
matnr like marc-matnr, "物料编码
maktx like makt-maktx, "物料描述
kbmeng like vbap-kbmeng, "销售订单数量
edatu like vbep-edatu, "销售订单交货日期
ettyp like vbep-ettyp, "销售订单状态
erdat like vbap-erdat, "cdhdr-udate, "销售订单下达日期(CN改成CP的时间)cdpos里面的修改时间
aufnr like afpo-aufnr, "生产工单号
psmng like afpo-psmng, "生产工单数量
wemng like afpo-wemng, "报工数量(总报工数量)
bldat like aufm-bldat, "每次报工入库入库时间(每次)
bwart like aufm-bwart, "移动类型
menge like aufm-menge, "每次报工入库数量
smenge like aufm-menge, "总计入库数量
kalab like mska-kalab, "现有库存
rfmng like vbfa-rfmng, "出货数量
lerdat like vbfa-erdat, "最后一次发货日期
kunnr like vbak-kunnr, "客户(售达方)
name1 like kna1-name1, "客户(售达方)
stat like jest-stat, "工单状态
txt30 like wusl6-txt, "工单状态
objnr like aufk-objnr,
end of itab_out.
data : w_txt30 like wusl6-txt.
data:begin of itab_temp occurs 0,
vbeln like vbak-vbeln, "销售订单
posnr like vbap-posnr, "项目
matnr like marc-matnr, "物料编码
aufnr like afpo-aufnr, "生产工单号
menge like aufm-menge, "每次报工入库数量
end of itab_temp.
data:begin of itab_vbfa occurs 0,
vbelv like vbfa-vbelv, "销售订单
posnv like vbfa-posnv, "项目
bwart like vbfa-bwart,
rfmng like vbfa-rfmng,
erdat like vbfa-erdat,
end of itab_vbfa.
data:begin of itab_vbfa_temp occurs 0,
vbelv like vbfa-vbelv, "销售订单
posnv like vbfa-posnv, "项目
rfmng like vbfa-rfmng,
end of itab_vbfa_temp.
data:begin of itab_vbeln occurs 0,
vbelv like vbfa-vbelv, "销售订单
posnv like vbfa-posnv, "项目
end of itab_vbeln.
*查询条件(工厂\销售订单\物料编码\售达方)
selection-screen begin of block bl1 with frame title text-001.
select-options: s_werks for marc-werks default '1000',
s_vbeln for vbak-vbeln,
s_matnr for marc-matnr,
s_kunnr for vbak-kunnr.
selection-screen end of block bl1.
selection-screen begin of block bl2 with frame title text-002.
select-options: s_udate for cdhdr-udate .
selection-screen end of block bl2.
initialization.
perform layout_init using g_layout_s. "ALV GRID LAYOUT
perform eventtab_build using g_events_t[]. "ALV GRID EVENT
start-of-selection.
perform get_data.
perform displaycatalog_merge using g_fieldcat_t[] 'ITAB'.
perform alv_display tables itab_out[].
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form get_data.
if s_udate is not initial.
select * into corresponding fields of table z_cdhdr1
from cdhdr
where objectclas = 'VERKBELEG'
and tcode = 'VA02'
and udate in s_udate.
endif.
if not ( z_cdhdr1[] is initial ).
select objectid tabkey
into corresponding fields of table zcdpos1
from cdpos
for all entries in z_cdhdr1
where objectclas = 'VERKBELEG'
and changenr = z_cdhdr1-changenr
and tabname = 'VBEP'
and fname = 'ETTYP'
and value_new = 'CP'.
endif.
loop at zcdpos1.
itab_vbeln-vbelv = zcdpos1-objectid.
itab_vbeln-posnv = zcdpos1-tabkey+13(6).
append itab_vbeln.
endloop.
delete adjacent duplicates from itab_vbeln comparing vbelv posnv.
if ( s_udate is not initial ) and ( itab_vbeln[] is not initial ).
select vbap~werks vbap~vbeln vbap~posnr vbap~matnr vbap~kbmeng vbap~erdat
vbep~edatu vbep~ettyp
vbak~kunnr
kna1~name1
mska~kalab
makt~maktx
into corresponding fields of table itab
from vbap
inner join vbak on vbap~vbeln = vbak~vbeln
inner join kna1 on vbak~kunnr = kna1~kunnr
inner join vbep on vbap~vbeln = vbep~vbeln
and vbap~posnr = vbep~posnr " vbep会存在多行的问题
inner join mska on vbap~vbeln = mska~vbeln
and vbap~posnr = mska~posnr
inner join makt on vbap~matnr = makt~matnr
and makt~spras = sy-langu
for all entries in itab_vbeln
where vbap~vbeln in s_vbeln
and vbap~matnr in s_matnr
and vbap~werks in s_werks
and vbak~kunnr in s_kunnr
and vbap~vbeln = itab_vbeln-vbelv
and vbap~posnv = itab_vbeln-posnv.
else.
if ( s_udate is not initial ) and ( itab_vbeln[] is initial ).
message '没有符合条件的销售订单.' type 'E'.
endif.
endif.
if s_udate is initial.
select vbap~werks vbap~vbeln vbap~posnr vbap~matnr vbap~kbmeng vbap~erdat
vbep~edatu vbep~ettyp
vbak~kunnr
kna1~name1
mska~kalab
makt~maktx
into corresponding fields of table itab
from vbap
inner join vbak on vbap~vbeln = vbak~vbeln
inner join kna1 on vbak~kunnr = kna1~kunnr
inner join vbep on vbap~vbeln = vbep~vbeln
and vbap~posnr = vbep~posnr " vbep会存在多行的问题
inner join mska on vbap~vbeln = mska~vbeln
and vbap~posnr = mska~posnr
inner join makt on vbap~matnr = makt~matnr
and makt~spras = sy-langu
where vbap~vbeln in s_vbeln
and vbap~matnr in s_matnr
and vbap~werks in s_werks
and vbak~kunnr in s_kunnr.
endif.
if ( itab[] is initial ).
message '没有符合条件的销售订单.' type 'E'.
endif.
delete adjacent duplicates from itab comparing vbeln posnr.
*取已发货数和最后发货的时间。
select vbelv posnv bwart rfmng erdat vbeln posnn
into corresponding fields of table itab_vbfa
from vbfa
for all entries in itab
where vbfa~vbelv = itab-vbeln
and vbfa~posnv = itab-posnr
and vbtyp_n = 'J'
and rfmng <> 0.
loop at itab_vbfa. "计算总发货数
if itab_vbfa-bwart = '602'.
itab_vbfa-rfmng = - itab_vbfa-rfmng.
modify itab_vbfa.
endif.
move-corresponding itab_vbfa to itab_vbfa_temp.
collect itab_vbfa_temp.
endloop.
sort itab_vbfa by vbelv posnv erdat descending."为读取最后发货时间做准备
loop at itab.
* "取需求下达时间
field-symbols
move itab-vbeln to v_objectid .
call function 'CHANGEDOCU_CDPOS_READ'
exporting
iv_objectclas = 'VERKBELEG'
iv_objectid = v_objectid
iv_tabname = 'VBEP'
iv_fname = 'ETTYP'
iv_client = sy-mandt
importing
et_cdpos = z_cdpos
exceptions
no_importparameter = 1
others = 2.
call function 'BUS_CDHDR_GET'
exporting
i_objectclas = 'VERKBELEG'
i_objectid = v_objectid
tables
t_cdhdr = z_cdhdr.
sort z_cdpos by objectid.
loop at z_cdpos assigning
and value_new = 'CP'
and objectid = itab-vbeln.
clear stabkey.
concatenate sy-mandt itab-vbeln itab-posnr into stabkey.
find stabkey in
if sy-subrc = 0.
read table z_cdhdr with key changenr =
itab-erdat = z_cdhdr-udate.
itab-ettyp = 'CP' .
exit.
elseif itab-ettyp = 'CP'.
itab-erdat = itab-erdat.
endif.
endloop.
* 已发货数量
read table itab_vbfa_temp with key vbelv = itab-vbeln posnv = itab-posnr.
if sy-subrc = 0.
itab-rfmng = itab_vbfa_temp-rfmng.
endif.
* 最后一次发货时间
read table itab_vbfa with key vbelv = itab-vbeln posnv = itab-posnr.
if sy-subrc = 0.
itab-lerdat = itab_vbfa-erdat.
endif.
modify itab.
endloop.
if itab[] is not initial.
select afpo~kdauf as vbeln afpo~kdpos as posnr
afpo~matnr afpo~aufnr afpo~psmng afpo~wemng
aufm~mblnr aufm~bldat aufm~bwart aufm~menge
aufk~objnr
into corresponding fields of table itab_out
from afpo
inner join aufk on afpo~aufnr = aufk~aufnr
left join aufm on afpo~aufnr = aufm~aufnr
for all entries in itab
where afpo~kdauf = itab-vbeln
and afpo~kdpos = itab-posnr
and afpo~matnr = itab-matnr.
loop at itab_out.
if not ( itab_out-bwart = '101' or itab_out-bwart = '102' ).
itab_out-menge = 0.
modify itab_out.
endif.
if itab_out-bwart = '102'.
itab_out-menge = - itab_out-menge.
modify itab_out.
endif.
move-corresponding itab_out to itab_temp.
collect itab_temp.
read table itab with key vbeln = itab_out-vbeln
posnr = itab_out-posnr
matnr = itab_out-matnr.
if sy-subrc = 0.
itab_out-werks = itab-werks.
itab_out-vbeln = itab-vbeln.
itab_out-ettyp = itab-ettyp.
itab_out-kbmeng = itab-kbmeng.
itab_out-erdat = itab-erdat.
itab_out-edatu = itab-edatu.
itab_out-aufnr = itab_out-aufnr.
itab_out-kunnr = itab-kunnr.
itab_out-name1 = itab-name1.
itab_out-kalab = itab-kalab.
itab_out-maktx = itab-maktx.
itab_out-rfmng = itab-rfmng.
itab_out-lerdat = itab-lerdat.
modify itab_out.
endif.
endloop.
endif.
delete itab_out where menge = 0.
loop at itab_out.
read table itab_temp with key vbeln = itab_out-vbeln
posnr = itab_out-posnr
matnr = itab_out-matnr
aufnr = itab_out-aufnr.
if sy-subrc = 0.
itab_out-smenge = itab_temp-menge.
endif.
*生产订单状态处理
select txt04 into w_txt30
from jest
inner join tj02t on jest~stat = tj02t~istat
and tj02t~spras = sy-langu
where jest~objnr = itab_out-objnr
and inact = space
and ( jest~stat = 'I0001' or jest~stat = 'I0002' or
jest~stat = 'I0012' or jest~stat = 'I0016' or
jest~stat = 'I0028' or jest~stat = 'I0033' or
jest~stat = 'I0118' or jest~stat = 'I0321' or
jest~stat = 'I0369' or jest~stat = 'I0420' ).
concatenate itab_out-txt30 w_txt30 into itab_out-txt30 separated by ' '.
endselect.
modify itab_out.
endloop.
endform. "get_data
*&---------------------------------------------------------------------*
*& Form layout_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_G_LAYOUT_S text
*----------------------------------------------------------------------*
form layout_init using p_g_layout_s type slis_layout_alv.
p_g_layout_s-detail_popup = 'X'.
p_g_layout_s-colwidth_optimize = 'X'.
endform. " LAYOUT_INIT
*--------------------------------------------------------------------
* FORM EVENTTAB_BUILD
*--------------------------------------------------------------------
form eventtab_build using p_g_events_t type slis_t_event.
data: l_event type slis_alv_event.
call function 'REUSE_ALV_EVENTS_GET'
exporting
i_list_type = 0
importing
et_events = p_g_events_t.
* GUI STATUS
read table p_g_events_t with key name = slis_ev_pf_status_set
into l_event.
if sy-subrc eq 0.
move 'PF_STATUS_SET' to l_event-form.
append l_event to p_g_events_t.
endif.
endform. " EVENTTAB_BUILD
*&---------------------------------------------------------------------*
*& Form displaycatalog_merge
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_G_FIELDCAT_T text
* -->P_TABNAME text
*----------------------------------------------------------------------*
form displaycatalog_merge using p_g_fieldcat_t
type slis_t_fieldcat_alv
p_tabname.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'WERKS'.
l_fieldcat_s-seltext_m = '工厂'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'VBELN'.
l_fieldcat_s-seltext_m = '销售订单号'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'POSNR'.
l_fieldcat_s-seltext_m = '项目'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'MATNR'.
l_fieldcat_s-seltext_m = '物料编码'.
l_fieldcat_s-no_zero = 'X'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'MAKTX'.
l_fieldcat_s-seltext_m = '物料描述'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'KBMENG'.
l_fieldcat_s-seltext_m = '销售订单数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'EDATU'.
l_fieldcat_s-seltext_m = '订单要求交期'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'ETTYP'.
l_fieldcat_s-seltext_m = '销售订单状态'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'ERDAT'.
l_fieldcat_s-seltext_m = '销售订单下达日期'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'AUFNR'.
l_fieldcat_s-seltext_m = '生产工单号'.
l_fieldcat_s-no_zero = 'X'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'TXT30'.
l_fieldcat_s-seltext_m = '工单状态'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'PSMNG'.
l_fieldcat_s-seltext_m = '工单数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'WEMNG'.
l_fieldcat_s-seltext_m = '报工数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'BLDAT'.
l_fieldcat_s-seltext_m = '入库时间'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'BWART'.
l_fieldcat_s-seltext_m = '移动类型'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'MENGE'.
l_fieldcat_s-seltext_m = '入库数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'SMENGE'.
l_fieldcat_s-seltext_m = '工单总计入库数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'KALAB'.
l_fieldcat_s-seltext_m = '订单库存数'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'RFMNG'.
l_fieldcat_s-seltext_m = '出货数量'.
l_fieldcat_s-decimals_out = 0.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'LERDAT'.
l_fieldcat_s-seltext_m = '最后一次发货日期'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'KUNNR'.
l_fieldcat_s-seltext_m = '客户编号(售达方)'.
l_fieldcat_s-no_zero = 'X'.
append l_fieldcat_s to p_g_fieldcat_t.
clear l_fieldcat_s.
l_fieldcat_s-fieldname = 'NAME1'.
l_fieldcat_s-seltext_m = '客户名称(售达方)'.
append l_fieldcat_s to p_g_fieldcat_t.
endform. " FIELDCATALOG_MERGE
*&--------------------------------------------------------------------*
*& Form user_callback
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->RF_UCOMM text
* -->RS_SELFIELDtext
*---------------------------------------------------------------------*
form user_callback using rf_ucomm type sy-ucomm
rs_selfield type slis_selfield.
case rf_ucomm.
when '&IC1'.
data msg type string.
field-symbols
read table itab index rs_selfield-tabindex assigning
if sy-subrc = 0.
set parameter id: 'AUN' field
call transaction 'VA03' and skip first screen.
endif.
endcase.
endform. " user_callback
*&---------------------------------------------------------------------*
*& Form ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_RESULT1[] text
*----------------------------------------------------------------------*
form alv_display tables p_int_t.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = sy-repid "G_REPID
i_callback_user_command = 'USER_CALLBACK'
is_layout = g_layout_s
it_fieldcat = g_fieldcat_t[]
i_save = 'A'
tables
t_outtab = p_int_t
exceptions
program_error = 1
others = 2.
endform. " ALV_DISPLAY