*&---------------------------------------------------------------------*
*& Report ZPPR0024
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr0024.
INCLUDE zppr0024_sel.
INCLUDE zppr0024_top.
INCLUDE zppr0024_f01.
AT SELECTION-SCREEN OUTPUT.
IF p1 = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'M2'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSEIF p2 = 'X'.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
START-OF-SELECTION.
SELECT werks INTO TABLE @DATA(lt_werks) FROM t001l WHERE werks IN @s_pwwrk.
LOOP AT lt_werks INTO DATA(ls_werks) .
AUTHORITY-CHECK OBJECT 'C_STUE_WRK'
ID 'ACTVT' FIELD '03'
ID 'CSWRK' FIELD ls_werks-werks.
IF sy-subrc <> 0.
MESSAGE '您没有工厂代码' && ls_werks-werks && '权限!'TYPE 'E'.
ENDIF.
ENDLOOP.
IF p1 = 'X'.
PERFORM frm_get_data.
PERFORM frm_display_alv.
ELSEIF p2 = 'X'.
PERFORM frm_get_log_data.
PERFORM frm_display_log_alv.
ENDIF.
INCLUDE :ZPPR0024_SEL
*&---------------------------------------------------------------------*
*& 包含 ZPPR0024_SEL
*&---------------------------------------------------------------------*
TABLES:plaf,t003o,bkpf,aufk.
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p1 RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND uex,
p2 RADIOBUTTON GROUP g1.
SELECTION-SCREEN:END OF BLOCK b1.
SELECTION-SCREEN:BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS:p_auart TYPE t003o-auart OBLIGATORY MODIF ID m1 DEFAULT 'ZP01'.
SELECT-OPTIONS:s_auart FOR t003o-auart MODIF ID m2,
s_pwwrk FOR plaf-pwwrk,
s_matnr FOR plaf-matnr,
s_verid FOR plaf-verid,
s_dispo FOR plaf-dispo,
s_plgrp FOR plaf-plgrp MODIF ID M1,
s_plnum FOR plaf-plnum,
s_pertr FOR plaf-pertr,
s_psttr FOR plaf-psttr,
s_pedtr FOR plaf-pedtr,
s_datum FOR bkpf-budat MODIF ID m2,
s_aufnr FOR aufk-aufnr MODIF ID m2,
s_zzord FOR aufk-aufnr MODIF ID m2.
PARAMETERS:p_xc AS CHECKBOX DEFAULT 'X' MODIF ID m1.
SELECTION-SCREEN:END OF BLOCK b2.
INCLUDE:ZPPR0024_TOP
*&---------------------------------------------------------------------*
*& 包含 ZPPR0024_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS:slis.
TABLES:sscrfields,icon.
DATA:gt_fieldcat TYPE lvc_t_fcat,
gw_fieldcat TYPE lvc_s_fcat,
gv_repid TYPE sy-repid,
gs_layout TYPE lvc_s_layo.
TYPES:BEGIN OF tty_out,
bapi_mtype TYPE bapi_mtype, "计划订单错误类型
bapi_msg TYPE bapi_msg, "计划订单转单结果错误信息
stufe TYPE char20, "层级
zzorder TYPE aufk-zzorder, "上层生产订单
aufnr TYPE aufk-aufnr , "生产订单
auart TYPE t003o-auart , "生产订单类型
txt TYPE t003p-txt , "类型描述
matnr1 TYPE plaf-matnr,
maktx1 TYPE makt-maktx,
matnr TYPE plaf-matnr, "物料
maktx TYPE makt-maktx, "物料描述
alpgr TYPE cs_alpgr,
prfg_f TYPE mkal-prfg_f, "检查生产版本的状态
prfg_s TYPE mkal-prfg_s, "检查生产版本的状态,BOM
verid TYPE plaf-verid, "生产版本
text1 TYPE mkal-text1, "生产版本描述
plnum TYPE plaf-plnum, "计划订单
pwwrk TYPE plaf-pwwrk, "工厂
pertr TYPE plaf-pertr, "计划转换日期
psttr TYPE plaf-psttr, "基本开始日期
pedtr TYPE plaf-pedtr, "基本完成日期
gsmng TYPE plaf-gsmng, "可转单数量
meins TYPE plaf-meins, "基本计量单位
dispo TYPE plaf-dispo , "MRP控制者
fevor TYPE plaf-plgrp, "生产管理员
arbpl TYPE ztpp0020-arbpl,
zztxt TYPE aufk-zztxt, "备注
mtart TYPE mara-mtart,
menge_bc TYPE menge_d,
matnr_top TYPE matnr,
number_top TYPE numc10,
number TYPE numc10,
status TYPE char10,
sel(1),
END OF tty_out.
TYPES:ty_basic TYPE TABLE OF tty_out.
DATA:ty_alv TYPE tty_out.
DATA:gt_alv TYPE ty_basic,
gw_alv LIKE LINE OF gt_alv,
gt_alv_temp TYPE ty_basic,
gw_alv_temp LIKE LINE OF gt_alv_temp.
DATA: bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE.
TYPES:BEGIN OF tys_aufnr ,
number TYPE numc10,
zzorder TYPE aufk-zzorder, "上层生产订单
aufnr TYPE aufk-aufnr , "生产订单
zztxt TYPE aufk-zztxt, "备注
END OF tys_aufnr.
DATA:gt_aufnr TYPE TABLE OF zsfmpp_create_order.
DATA:BEGIN OF gt_out OCCURS 0,
stlal TYPE stko-stlal,
werks LIKE mast-werks, "工厂
matnr LIKE mast-matnr, "顶层父项物料编码
maktx LIKE makt-maktx, "顶层父项物料描述
emeng LIKE stko-bmeng, "父项需求数量
stufex(20) TYPE c, "级别编号
matnr1 LIKE mast-matnr, "上层父项物料编码
maktx1 LIKE makt-maktx, "上层父项物料描述
posnr LIKE stpox-posnr, "项目编号
postp LIKE stpox-postp, "项目类别
idnrk LIKE stpox-idnrk, "组件物料编码
maktx2 LIKE makt-maktx, "组件物料描述
menge LIKE stpox-menge, "组件数量
meins LIKE stpox-meins, "组件计量单位
stufe LIKE stpox-stufe, "层级
mtart LIKE stpox-mtart, "物料类型
mmsta LIKE stpox-mmsta, "工厂特定的物料状态
mmstd LIKE stpox-mmstd, "工厂特定物料状态有效的起始日期
mstae LIKE stpox-mstae, "跨工厂物料状态
mstde LIKE stpox-mstde, "从跨工厂物料状态有效起的日期
sbdkz LIKE stpox-sbdkz, "独立/集中
dismm LIKE stpox-dismm, "物料需求计划类型
ausch LIKE stpox-ausch, "组件报废(组件物料)
matkl LIKE stpox-matkl, "物料组
lgort LIKE stpox-lgort, "生产存储地点
verid LIKE stpox-verid, "生产版本
schgt LIKE stpox-schgt, "散装物料(组件物料)
aennr LIKE stpox-aennr, "变更编号
dumps LIKE stpox-dumps, "虚拟标识
datuv LIKE stpox-datuv, "有效期自
datub LIKE stpox-datub, "有效截止日期
sanka LIKE stpox-sanka, "标识:与成本核算相关的项目
sanfe LIKE stpox-sanfe, "标识:与生产相关项目
sortf LIKE stpox-sortf,
alprf LIKE stpox-alprf,
"alpgr LIKE stpox-alpgr,
itsob LIKE stpox-itsob,
bmeng TYPE menge_d,
zstktx TYPE text_512,
zpotx1 TYPE text_512,
alpgr2 TYPE text_512,
alpgr TYPE text_512,
text1 TYPE mkal-text1, "生产版本描述
plnum TYPE plaf-plnum, "计划订单
pwwrk TYPE plaf-pwwrk, "工厂
pertr TYPE plaf-pertr, "计划转换日期
psttr TYPE plaf-psttr, "基本开始日期
pedtr TYPE plaf-pedtr, "基本完成日期
gsmng TYPE plaf-gsmng, "可转单数量
dispo TYPE plaf-dispo, "MRP控制者
fevor TYPE plaf-plgrp, "生产管理员
bstmi LIKE marc-bstmi,
bstrf LIKE marc-bstrf,
plifz LIKE marc-plifz,
dispo1 LIKE marc-dispo, "顶层MRP控制者
dispo2 LIKE marc-dispo, "顶层MRP控制者
prfg_f TYPE mkal-prfg_f, "检查生产版本的状态
prfg_s TYPE mkal-prfg_s, "检查生产版本的状态,BOM
bstma TYPE mkal-bstma, "最大批量大小
stlan TYPE mkal-stlan,
ewahr TYPE stpo-ewahr,
verwe TYPE plko-verwe,
menge_bc TYPE menge_d,
matnr_top TYPE matnr,
number TYPE numc10,
number_top TYPE numc10,
field_style TYPE lvc_t_styl, " 为内表添加设置编辑状态所需的字段
END OF gt_out.
DATA:gt_plaf TYPE TABLE OF plaf.
DATA:gt_event TYPE slis_t_event WITH HEADER LINE.
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
INCLUDE zppr0024_clc.
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .
TYPES:BEGIN OF tys_tab,
plnum TYPE plaf-plnum, "计划订单
pwwrk TYPE plaf-pwwrk, "工厂
gsmng TYPE plaf-gsmng, "可转单数量
END OF tys_tab.
DATA:gt_tab TYPE TABLE OF tys_tab,
gw_tab TYPE tys_tab.
DATA:gv_matnr TYPE matnr,
gv_maktx TYPE maktx,
gv_psttr TYPE plaf-psttr, "基本开始日期
gv_pedtr TYPE plaf-pedtr, "基本完成日期
gv_gsmng_total TYPE plaf-gsmng,
gv_gsmng TYPE plaf-gsmng,
gv_werks TYPE werks_d,
gv_plnum TYPE plnum,
gv_number TYPE numc10,
gv_number_top TYPE numc10.
DATA:gt_ztpp0019 TYPE TABLE OF ztpp0019.
DATA:ok_code TYPE sy-ucomm.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_TAB' ITSELF
CONTROLS: tc_tab TYPE TABLEVIEW USING SCREEN 9000.
*&SPWIZARD: LINES OF TABLECONTROL 'TC_TAB'
DATA: g_tc_tab_lines LIKE sy-loopc.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE tc_tab_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_tab LINES tc_tab-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE tc_tab_get_lines OUTPUT.
g_tc_tab_lines = sy-loopc.
ENDMODULE.
INCLUDE : ZPPR0024_F01
*&---------------------------------------------------------------------*
*& 包含 ZPPR0024_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
*函数BOM内表
DATA:lt_stpox LIKE TABLE OF stpox WITH HEADER LINE.
DATA:lt_stpox_xc LIKE TABLE OF stpox WITH HEADER LINE.
DATA:lt_stpoxs LIKE TABLE OF stpox WITH HEADER LINE.
*根据工厂输入物料获取内表作为循环
DATA:BEGIN OF lt_marc OCCURS 0,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
dispo LIKE marc-dispo,
bstmi LIKE marc-bstmi,
bstrf LIKE marc-bstrf,
plifz LIKE marc-plifz,
beskz LIKE marc-beskz,
END OF lt_marc.
DATA:lt_marc_all LIKE TABLE OF lt_marc WITH HEADER LINE.
*获取所有物料
DATA:BEGIN OF lt_mara OCCURS 0,
matnr LIKE mara-matnr,
END OF lt_mara.
*获取所有物料描述
DATA:BEGIN OF lt_makt OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF lt_makt.
*待更改对象
DATA:BEGIN OF lt_objkt OCCURS 0,
objkt LIKE aeoi-objkt,
END OF lt_objkt.
*获取版次
DATA:BEGIN OF lt_aeoi OCCURS 0,
aennr LIKE aeoi-aennr,
objkt LIKE aeoi-objkt,
revlv LIKE aeoi-revlv,
datuv LIKE aenr-datuv,
END OF lt_aeoi.
DATA:cstmat TYPE cstmat.
DATA:cstmat_xc TYPE cstmat.
DATA:lt_cstmat TYPE TABLE OF cstmat.
DATA:lt_tline TYPE STANDARD TABLE OF tline,
lv_string TYPE string,
lv_name TYPE thead-tdname.
DATA:lv_alpgr2 TYPE string,
lv_alpgr TYPE string.
DATA:lv_stufe LIKE stpox-stufe,
lv_objkt LIKE aeoi-objkt.
DATA(lv_stlan) = VALUE mkal-stlan( ).
DATA(lv_verwe) = VALUE plko-verwe( ).
REFRESH:gt_plaf,gt_alv_temp,gt_alv.
SELECT * INTO CORRESPONDING FIELDS OF TABLE @gt_plaf
FROM plaf
WHERE pwwrk IN @s_pwwrk AND
matnr IN @s_matnr AND
verid IN @s_verid AND
dispo IN @s_dispo AND
plgrp IN @s_plgrp AND
plnum IN @s_plnum AND
pertr IN @s_pertr AND
psttr IN @s_psttr AND
pedtr IN @s_pedtr.
IF gt_plaf[] IS NOT INITIAL.
SELECT matnr,
werks,
verid,
stlal,
stlan,
text1,
bstma,"最大批量大小
prfg_f,"检查生产版本的状态
prfg_s"检查生产版本的状态,BOM
INTO TABLE @DATA(lt_mkal)
FROM mkal
FOR ALL ENTRIES IN @gt_plaf
WHERE matnr = @gt_plaf-matnr AND
werks = @gt_plaf-pwwrk AND
verid = @gt_plaf-verid .
SORT lt_mkal BY matnr werks verid.
SELECT matnr,
werks,
stlal,
stlan
INTO TABLE @DATA(lt_mkal_all)
FROM mkal
WHERE bdatu >= @sy-datum AND
adatu <= @sy-datum.
SORT lt_mkal_all BY matnr werks stlal DESCENDING.
SELECT SINGLE txt INTO @DATA(lv_txt) FROM t003p WHERE auart = @p_auart AND spras = @sy-langu.
* 生产订单ZP01 对应BOM用途1,工艺路线用途1
* 生产订单ZP02 对应BOM用途2,工艺路线用途1
* 生产订单ZP03 对应BOM用途3,工艺路线用途1
* 生产订单ZP08 对应BOM用途Y,工艺路线用途Y
* 生产订单ZP09 对应BOM用途Y,工艺路线用途Y
DATA:lv_number TYPE numc10,
lv_number_top TYPE numc10.
CLEAR:lv_number,lv_number_top.
LOOP AT gt_plaf INTO DATA(lw_plaf).
CALL FUNCTION 'ENQUEUE_EZPLNUM'
EXPORTING
mode_plaf = 'E'
mandt = sy-mandt
plnum = lw_plaf-plnum
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR:lv_stlan.
lv_number_top = lv_number_top + 1.
READ TABLE lt_mkal INTO DATA(lw_mkal) WITH KEY matnr = lw_plaf-matnr
werks = lw_plaf-pwwrk
verid = lw_plaf-verid BINARY SEARCH.
DATA(lv_stlal) = COND #( WHEN lw_mkal-stlal IS NOT INITIAL THEN lw_mkal-stlal
WHEN lw_plaf-stalt IS NOT INITIAL THEN lw_plaf-stalt
).
lv_stlan = COND #( WHEN lw_mkal-stlan IS NOT INITIAL THEN lw_mkal-stlan
WHEN lw_plaf-stlan IS NOT INITIAL THEN lw_plaf-stlan
).
REFRESH lt_cstmat.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01'
datuv = sy-datum
emeng = '' "'1' "p_emeng
mehrs = 'X' "lv_mehrs "X多层 空单层
mtnrv = lw_plaf-matnr
stlal = lv_stlal
stlan = lv_stlan
mdmps = ''
stpst = 0
werks = lw_plaf-pwwrk
IMPORTING
topmat = cstmat
TABLES
stb = lt_stpox[]
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
APPEND INITIAL LINE TO lt_cstmat ASSIGNING FIELD-SYMBOL(<fs_cstmat>).
MOVE-CORRESPONDING cstmat TO <fs_cstmat>.
lt_stpoxs[] = lt_stpox[].
SORT lt_stpoxs BY stufe wegxx.
lv_number = lv_number + 1.
gt_out-number = lv_number.
gt_out-number_top = lv_number_top.
gt_out-pwwrk = lw_plaf-pwwrk.
gt_out-meins = lw_plaf-meins.
gt_out-menge = lw_plaf-gsmng.
gt_out-gsmng = lw_plaf-gsmng.
gt_out-verid = lw_mkal-verid.
gt_out-text1 = lw_mkal-text1.
gt_out-plnum = lw_plaf-plnum.
gt_out-pertr = lw_plaf-pertr.
gt_out-psttr = lw_plaf-psttr.
gt_out-pedtr = lw_plaf-pedtr.
gt_out-dispo = lw_plaf-dispo.
gt_out-stufe = '0'.
gt_out-idnrk = lw_plaf-matnr. "顶层父项物料编码
gt_out-matnr1 = lw_plaf-matnr. "顶层父项物料编码
gt_out-matnr = lw_plaf-matnr. "顶层父项物料编码
APPEND gt_out.
CLEAR:gt_out.
ENDIF.
*找上层父项物料编码逻辑:根据该BOM函数返回内表当前条目VWEGX的值和STUFE的值减去1后,
*然后按STUFE = STUFE-1,WEGXX = VWEGX的值获取对应的IDNRK就是该记录的上层父项物料编码
LOOP AT lt_stpox.
lv_number = lv_number + 1.
*获取所有物料
lt_mara-matnr = lt_stpox-idnrk.
COLLECT lt_mara.
CLEAR:lt_mara.
*待更改对象内表
lt_objkt-objkt = lt_stpox-idnrk.
COLLECT lt_objkt.
CLEAR:lt_objkt.
lt_mara-matnr = lw_plaf-matnr.
COLLECT lt_mara.
CLEAR:lt_mara.
gt_out-werks = lw_plaf-pwwrk. "工厂
gt_out-matnr = lw_plaf-matnr. "顶层父项物料编码
gt_out-emeng = lw_plaf-gsmng. "父项需求数量
CLEAR:cstmat_xc.
REFRESH lt_stpox_xc.
IF lt_stpox-vwegx = 0. "上层父项物料编码 = 顶层父项物料编码
gt_out-matnr1 = lw_plaf-matnr. "上层父项物料编码
READ TABLE lt_cstmat INTO DATA(lw_cstmat) WITH KEY matnr = gt_out-matnr1.
IF sy-subrc NE 0.
READ TABLE lt_mkal_all INTO DATA(lw_mkal_all) WITH KEY matnr = gt_out-matnr1 werks = gt_out-werks stlan = lv_stlan.
IF sy-subrc EQ 0.
lv_stlal = lw_mkal_all-stlal .
ENDIF.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01'
datuv = sy-datum
emeng = '' "'1' "p_emeng
mehrs = 'X' "lv_mehrs "X多层 空单层
mtnrv = gt_out-matnr1
stlal = lv_stlal
stlan = lv_stlan
mdmps = ''
stpst = 0
werks = lw_plaf-pwwrk
IMPORTING
topmat = cstmat_xc
TABLES
stb = lt_stpox_xc[]
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
MOVE-CORRESPONDING cstmat_xc TO cstmat.
APPEND INITIAL LINE TO lt_cstmat ASSIGNING <fs_cstmat>.
MOVE-CORRESPONDING cstmat_xc TO <fs_cstmat>.
ELSE.
MOVE-CORRESPONDING lw_cstmat TO cstmat.
ENDIF.
ELSE.
CLEAR:lv_stufe.
lv_stufe = lt_stpox-stufe - 1.
READ TABLE lt_stpoxs WITH KEY stufe = lv_stufe
wegxx = lt_stpox-vwegx BINARY SEARCH.
IF sy-subrc = 0.
gt_out-matnr1 = lt_stpoxs-idnrk. "上层父项物料编码
READ TABLE lt_cstmat INTO lw_cstmat WITH KEY matnr = gt_out-matnr1.
IF sy-subrc NE 0.
READ TABLE lt_mkal_all INTO lw_mkal_all WITH KEY matnr = gt_out-matnr1 werks = gt_out-werks stlan = lv_stlan.
IF sy-subrc EQ 0.
lv_stlal = lw_mkal_all-stlal .
ENDIF.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01'
datuv = sy-datum
emeng = '' "'1' "p_emeng
mehrs = 'X' "lv_mehrs "X多层 空单层
mtnrv = gt_out-matnr1
stlal = lv_stlal
stlan = lv_stlan
mdmps = ''
stpst = 0
werks = lw_plaf-pwwrk
IMPORTING
topmat = cstmat_xc
TABLES
stb = lt_stpox_xc[]
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
MOVE-CORRESPONDING cstmat_xc TO cstmat.
APPEND INITIAL LINE TO lt_cstmat ASSIGNING <fs_cstmat>.
MOVE-CORRESPONDING cstmat_xc TO <fs_cstmat>.
ELSE.
MOVE-CORRESPONDING lw_cstmat TO cstmat.
ENDIF.
ENDIF.
ENDIF.
gt_out-posnr = lt_stpox-posnr. "项目编号
gt_out-postp = lt_stpox-postp. "项目类别
gt_out-idnrk = lt_stpox-idnrk. "组件物料编码
IF cstmat-bmeng <> 0.
gt_out-menge = gt_out-emeng * lt_stpox-menge / cstmat-bmeng . "组件数量
gt_out-menge_bc = lt_stpox-menge / cstmat-bmeng .
ENDIF.
gt_out-meins = lt_stpox-meins. "组件计量单位
gt_out-stufe = lt_stpox-stufe. "层级
gt_out-mtart = lt_stpox-mtart. "物料类型
gt_out-mmsta = lt_stpox-mmsta. "工厂特定的物料状态
gt_out-mmstd = lt_stpox-mmstd. "工厂特定物料状态有效的起始日期
gt_out-mstae = lt_stpox-mstae. "跨工厂物料状态
gt_out-mstde = lt_stpox-mstde. "从跨工厂物料状态有效起的日期
gt_out-sbdkz = lt_stpox-sbdkz. "独立/集中
gt_out-dismm = lt_stpox-dismm. "物料需求计划类型
gt_out-ausch = lt_stpox-ausch. "子件损耗率%,(标准用量/实际数量)
gt_out-matkl = lt_stpox-matkl. "物料组
gt_out-lgort = lt_stpox-lgort. "生产存储地点
gt_out-verid = lt_stpox-verid. "生产版本
gt_out-schgt = lt_stpox-schgt. "散装物料(组件物料)
gt_out-aennr = lt_stpox-aennr. "变更编号
gt_out-dumps = lt_stpox-dumps. "虚拟标识
gt_out-datuv = lt_stpox-datuv. "有效期自
gt_out-datub = lt_stpox-datub. "有效截止日期
gt_out-sanka = lt_stpox-sanka. "标识:与成本核算相关的项目
gt_out-sanfe = lt_stpox-sanfe. "标识:与生产相关项目
gt_out-sortf = lt_stpox-sortf. "
gt_out-alprf = lt_stpox-alprf. "
gt_out-alpgr = lt_stpox-alpgr. "
gt_out-itsob = lt_stpox-itsob. "
gt_out-ewahr = lt_stpox-ewahr. "
gt_out-bmeng = cstmat-bmeng. "
gt_out-stlal = cstmat-stlal. "
gt_out-zstktx = cstmat-stktx.
REFRESH lt_tline.
CLEAR:lv_name,lv_string.
CONCATENATE sy-mandt lt_stpox-bmtyp lt_stpox-stlnr INTO lv_name.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'MZU' "'MKO'
language = sy-langu
name = lv_name
object = 'BOM'
TABLES
lines = lt_tline
EXCEPTIONS
id = 1
object = 2
OTHERS = 3.
LOOP AT lt_tline INTO DATA(wa_tline).
lv_string = lv_string && wa_tline-tdline.
ENDLOOP.
IF lv_string IS NOT INITIAL.
gt_out-zstktx = lv_string.
ENDIF.
REFRESH lt_tline.
CLEAR:lv_name,lv_string.
CONCATENATE sy-mandt lt_stpox-bmtyp lt_stpox-stlnr lt_stpox-stlkn lt_stpox-stpoz INTO lv_name.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = 'BOM'
language = sy-langu
name = lv_name
object = 'AUFK'
TABLES
lines = lt_tline
EXCEPTIONS
id = 1
object = 2
OTHERS = 3.
LOOP AT lt_tline INTO wa_tline.
lv_string = lv_string && wa_tline-tdline.
ENDLOOP.
IF lv_string IS NOT INITIAL.
gt_out-zpotx1 = lv_string.
ENDIF.
" gt_out-verid = lw_plaf-verid.
"gt_out-text1 = lw_mkal-text1.
gt_out-plnum = lw_plaf-plnum.
gt_out-pwwrk = lw_plaf-pwwrk.
gt_out-pertr = lw_plaf-pertr.
gt_out-psttr = lw_plaf-psttr.
gt_out-pedtr = lw_plaf-pedtr.
gt_out-prfg_f = lw_mkal-prfg_f.
gt_out-prfg_s = lw_mkal-prfg_s.
gt_out-bstma = lw_mkal-bstma.
gt_out-matnr_top = lw_plaf-matnr.
gt_out-gsmng = gt_out-menge.
"gt_out-meins = gt_out-meins.
gt_out-dispo = lw_plaf-dispo.
gt_out-fevor = lw_plaf-plgrp.
gt_out-number = lv_number.
gt_out-number_top = lv_number_top.
APPEND gt_out.
CLEAR:lt_stpox,gt_out.
ENDLOOP.
CLEAR:lt_marc,lw_mkal.
ENDLOOP.
IF lt_mara[] IS NOT INITIAL.
*根据工厂输入物料获取内表作为循环
SELECT matnr werks dispo bstmi bstrf plifz beskz INTO TABLE lt_marc_all FROM marc
FOR ALL ENTRIES IN lt_mara
WHERE matnr = lt_mara-matnr
AND werks IN s_pwwrk.
SORT lt_marc_all BY matnr werks.
*获取所有物料描述
SELECT matnr maktx INTO TABLE lt_makt FROM makt
FOR ALL ENTRIES IN lt_mara
WHERE matnr = lt_mara-matnr
AND spras = sy-langu.
SORT lt_makt BY matnr.
SELECT matnr,mstae,mtart,matkl INTO TABLE @DATA(lt_mstae)
FROM mara
FOR ALL ENTRIES IN @lt_mara
WHERE matnr = @lt_mara-matnr.
SORT lt_mstae BY matnr.
ENDIF.
IF gt_out[] IS NOT INITIAL.
SELECT idnrk,
alpgr2,
alpgr
INTO TABLE @DATA(lt_ztpp0002)
FROM ztpp0002
FOR ALL ENTRIES IN @gt_out
WHERE idnrk = @gt_out-idnrk.
SORT lt_ztpp0002 BY idnrk.
SELECT mkal~matnr,
mkal~werks,
mkal~verid,
mkal~text1,
mkal~adatu,
mkal~stlan,"BOM用途
plko~verwe,"工艺路线用途
mkal~prfg_f,
mkal~prfg_s
INTO TABLE @DATA(lt_mkal_ver)
FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
mkal~plnnr = plko~plnnr AND
mkal~alnal = plko~plnal
* INNER JOIN plpo ON plko~plnty = plpo~plnty AND
* plko~plnnr = plpo~plnnr AND
* plko~zaehl = plpo~zaehl
FOR ALL ENTRIES IN @gt_out
WHERE mkal~matnr = @gt_out-idnrk AND
mkal~werks = @gt_out-pwwrk AND
mkal~bdatu >= @sy-datum AND
mkal~adatu <= @sy-datum AND
plko~loekz = ''.
SORT lt_mkal_ver BY matnr werks adatu DESCENDING.
ENDIF.
* IF lt_objkt[] IS NOT INITIAL.
* SELECT a~aennr a~objkt a~revlv b~datuv INTO TABLE lt_aeoi
* FROM aeoi AS a INNER JOIN aenr AS b ON a~aennr = b~aennr
* FOR ALL ENTRIES IN lt_objkt
* WHERE a~objkt = lt_objkt-objkt
* AND a~aetyp = '41'.
* SORT lt_aeoi BY objkt datuv DESCENDING.
* ENDIF.
LOOP AT gt_out.
*获取对应的物料描述
READ TABLE lt_makt WITH KEY matnr = gt_out-matnr BINARY SEARCH.
IF sy-subrc = 0.
gt_out-maktx = lt_makt-maktx.
ENDIF.
READ TABLE lt_makt WITH KEY matnr = gt_out-matnr1 BINARY SEARCH.
IF sy-subrc = 0.
gt_out-maktx1 = lt_makt-maktx.
ENDIF.
READ TABLE lt_makt WITH KEY matnr = gt_out-idnrk BINARY SEARCH.
IF sy-subrc = 0.
gt_out-maktx2 = lt_makt-maktx.
ENDIF.
READ TABLE lt_mstae INTO DATA(lw_mstae) WITH KEY matnr = gt_out-idnrk BINARY SEARCH.
IF sy-subrc EQ 0.
gt_out-mstae = lw_mstae-mstae.
gt_out-mtart = lw_mstae-mtart.
DATA(lv_matkl) = lw_mstae-matkl.
ENDIF.
READ TABLE lt_marc_all WITH KEY matnr = gt_out-matnr1
werks = gt_out-werks BINARY SEARCH.
IF sy-subrc = 0.
gt_out-dispo1 = lt_marc_all-dispo. "上层物料MRP控制者
ENDIF.
CASE p_auart.
WHEN 'ZP01'.
lv_stlan = '1'.
lv_verwe = '1'.
WHEN 'ZP02'.
lv_stlan = '2'.
lv_verwe = '1'.
WHEN 'ZP03'.
lv_stlan = '3'.
lv_verwe = '1'.
WHEN 'ZP08'.
lv_stlan = 'Y'.
lv_verwe = 'Y'.
WHEN 'ZP09'.
lv_stlan = 'Y'.
lv_verwe = 'Y'.
WHEN OTHERS.
ENDCASE.
READ TABLE lt_mkal_ver INTO DATA(lw_mkal_ver) WITH KEY matnr = gt_out-idnrk werks = gt_out-pwwrk stlan = lv_stlan verwe = lv_verwe ."BINARY SEARCH.
IF sy-subrc EQ 0.
gt_out-verid = lw_mkal_ver-verid.
gt_out-text1 = lw_mkal_ver-text1.
gt_out-stlan = lw_mkal_ver-stlan.
gt_out-verwe = lw_mkal_ver-verwe.
gt_out-prfg_f = lw_mkal_ver-prfg_f.
gt_out-prfg_s = lw_mkal_ver-prfg_s.
ENDIF.
*获取MRP控制者
READ TABLE lt_marc_all WITH KEY matnr = gt_out-matnr
werks = gt_out-werks BINARY SEARCH.
IF sy-subrc = 0.
gt_out-dispo = lt_marc_all-dispo.
ENDIF.
READ TABLE lt_marc_all WITH KEY matnr = gt_out-idnrk
werks = gt_out-werks BINARY SEARCH.
IF sy-subrc = 0.
gt_out-dispo2 = lt_marc_all-dispo. "组件MRP控制者
gt_out-dispo = lt_marc_all-dispo.
gt_out-bstmi = lt_marc_all-bstmi.
gt_out-bstrf = lt_marc_all-bstrf.
gt_out-plifz = lt_marc_all-plifz.
ENDIF.
*
* CLEAR:lv_objkt.
* lv_objkt = gt_out-idnrk.
* READ TABLE lt_aeoi WITH KEY objkt = lv_objkt BINARY SEARCH.
* IF sy-subrc = 0.
* LOOP AT lt_aeoi FROM sy-tabix WHERE objkt = lv_objkt.
* IF lt_aeoi-datuv <= sy-datum.
* gt_out-revlv = lt_aeoi-revlv.
* EXIT.
* ENDIF.
* ENDLOOP.
* ENDIF.
CLEAR:lv_alpgr2,lv_alpgr.
READ TABLE lt_ztpp0002 INTO DATA(lw_ztpp0002) WITH KEY idnrk = gt_out-idnrk BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT lt_ztpp0002 INTO lw_ztpp0002 FROM sy-tabix.
IF lw_ztpp0002-idnrk <> gt_out-idnrk.
EXIT.
ENDIF.
lv_alpgr2 = lv_alpgr2 && lw_ztpp0002-alpgr2.
lv_alpgr = lv_alpgr && lw_ztpp0002-alpgr.
ENDLOOP.
ENDIF.
gt_out-alpgr2 = lv_alpgr2.
IF lv_alpgr IS NOT INITIAL.
gt_out-alpgr = lv_alpgr.
ENDIF.
IF gt_out-stufe = '0'.
gt_out-stufex = '.' && gt_out-stufex.
ELSE.
DO gt_out-stufe TIMES.
gt_out-stufex = '.' && gt_out-stufex.
ENDDO.
ENDIF.
gt_out-stufex = gt_out-stufex && gt_out-stufe.
IF gt_out-stufex <> '.0'.
CLEAR:gt_out-plnum.
ENDIF.
MODIFY gt_out.
IF lv_matkl = 'BC-DZ-SL' OR "烧录芯片:BC-DZ-SL 单独开工单
lv_matkl = 'BC-XN-A'.
CLEAR:lv_matkl.
CONTINUE.
ENDIF.
IF gt_out-alpgr IS NOT INITIAL.
IF gt_out-ewahr EQ '0'.
CONTINUE.
ENDIF.
ENDIF.
"剔除外购 委外数据
READ TABLE lt_marc_all WITH KEY matnr = gt_out-idnrk
werks = gt_out-werks BINARY SEARCH.
IF sy-subrc = 0 AND lt_marc_all-beskz = 'F'.
CONTINUE.
ENDIF.
IF gt_out-dumps = 'X' OR gt_out-dumps = 'x'."剔除虚拟件
CONTINUE.
ENDIF.
IF gt_out-idnrk IS INITIAL.
CONTINUE.
ELSEIF gt_out-stufex = '.0'.
ELSEIF gt_out-mtart = 'Z002' OR gt_out-mtart = 'Z003'.
ELSE.
CONTINUE.
ENDIF.
IF p_xc = '' AND gt_out-stufex <> '.0'.
CONTINUE.
ENDIF.
gt_alv[] = VALUE #( BASE gt_alv ( status = ''
stufe = gt_out-stufex
zzorder = ''
aufnr = ''
auart = p_auart
txt = lv_txt
zztxt = ''
matnr = gt_out-idnrk
maktx = gt_out-maktx2
matnr1 = gt_out-matnr1
maktx1 = gt_out-maktx1
verid = gt_out-verid
text1 = gt_out-text1
plnum = gt_out-plnum
pwwrk = gt_out-pwwrk
pertr = gt_out-pertr
psttr = gt_out-psttr
pedtr = gt_out-pedtr
gsmng = gt_out-gsmng
meins = gt_out-meins
dispo = gt_out-dispo
fevor = gt_out-fevor
alpgr = gt_out-alpgr
menge_bc = gt_out-menge_bc
prfg_f = gt_out-prfg_f
prfg_s = gt_out-prfg_s
mtart = gt_out-mtart
matnr_top = gt_out-matnr_top
number_top = gt_out-number_top
number = gt_out-number ) ).
ENDLOOP.
gt_alv_temp[] = gt_alv[].
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
DATA:g_repid TYPE sy-repid.
g_repid = sy-repid.
"g_layout-zebra = 'X' .
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
gs_layout-no_rowins = 'X'.
gs_layout-box_fname = 'SEL'.
CLEAR gt_fieldcat[].
PERFORM frm_generate_field_catalogu.
gt_event-name = 'CALLER_EXIT'.
gt_event-form = 'FM_BUTTON'.
APPEND gt_event .
gt_event-name = 'CALLER_EXIT'.
gt_event-form = 'FRM_CALLER_EXIT'.
APPEND gt_event.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF'
i_callback_user_command = 'USER_COM'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
it_events = gt_event[]
TABLES
t_outtab = gt_alv
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.
*&---------------------------------------------------------------------*
*& Form SET_PF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_pf USING extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "SET_PF
*&---------------------------------------------------------------------*
*& Form user_com
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM user_com USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA: gd_repid LIKE sy-repid,
ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:lv_answer.
DATA:lv_lines TYPE i.
DATA:lv_type TYPE bapi_mtype,
lv_msg TYPE bapi_msg.
IF ref_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
ENDIF.
IF NOT ref_grid IS INITIAL.
CALL METHOD ref_grid->check_changed_data.
ENDIF.
CASE r_ucomm.
WHEN '&BACK' OR '&EXIT' OR '&EXIT'.
LOOP AT gt_plaf INTO DATA(lw_plaf).
CALL FUNCTION 'DEQUEUE_EZPLNUM'
EXPORTING
mode_plaf = 'E'
mandt = sy-mandt
plnum = lw_plaf-plnum.
ENDLOOP.
LEAVE TO SCREEN 0.
WHEN '&IC1'.
IF rs_selfield-fieldname = 'AUFNR'.
READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
IF sy-subrc EQ 0 AND gw_alv-aufnr IS NOT INITIAL.
SET PARAMETER ID 'ANR' FIELD gw_alv-aufnr.
CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
ENDIF.
ELSEIF rs_selfield-fieldname = 'ZZORDER'.
READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
IF sy-subrc EQ 0 AND gw_alv-zzorder IS NOT INITIAL.
SET PARAMETER ID 'ANR' FIELD gw_alv-zzorder.
CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
ENDIF.
ELSEIF rs_selfield-fieldname = 'STUFE'.
READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
IF sy-subrc EQ 0 AND gw_alv-stufe = '.0'.
PERFORM frm_collapse_alv .
ENDIF.
ENDIF.
WHEN '&CREATE'.
CLEAR:lv_type,lv_msg.
CLEAR:lv_lines,lv_answer.
READ TABLE gt_alv INTO DATA(lw_alv) WITH KEY sel = 'X' stufe = '.0'.
IF sy-subrc NE 0.
MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
ENDIF.
lv_lines = REDUCE i( INIT x = 0 FOR lsa_alv IN gt_alv WHERE ( sel = 'X' AND stufe = '.0' ) NEXT x = x + 1 ).
IF lv_lines >= 2.
MESSAGE '只能选一行进行操作' TYPE 'E'.
ENDIF.
PERFORM frm_check_data CHANGING lv_type lv_msg.
IF lv_type = 'E'.
MESSAGE lv_msg TYPE lv_type.
ENDIF.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = '确认创建订单'
titel = '提示'
cancel_display = ''
IMPORTING
answer = lv_answer.
IF lv_answer = 'J'.
PERFORM frm_save_data.
ENDIF.
WHEN '&INSERT'.
READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' stufe = '.0'.
IF sy-subrc NE 0.
MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
ENDIF.
CLEAR:lv_lines,lv_answer.
lv_lines = REDUCE i( INIT x = 0 FOR ls_alv IN gt_alv WHERE ( sel = 'X' AND stufe = '.0' ) NEXT x = x + 1 ).
IF lv_lines >= 2.
MESSAGE '只能选一行进行操作' TYPE 'E'.
ENDIF.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = '确认是否新增计划行'
titel = '提示'
cancel_display = ''
IMPORTING
answer = lv_answer.
IF lv_answer = 'J'.
PERFORM frm_insert_data USING lw_alv.
ENDIF.
WHEN '&DELETE'.
READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' stufe = '.0'.
IF sy-subrc NE 0.
MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
ENDIF.
CLEAR:lv_lines,lv_answer.
lv_lines = REDUCE i( INIT x = 0 FOR la_alv IN gt_alv WHERE ( sel = 'X' AND stufe = '.0' ) NEXT x = x + 1 ).
IF lv_lines >= 2.
MESSAGE '只能选一行进行操作' TYPE 'E'.
ENDIF.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = '确认删除计划行'
titel = '提示'
cancel_display = ''
IMPORTING
answer = lv_answer.
IF lv_answer = 'J'.
PERFORM frm_delete_data USING lw_alv.
ENDIF.
WHEN '&PLGX'.
CLEAR:lv_answer.
READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' .
IF sy-subrc NE 0.
MESSAGE '请选择数据行进行操作' TYPE 'E'.
ENDIF.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = '确认批量更新行'
titel = '提示'
cancel_display = ''
IMPORTING
answer = lv_answer.
IF lv_answer = 'J'.
PERFORM frm_plgx_data .
ENDIF.
DATA stbl TYPE lvc_s_stbl.
DATA(lv_stlan) = VALUE mkal-stlan( ).
DATA(lv_verwe) = VALUE plko-verwe( ).
* 生产订单ZP01 对应BOM用途1,工艺路线用途1
* 生产订单ZP02 对应BOM用途2,工艺路线用途1
* 生产订单ZP03 对应BOM用途3,工艺路线用途1
* 生产订单ZP08 对应BOM用途Y,工艺路线用途Y
* 生产订单ZP09 对应BOM用途Y,工艺路线用途Y
IF gt_alv[] IS NOT INITIAL.
SELECT * INTO TABLE @DATA(lt_ztpp0020)
FROM ztpp0020
FOR ALL ENTRIES IN @gt_alv
WHERE fevor = @gt_alv-fevor.
SORT lt_ztpp0020 BY fevor.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
READ TABLE lt_ztpp0020 INTO DATA(lw_ztpp0020) WITH KEY fevor = <fs_alv>-fevor BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_alv>-arbpl = lw_ztpp0020-arbpl.
ENDIF.
ENDLOOP.
SELECT mkal~matnr,
mkal~werks,
mkal~verid,
mkal~text1,
mkal~adatu,
mkal~stlan,"BOM用途
plko~verwe,"工艺路线用途
crhd~arbpl,
mkal~prfg_f,
mkal~prfg_s
INTO TABLE @DATA(lt_mkal)
FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
mkal~plnnr = plko~plnnr AND
mkal~alnal = plko~plnal
INNER JOIN plpo ON plpo~plnty = plko~plnty AND
plpo~plnnr = plko~plnnr AND
plpo~zaehl = plko~zaehl
INNER JOIN crhd ON crhd~objid = plpo~arbid AND crhd~objty = 'A'
FOR ALL ENTRIES IN @gt_alv
WHERE mkal~matnr = @gt_alv-matnr AND
mkal~werks = @gt_alv-pwwrk AND
crhd~arbpl = @gt_alv-arbpl AND
mkal~bdatu >= @sy-datum AND
mkal~adatu <= @sy-datum AND
plko~loekz = ''.
SORT lt_mkal BY matnr werks arbpl DESCENDING.
LOOP AT gt_alv ASSIGNING <fs_alv>.
* IF <fs_alv>-auart <> p_auart.
CASE <fs_alv>-auart.
WHEN 'ZP01'.
lv_stlan = '1'.
lv_verwe = '1'.
WHEN 'ZP02'.
lv_stlan = '2'.
lv_verwe = '1'.
WHEN 'ZP03'.
lv_stlan = '3'.
lv_verwe = '1'.
WHEN 'ZP08'.
lv_stlan = 'Y'.
lv_verwe = 'Y'.
WHEN 'ZP09'.
lv_stlan = 'Y'.
lv_verwe = 'Y'.
WHEN OTHERS.
ENDCASE.
* ENDIF.
READ TABLE lt_mkal INTO DATA(lw_mkal) WITH KEY matnr = <fs_alv>-matnr werks = <fs_alv>-pwwrk arbpl = <fs_alv>-arbpl." BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_alv>-verid = lw_mkal-verid.
<fs_alv>-text1 = lw_mkal-text1.
<fs_alv>-prfg_f = lw_mkal-prfg_f.
<fs_alv>-prfg_s = lw_mkal-prfg_s.
* IF lv_stlan <> lw_mkal-stlan OR lv_verwe <> lw_mkal-verwe.
* CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
* ENDIF.
ELSE.
CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
ENDIF.
IF <fs_alv>-aufnr IS NOT INITIAL OR <fs_alv>-zzorder IS NOT INITIAL..
ELSE.
IF <fs_alv>-verid IS INITIAL..
<fs_alv>-bapi_mtype = 'E'.
<fs_alv>-bapi_msg = '找不到生产版本'.
ELSE.
CLEAR:<fs_alv>-bapi_mtype,<fs_alv>-bapi_msg .
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
stbl-row = 'X'." 基于行的稳定刷新
stbl-col = 'X'." 基于列稳定刷新
CALL METHOD ref_grid->refresh_table_display
EXPORTING
is_stable = stbl.
WHEN OTHERS.
ENDCASE.
rs_selfield-refresh = 'X'.
ENDFORM. "USER_COM
*&---------------------------------------------------------------------*
*& Form FRM_GENERATE_FIELD_CATALOGU
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_generate_field_catalogu.
DEFINE def_modify_fieldcat.
&1-scrtext_l = &2.
&1-scrtext_m = &2.
&1-reptext = &2.
&1-scrtext_s = &2.
END-OF-DEFINITION.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
CHANGING t_table = gt_alv ).
gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = salv_table->get_columns( )
r_aggregations = salv_table->get_aggregations( ) ).
CATCH cx_root.
ENDTRY.
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
CASE <fs_filedcat>-fieldname.
WHEN 'STATUS'.
def_modify_fieldcat <fs_filedcat> '状态'.
<fs_filedcat>-icon = 'X'.
<fs_filedcat>-no_out = 'X'.
WHEN 'SEL'OR 'NUMBER' OR 'NUMBER_TOP' OR 'MATNR_TOP' OR 'MTART' OR 'MENGE_BC' OR 'ARBPL'. "'PRFG_F' OR 'PRFG_S' .
<fs_filedcat>-no_out = 'X'.
WHEN 'STUFE'.
<fs_filedcat>-hotspot = 'X'.
def_modify_fieldcat <fs_filedcat> 'BOM层级'.
WHEN 'BAPI_MTYPE'.
def_modify_fieldcat <fs_filedcat> '消息'.
WHEN 'BAPI_MSG'.
def_modify_fieldcat <fs_filedcat> '消息文本'.
WHEN 'STUFE'.
def_modify_fieldcat <fs_filedcat> '层级'.
WHEN 'MATNR1'.
<fs_filedcat>-no_out = 'X'.
def_modify_fieldcat <fs_filedcat> '上层物料'.
WHEN 'MAKTX1'.
<fs_filedcat>-no_out = 'X'.
def_modify_fieldcat <fs_filedcat> '上层物料描述'.
WHEN 'MATNR'.
def_modify_fieldcat <fs_filedcat> '组件物料'.
WHEN 'MAKTX'.
def_modify_fieldcat <fs_filedcat> '组件物料描述'.
WHEN 'GSMNG'.
<fs_filedcat>-edit = 'X'.
def_modify_fieldcat <fs_filedcat> '订货数量'.
WHEN 'DISPO'.
* <fs_filedcat>-ref_field = 'DISPO'.
* <fs_filedcat>-ref_table = 'PLAF'.
<fs_filedcat>-f4availabl = 'X'.
<fs_filedcat>-edit = 'X'.
WHEN 'FEVOR'.
<fs_filedcat>-edit = 'X'.
<fs_filedcat>-f4availabl = 'X'.
WHEN 'AUART' .
<fs_filedcat>-ref_field = 'AUART'.
<fs_filedcat>-ref_table = 'T003P'.
<fs_filedcat>-edit = 'X'.
WHEN 'PSTTR'.
<fs_filedcat>-ref_field = 'DATUM'.
<fs_filedcat>-ref_table = 'SYST'.
<fs_filedcat>-edit = 'X'.
WHEN 'PEDTR'.
<fs_filedcat>-ref_field = 'DATUM'.
<fs_filedcat>-ref_table = 'SYST'.
<fs_filedcat>-edit = 'X'.
WHEN 'ZZTXT'.
<fs_filedcat>-edit = 'X'.
WHEN 'PRFG_F'.
def_modify_fieldcat <fs_filedcat> '工艺路线状态'.
WHEN 'PRFG_S'.
def_modify_fieldcat <fs_filedcat> 'BOM状态'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_save_data .
DATA:ls_ret TYPE bapireturn1,
ls_return TYPE bapiret2,
lv_order_number TYPE aufnr.
DATA:lr_auart TYPE RANGE OF aufk-auart.
DATA:lt_alv TYPE ty_basic.
DATA:lv_type TYPE bapi_mtype.
BREAK yangtao.
DATA:lv_aufnr TYPE aufnr.
DATA:header_in TYPE bapi_pp_order_create.
DATA:lt_table TYPE TABLE OF zsfmpp_create_order_table .
DATA:lv_guid TYPE guid_32.
DATA:lt_ztpp0019 TYPE TABLE OF ztpp0019.
DEFINE dfe_append_auart.
APPEND VALUE #( sign = 'I' option = 'EQ' low = &1 ) TO lr_auart.
END-OF-DEFINITION.
dfe_append_auart 'ZP04'.
dfe_append_auart 'ZP05'.
dfe_append_auart 'ZP06'.
dfe_append_auart 'ZP07'.
dfe_append_auart 'ZP10'.
DATA(gt_temp) = gt_alv[].
LOOP AT gt_alv INTO gw_alv WHERE sel = 'X' AND aufnr IS INITIAL.
READ TABLE lt_alv INTO DATA(lw_alv) WITH KEY number_top = gw_alv-number_top.
IF sy-subrc NE 0.
LOOP AT gt_temp INTO DATA(lw_temp) WHERE number_top = gw_alv-number_top..
APPEND INITIAL LINE TO lt_alv ASSIGNING FIELD-SYMBOL(<fs_lv_alv>).
MOVE-CORRESPONDING lw_temp TO <fs_lv_alv>.
ENDLOOP.
ENDIF.
ENDLOOP.
DATA:lv_answer,
lv_ms TYPE ctu_mode.
"DELETE lt_alv WHERE sel = 'X'.
LOOP AT lt_alv INTO lw_alv GROUP BY ( number_top = lw_alv-number_top
size = GROUP SIZE
index = GROUP INDEX )
ASCENDING ASSIGNING FIELD-SYMBOL(<lt_group>).
* 生产订单ZP01 对应BOM用途1,工艺路线用途1
* 生产订单ZP02 对应BOM用途2,工艺路线用途1
* 生产订单ZP03 对应BOM用途3,工艺路线用途1
* 生产订单ZP08 对应BOM用途Y,工艺路线用途Y
* 生产订单ZP09 对应BOM用途Y,工艺路线用途Y
* 生产订单类型ZP04、ZP05、ZP06、ZP07、ZP10不能创建下层生产订单
REFRESH:lt_table,lt_ztpp0019.
CLEAR:lv_guid.
LOOP AT GROUP <lt_group> ASSIGNING FIELD-SYMBOL(<fs_group>) .
READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WITH KEY number = <fs_group>-number." matnr = <fs_group>-matnr_top.
IF sy-subrc EQ 0.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = lv_guid.
CATCH cx_uuid_error .
ENDTRY.
CLEAR:lv_ms,lv_answer.
IF <fs_group>-stufe = '.0'.
CALL FUNCTION 'DEQUEUE_EZPLNUM'
EXPORTING
mode_plaf = 'E'
mandt = sy-mandt
plnum = <fs_group>-plnum.
* ls_input = VALUE #( guid = lv_guid
* number = <fs_group>-number
* plnum = <fs_group>-plnum
* gsmng = <fs_group>-gsmng
* verid = <fs_group>-verid
* psttr = <fs_group>-psttr
* pedtr = <fs_group>-pedtr
* auart = <fs_group>-auart
* zztxt = <fs_group>-zztxt ).
* CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
* EXPORTING
* textline1 = '前台模式创建还是后台模式创建'
* titel = '提示'
* cancel_display = ''
* IMPORTING
* answer = lv_answer.
* IF lv_answer = 'J'.
* lv_ms = 'A'.
* ELSE.
* lv_ms = 'N'.
* ENDIF.
" PERFORM frm_set_co48 USING lv_ms <fs_group>-plnum <fs_group>-auart <fs_group>-gsmng CHANGING lv_order_number ls_return.
DATA:lv_gsmng TYPE plaf-gsmng,
lv_gsmng_temp TYPE plaf-gsmng.
SELECT SINGLE gsmng INTO lv_gsmng FROM plaf WHERE plnum = <fs_group>-plnum.
IF lv_gsmng - <fs_group>-gsmng EQ 0 .
CALL FUNCTION 'BAPI_PLANNEDORDER_DELETE'
EXPORTING
plannedorder = <fs_group>-plnum
IMPORTING
return = ls_ret.
ELSE.
lv_gsmng_temp = lv_gsmng - <fs_group>-gsmng.
CALL FUNCTION 'BAPI_PLANNEDORDER_CHANGE'
EXPORTING
plannedorder = <fs_group>-plnum
headerdata = VALUE bapiplaf_i2(
total_plord_qty = lv_gsmng_temp
version = <fs_group>-verid
order_start_date = <fs_group>-psttr
order_fin_date = <fs_group>-pedtr
plan_open_date = <fs_group>-psttr "未清日期
firming_ind = 'X' " 标识必打,不然转单bapi报错
conversion_ind = 'X' ) " 标识必打,不然转单bapi报错
headerdatax = VALUE bapiplaf_i2x(
total_plord_qty = 'X'
version = 'X'
order_start_date = 'X'
order_fin_date = 'X'
plan_open_date = 'X'
firming_ind = 'X'
conversion_ind = 'X' )
IMPORTING
return = ls_ret.
ENDIF.
IF ls_ret-type CA 'AEX'.
<fs_alv>-bapi_mtype = ls_ret-type.
<fs_alv>-bapi_msg = |计划订单修改报错:{ ls_ret-message }|..
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
zzorder = ''
aufnr = ''
znumber = ''
zztxt = ''
bapi_mtype = <fs_alv>-bapi_mtype
bapi_msg = <fs_alv>-bapi_msg ) ).
EXIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
<fs_alv>-bapi_mtype = 'S'.
<fs_alv>-bapi_msg = |计划订单修改成功:{ ls_ret-message }|.
lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
zzorder = ''
aufnr = ''
znumber = ''
zztxt = ''
bapi_mtype = <fs_alv>-bapi_mtype
bapi_msg = <fs_alv>-bapi_msg ) ).
CLEAR:header_in,lv_order_number,ls_return.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_group>-matnr
IMPORTING
output = header_in-material.
header_in-plant = <fs_group>-pwwrk."工厂
header_in-order_type = <fs_group>-auart."
header_in-quantity = <fs_group>-gsmng."订单数量总计
header_in-basic_start_date = <fs_group>-psttr."基本开始日期
header_in-basic_end_date = <fs_group>-pedtr."基本完成日期
header_in-prod_version = <fs_group>-verid."生产版本
SET UPDATE TASK LOCAL.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = header_in
IMPORTING
order_number = lv_order_number
return = ls_return.
ENDIF.
" Create BAPI_PRODORD_CREATE
* CALL FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
* EXPORTING
* planned_order = <fs_group>-plnum
* order_type = <fs_group>-auart
* IMPORTING
* production_order = lv_order_number
* return = ls_return.
IF lv_order_number IS INITIAL.
<fs_alv>-bapi_mtype = ls_return-type.
<fs_alv>-bapi_msg = |创建生产订单报错:{ ls_return-message }|.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
stufe = <fs_group>-stufe
zzorder = <fs_group>-plnum
aufnr = lv_order_number
auart = <fs_group>-auart
txt = <fs_group>-txt
matnr1 = <fs_group>-matnr1
maktx1 = <fs_group>-maktx1
matnr = <fs_group>-matnr
maktx = <fs_group>-maktx
verid = <fs_group>-verid
text1 = <fs_group>-text1
plnum = <fs_group>-plnum
pwwrk = <fs_group>-pwwrk
pertr = <fs_group>-pertr
psttr = <fs_group>-psttr
pedtr = <fs_group>-pedtr
gsmng = <fs_group>-gsmng
meins = <fs_group>-meins
dispo = <fs_group>-dispo
fevor = <fs_group>-fevor
zztxt = <fs_group>-zztxt
mtart = <fs_group>-mtart
alpgr = <fs_group>-alpgr
* stlan = <fs_group>-stlan
* verwe = <fs_group>-verwe
prfg_f = <fs_group>-prfg_f
prfg_s = <fs_group>-prfg_s
menge_bc = <fs_group>-menge_bc
matnr_top = <fs_group>-matnr_top
number_top = <fs_group>-number_top
znumber = <fs_group>-number
datum = sy-datum
uzeit = sy-uzeit
bapi_mtype = <fs_alv>-bapi_mtype
bapi_msg = <fs_alv>-bapi_msg ) ).
EXIT.
ELSE.
<fs_alv>-bapi_mtype = 'S'.
<fs_alv>-bapi_msg = |生产订单创建成功,订单号:{ lv_order_number }|.
<fs_alv>-zzorder = lv_order_number.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
PERFORM frm_set_order_to_aufnr USING lv_order_number <fs_group>-plnum <fs_group>-fevor <fs_group>-dispo <fs_group>-zztxt.
ENDIF.
lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
stufe = <fs_group>-stufe
zzorder = <fs_group>-plnum
aufnr = lv_order_number
auart = <fs_group>-auart
txt = <fs_group>-txt
matnr1 = <fs_group>-matnr1
maktx1 = <fs_group>-maktx1
matnr = <fs_group>-matnr
maktx = <fs_group>-maktx
verid = <fs_group>-verid
text1 = <fs_group>-text1
plnum = <fs_group>-plnum
pwwrk = <fs_group>-pwwrk
pertr = <fs_group>-pertr
psttr = <fs_group>-psttr
pedtr = <fs_group>-pedtr
gsmng = <fs_group>-gsmng
meins = <fs_group>-meins
dispo = <fs_group>-dispo
fevor = <fs_group>-fevor
zztxt = <fs_group>-zztxt
mtart = <fs_group>-mtart
alpgr = <fs_group>-alpgr
* stlan = <fs_group>-stlan
* verwe = <fs_group>-verwe
prfg_f = <fs_group>-prfg_f
prfg_s = <fs_group>-prfg_s
menge_bc = <fs_group>-menge_bc
matnr_top = <fs_group>-matnr_top
number_top = <fs_group>-number_top
znumber = <fs_group>-number
datum = sy-datum
uzeit = sy-uzeit
bapi_mtype = <fs_alv>-bapi_mtype
bapi_msg = <fs_alv>-bapi_msg ) ).
CALL FUNCTION 'ENQUEUE_EZPLNUM'
EXPORTING
mode_plaf = 'E'
mandt = sy-mandt
plnum = <fs_group>-plnum
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
IF "( <fs_group>-mtart = 'Z002' OR <fs_group>-mtart = 'Z003' )
<fs_group>-stufe <> '.0'
AND <fs_group>-auart NOT IN lr_auart.
IF p_xc = 'X' ."AND <fs_alv>-matnr <> <fs_alv>-matnr_top.
* lt_table[] = VALUE #( BASE lt_table ( guid = lv_guid
* number = <fs_group>-number
* matnr = <fs_group>-matnr
* werks = <fs_group>-pwwrk
* auart = <fs_group>-auart
* gsmng = <fs_group>-gsmng
* psttr = <fs_group>-psttr
* pedtr = <fs_group>-pedtr
* verid = <fs_group>-verid
* zztxt = <fs_group>-zztxt ) ).
CLEAR:header_in,lv_aufnr,ls_return.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_group>-matnr
IMPORTING
output = header_in-material.
header_in-plant = <fs_group>-pwwrk."工厂
header_in-order_type = <fs_group>-auart."
header_in-quantity = <fs_group>-gsmng."订单数量总计
header_in-basic_start_date = <fs_group>-psttr."基本开始日期
header_in-basic_end_date = <fs_group>-pedtr."基本完成日期
header_in-prod_version = <fs_group>-verid."生产版本
SET UPDATE TASK LOCAL.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = header_in
IMPORTING
order_number = lv_aufnr
return = ls_return.
IF lv_aufnr <> '' AND ls_return IS INITIAL . "订单创建成功
<fs_alv>-bapi_mtype = 'S'.
<fs_alv>-bapi_msg = '订单创建成功 '.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
lv_aufnr = |{ lv_aufnr ALPHA = IN }|.
<fs_alv>-aufnr = lv_aufnr.
<fs_alv>-zzorder = lv_order_number.
PERFORM frm_set_order_to_aufnr USING lv_aufnr lv_order_number <fs_group>-fevor <fs_group>-dispo <fs_group>-zztxt.
" PERFORM frm_change_order_arbpl USING lv_aufnr <fs_group>-arbpl CHANGING <fs_alv>-bapi_mtype <fs_alv>-bapi_msg .
ELSE.
<fs_alv>-bapi_msg = '订单创建失败。' && ls_return-message.
<fs_alv>-bapi_mtype = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
stufe = <fs_group>-stufe
zzorder = lv_order_number
aufnr = lv_aufnr
auart = <fs_group>-auart
txt = <fs_group>-txt
matnr1 = <fs_group>-matnr1
maktx1 = <fs_group>-maktx1
matnr = <fs_group>-matnr
maktx = <fs_group>-maktx
verid = <fs_group>-verid
text1 = <fs_group>-text1
plnum = <fs_group>-plnum
pwwrk = <fs_group>-pwwrk
pertr = <fs_group>-pertr
psttr = <fs_group>-psttr
pedtr = <fs_group>-pedtr
gsmng = <fs_group>-gsmng
meins = <fs_group>-meins
dispo = <fs_group>-dispo
fevor = <fs_group>-fevor
zztxt = <fs_group>-zztxt
mtart = <fs_group>-mtart
alpgr = <fs_group>-alpgr
* stlan = <fs_group>-stlan
* verwe = <fs_group>-verwe
prfg_f = <fs_group>-prfg_f
prfg_s = <fs_group>-prfg_s
menge_bc = <fs_group>-menge_bc
matnr_top = <fs_group>-matnr_top
number_top = <fs_group>-number_top
znumber = <fs_group>-number
datum = sy-datum
uzeit = sy-uzeit
bapi_mtype = <fs_alv>-bapi_mtype
bapi_msg = <fs_alv>-bapi_msg ) ).
" PERFORM frm_create_order USING lv_order_number <fs_group>-number CHANGING <fs_alv> lv_type .
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
* CALL FUNCTION 'ZFMPP_CREATE_ORDER' "IN UPDATE TASK
* EXPORTING
* input = ls_input
* TABLES
* t_out = lt_table.
*
* IF lt_table[] IS NOT INITIAL.
*
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
*
* ELSE.
*
* ENDIF.
ENDLOOP.
IF lt_ztpp0019[] IS NOT INITIAL.
MODIFY ztpp0019 FROM TABLE lt_ztpp0019[].
COMMIT WORK AND WAIT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_ORDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <FS_ALV>
*&---------------------------------------------------------------------*
FORM frm_create_order USING pv_scdd TYPE aufnr
pv_number TYPE numc10
CHANGING pv_alv LIKE ty_alv
pv_type TYPE bapi_mtype.
DATA:ls_return TYPE bapiret2,
lv_aufnr TYPE aufnr.
DATA:header_in TYPE bapi_pp_order_create.
CLEAR:header_in,lv_aufnr,ls_return.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = pv_alv-matnr
IMPORTING
output = header_in-material.
header_in-plant = pv_alv-pwwrk."工厂
header_in-order_type = pv_alv-auart."
header_in-quantity = pv_alv-gsmng."订单数量总计
header_in-basic_start_date = pv_alv-psttr."基本开始日期
header_in-basic_end_date = pv_alv-pedtr." 基本完成日期
header_in-prod_version = pv_alv-verid."生产版本
SET UPDATE TASK LOCAL.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = header_in
IMPORTING
order_number = lv_aufnr
return = ls_return.
IF lv_aufnr <> '' AND ls_return IS INITIAL . "订单创建成功
lv_aufnr = |{ lv_aufnr ALPHA = IN }|.
gt_aufnr[] = VALUE #( BASE gt_aufnr ( number = pv_number aufnr = lv_aufnr ) ).
pv_type = 'S'.
pv_alv-aufnr = lv_aufnr.
pv_alv-zzorder = pv_scdd.
pv_alv-bapi_msg = '订单创建成功 '.
pv_alv-bapi_mtype = 'S '.
ELSE.
pv_alv-bapi_msg = '订单创建失败。' && ls_return-message.
pv_alv-bapi_mtype = 'E '.
pv_type = 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form fm_button
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
* EXPORTING
* IR_SALV_FULLSCREEN_ADAPTER =
IMPORTING
* ET_EXCLUDING =
* E_REPID =
* E_CALLBACK_PROGRAM =
* E_CALLBACK_ROUTINE =
e_grid = ref_grid
* ET_FIELDCAT_LVC =
* ER_TRACE =
* E_FLG_NO_HTML =
* ES_LAYOUT_KKBLO =
* ES_SEL_HIDE =
* ET_EVENT_EXIT =
* ER_FORM_TOL =
* ER_FORM_EOL =
.
* CALL METHOD ref_grid->check_changed_data.
* 设置enter事件
CALL METHOD ref_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CREATE OBJECT gt_event_receiver.
SET HANDLER gt_event_receiver->handle_modify FOR ref_grid.
ENDFORM. "FM_BUTTON
*&---------------------------------------------------------------------*
*& Form frm_insert_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_insert_data USING pv_alv LIKE ty_alv.
PERFORM frm_clear_data.
gv_matnr = pv_alv-matnr.
gv_maktx = pv_alv-maktx.
gv_psttr = pv_alv-psttr.
gv_pedtr = pv_alv-pedtr.
gv_gsmng_total = pv_alv-gsmng.
gv_werks = pv_alv-pwwrk.
gv_plnum = pv_alv-plnum.
gv_number = pv_alv-number.
gv_number_top = pv_alv-number_top.
gv_gsmng = '0'.
REFRESH gt_tab.
gt_tab[] = VALUE #( BASE gt_tab ( plnum = pv_alv-plnum
pwwrk = pv_alv-pwwrk
gsmng = pv_alv-gsmng
) ).
CALL SCREEN 9000 STARTING AT 5 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_delete_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_delete_data USING pv_alv LIKE ty_alv..
DELETE gt_alv WHERE number_top = pv_alv-number_top.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_TYPE
*& <-- LV_MSG
*&---------------------------------------------------------------------*
FORM frm_check_data CHANGING pv_type TYPE bapi_mtype
pv_msg TYPE bapi_msg.
TYPES:BEGIN OF tys_plaf,
plnum TYPE plaf-plnum,
END OF tys_plaf.
DATA:lwa_alv LIKE LINE OF gt_alv.
DATA:lt_plaf TYPE TABLE OF tys_plaf.
lt_plaf[] = VALUE #( FOR lw_alv IN gt_alv WHERE ( sel = 'X' AND plnum IS NOT INITIAL ) ( plnum = lw_alv-plnum ) ).
DATA:lv_menge TYPE menge_d.
SORT gt_plaf BY plnum.
LOOP AT lt_plaf INTO DATA(lw_plaf).
READ TABLE gt_plaf INTO DATA(gw_plaf) WITH KEY plnum = lw_plaf-plnum BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT gt_plaf INTO DATA(gs_plaf) FROM sy-tabix.
IF gs_plaf-plnum <> lw_plaf-plnum.
EXIT.
ENDIF.
lv_menge = REDUCE menge_d( INIT x = 0 FOR ls_alv IN gt_alv WHERE ( matnr1 = gw_plaf-matnr AND plnum = lw_plaf-plnum ) NEXT x = x + ls_alv-gsmng ).
IF lv_menge > gw_plaf-gsmng.
pv_msg = '合计数量超过了计划订单数量'.
pv_type = 'E'.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
lwa_alv = gt_alv[ sel = 'X' ].
LOOP AT gt_alv INTO DATA(la_alv)
WHERE number_top = lwa_alv-number_top AND
( fevor IS INITIAL OR dispo IS INITIAL OR verid IS INITIAL ).
IF la_alv-fevor IS INITIAL .
pv_msg = '车间产线不能为空'.
pv_type = 'E'.
EXIT.
ENDIF.
IF la_alv-dispo IS INITIAL .
pv_msg = 'MRP控制者不能为空'.
pv_type = 'E'.
EXIT.
ENDIF.
IF la_alv-verid IS INITIAL .
pv_msg = '生产版本不能为空'.
pv_type = 'E'.
EXIT.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ORDER_TO_AUFNR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_AUFNR
*& --> INPUT_ZZTXT
*&---------------------------------------------------------------------*
FORM frm_set_order_to_aufnr USING pv_aufnr TYPE aufnr
pv_plnum
pv_fevor TYPE fevor
pv_dispo TYPE dispo
pv_zztxt TYPE ze_zztxt.
CHECK pv_aufnr IS NOT INITIAL.
DO 10 TIMES.
SELECT COUNT(*) FROM aufk WHERE aufnr = pv_aufnr.
IF sy-subrc EQ 0.
DATA(lv_flag) = 'X'.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
IF lv_flag = 'X'.
UPDATE aufk SET zzorder = pv_plnum
zztxt = pv_zztxt
WHERE aufnr = pv_aufnr.
COMMIT WORK AND WAIT.
UPDATE afko SET fevor = pv_fevor
dispo = pv_dispo
WHERE aufnr = pv_aufnr.
COMMIT WORK AND WAIT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_f4_help_fevor
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ET_BAD_CELLS
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*& --> E_DISPLAY
*& --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_f4_help_fevor USING et_bad_cells TYPE lvc_t_modi
es_row_no TYPE lvc_s_roid
er_event_data TYPE REF TO cl_alv_event_data
"e_display TYPE c
e_fieldname TYPE lvc_fname.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
ls_return TYPE ddshretval.
DATA :lv_eqart TYPE eqart.
FIELD-SYMBOLS: <itab> TYPE lvc_t_modi.
DATA: ls_modi TYPE lvc_s_modi.
ASSIGN er_event_data->m_data->* TO <itab>.
IF e_fieldname = 'FEVOR'.
READ TABLE gt_alv INTO DATA(gs_alv) INDEX es_row_no-row_id.
SELECT * FROM t024f INTO TABLE @DATA(lt_fevor).
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'FEVOR'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'GT_ALV-FEVOR'
value_org = 'S'
" CALLBACK_PROGRAM = SY-REPID
TABLES
value_tab = lt_fevor
return_tab = lt_return "返回值
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0.
****将选的值填入ALV字段中
READ TABLE gt_alv INTO gs_alv INDEX es_row_no-row_id.
IF sy-subrc = 0.
READ TABLE lt_return INTO ls_return INDEX 1.
IF ls_return-fieldval IS NOT INITIAL.
ls_modi-row_id = es_row_no-row_id.
ls_modi-fieldname = 'FEVOR'.
ls_modi-value = ls_return-fieldval.
APPEND ls_modi TO <itab>.
CLEAR ls_modi.
ENDIF.
er_event_data->m_event_handled = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_caller_exit
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ET_BAD_CELLS
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*& --> E_DISPLAY
*& --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_caller_exit USING ls_data TYPE slis_data_caller_exit.
DATA : lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
"DATA gt_event_receiver TYPE REF TO lcl_event_receiver.
*获取的全局ALV对象
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref_grid.
ls_f4-fieldname = 'FEVOR'. "
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = 'X'.
INSERT ls_f4 INTO TABLE lt_f4.
*注册拦截的F4
CALL METHOD ref_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4[].
IF sy-subrc <> 0.
* Implement suGT_OUTle error handling here
ENDIF.
*创建类 类似 new OBJ
* CREATE OBJECT gt_event_receiver.
*设置拦截
* SET HANDLER gt_event_receiver->handle_f4 FOR ref_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
* EXPORTING
* IR_SALV_FULLSCREEN_ADAPTER =
IMPORTING
* ET_EXCLUDING =
* E_REPID =
* E_CALLBACK_PROGRAM =
* E_CALLBACK_ROUTINE =
e_grid = ref_grid
* ET_FIELDCAT_LVC =
* ER_TRACE =
* E_FLG_NO_HTML =
* ES_LAYOUT_KKBLO =
* ES_SEL_HIDE =
* ET_EVENT_EXIT =
* ER_FORM_TOL =
* ER_FORM_EOL =
.
* CALL METHOD ref_grid->check_changed_data.
* 设置enter事件
CALL METHOD ref_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CREATE OBJECT gt_event_receiver.
SET HANDLER gt_event_receiver->handle_f4 FOR ref_grid.
SET HANDLER gt_event_receiver->handle_modify FOR ref_grid.
ENDFORM. "F_CALLER_EXIT
*&---------------------------------------------------------------------*
*& Form FRM_SET_CO48
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <FS_GROUP>_PLNUM
*& --> <FS_GROUP>_GSMNG
*&---------------------------------------------------------------------*
FORM frm_set_co48 USING p_ms
p_plnum
p_zauart
p_gsmng
CHANGING p_aufnr TYPE aufnr
p_msg TYPE bapiret2.
DATA:lv_num TYPE i.
" BDC定义
DATA: messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
ex_messtab TYPE TABLE OF bapiret2 WITH HEADER LINE,
lt_ex TYPE TABLE OF bapiret2 WITH HEADER LINE.
DATA: gv_mode TYPE c1 VALUE 'N',
gv_updata TYPE c1 VALUE 'S',
gv_tcode TYPE char10 VALUE 'CO48'.
DATA l_opts TYPE ctu_params.
DATA:lv_gsmng TYPE char17.
l_opts-nobinpt = 'X'.
l_opts-dismode = p_ms."gv_mode.
l_opts-updmode = gv_updata.
REFRESH: bdcdata, messtab, ex_messtab .
PERFORM bdc_dynpro USING 'SAPLCOKO1' '0150'.
PERFORM bdc_field USING 'BDC_CURSOR'
'AFPOD-PLNUM'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTK'.
PERFORM bdc_field USING 'AFPOD-PLNUM'
p_plnum.
PERFORM bdc_field USING 'AFPOD-TPAUF'
'X'.
PERFORM bdc_field USING 'AUFPAR-PP_AUFART'
p_zauart.
PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ABBT-GSMNG(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
WRITE:p_gsmng TO lv_gsmng.
CONDENSE lv_gsmng.
PERFORM bdc_field USING 'ABBT-GSMNG(01)'
lv_gsmng.
PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
PERFORM bdc_field USING 'BDC_CURSOR'
'ABBT-GSMNG(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
PERFORM bdc_dynpro USING 'SAPLCOSD' '5132'.
PERFORM bdc_field USING 'BDC_CURSOR'
'MDFQ-ADATU(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=AUSW'.
* PERFORM bdc_dynpro USING 'SAPLCOKO1' '0150'." 输入界面
* PERFORM bdc_field USING 'BDC_OKCODE'
* '=ENTK'.
* PERFORM bdc_field USING 'AFPOD-PLNUM'
* p_plnum.
* PERFORM bdc_field USING 'AFPOD-TPAUF'
* 'X'.
* PERFORM bdc_field USING 'AUFPAR-PP_AUFART'
* p_zauart.
* PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'."
* PERFORM bdc_field USING 'BDC_OKCODE'
* '=GEN'.
* PERFORM bdc_field2 USING 'ABBT-GSMNG(01)'
* p_gsmng.
* PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
* PERFORM bdc_field USING 'BDC_CURSOR'
* 'ABBT-GSMNG(01)'.
* PERFORM bdc_field USING 'BDC_OKCODE'
* '=BU'.
* PERFORM bdc_dynpro USING 'SAPLCOSD' '5132'.
* PERFORM bdc_field USING 'BDC_CURSOR'
* 'MDFQ-ADATU(01)'.
* PERFORM bdc_field USING 'BDC_OKCODE'
* '=AUSW'.
CLEAR lv_num.
"lv_num = p_gsmng.
"DO lv_num TIMES.
CALL TRANSACTION gv_tcode
USING bdcdata
OPTIONS FROM l_opts
MESSAGES INTO messtab .
CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2' " 将 messtab 转换为消息文本
TABLES
imt_bdcmsgcoll = messtab
ext_return = ex_messtab.
LOOP AT ex_messtab WHERE type CA 'AEI'.
APPEND ex_messtab TO lt_ex.
ENDLOOP.
* IF sy-subrc = 0.
* EXIT.
* ENDIF.
READ TABLE ex_messtab INTO DATA(lw_ex_messtab) WITH KEY id = 'COTU' type = 'S' number = '014'.
IF sy-subrc EQ 0.
p_aufnr = lw_ex_messtab-message_v2.
p_aufnr = |{ p_aufnr ALPHA = IN }|.
ENDIF.
CLEAR: messtab,messtab[],ex_messtab,ex_messtab[].
" ENDDO.
SORT lt_ex BY type message.
DELETE ADJACENT DUPLICATES FROM lt_ex COMPARING type message.
LOOP AT lt_ex WHERE type CA 'AEI'.
IF lt_ex-message IS NOT INITIAL.
p_msg-message = p_msg-message && lt_ex-message .
ENDIF.
ENDLOOP.
IF p_aufnr IS INITIAL.
LOOP AT lt_ex .
IF lt_ex-message IS NOT INITIAL.
p_msg-message = p_msg-message && lt_ex-message .
ENDIF.
ENDLOOP.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
p_msg-type = 'E' .
ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
p_msg-type = 'S' .
p_msg-message = '转换成功'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form bdc_dynpro
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->
*& -->
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program
dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "bdc_dynpro
*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->
*& -->
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDFORM. "bdc_field
*&---------------------------------------------------------------------*
*& Form bdc_field2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->
*& -->
*&---------------------------------------------------------------------*
FORM bdc_field2 USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
CONDENSE bdcdata-fval." 删除字符串中的空格
APPEND bdcdata.
ENDFORM. "bdc_field
*&---------------------------------------------------------------------*
*& Form frm_f4_help_dispo
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ET_BAD_CELLS
*& --> ES_ROW_NO
*& --> ER_EVENT_DATA
*& --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_f4_help_dispo USING et_bad_cells TYPE lvc_t_modi
es_row_no TYPE lvc_s_roid
er_event_data TYPE REF TO cl_alv_event_data
"e_display TYPE c
e_fieldname TYPE lvc_fname.
DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
ls_return TYPE ddshretval.
DATA :lv_eqart TYPE eqart.
FIELD-SYMBOLS: <itab> TYPE lvc_t_modi.
DATA: ls_modi TYPE lvc_s_modi.
ASSIGN er_event_data->m_data->* TO <itab>.
IF e_fieldname = 'DISPO'.
READ TABLE gt_alv INTO DATA(gs_alv) INDEX es_row_no-row_id.
SELECT * FROM t024d INTO TABLE @DATA(lt_dispo).
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'DISPO'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'GT_ALV-DISPO'
value_org = 'S'
" CALLBACK_PROGRAM = SY-REPID
TABLES
value_tab = lt_dispo
return_tab = lt_return "返回值
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc = 0.
READ TABLE gt_alv INTO gs_alv INDEX es_row_no-row_id.
IF sy-subrc = 0.
READ TABLE lt_return INTO ls_return INDEX 1.
IF ls_return-fieldval IS NOT INITIAL.
ls_modi-row_id = es_row_no-row_id.
ls_modi-fieldname = 'DISPO'.
ls_modi-value = ls_return-fieldval.
APPEND ls_modi TO <itab>.
CLEAR ls_modi.
ENDIF.
er_event_data->m_event_handled = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'STATUS_9000'.
SET TITLEBAR 'TITLEBAR_9000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
DATA:ok_key TYPE sy-ucomm.
DATA:lv_selline TYPE sy-stepl,
lv_tabix TYPE sy-tabix.
DATA:lv_answer.
DATA:lv_number TYPE numc10,
lv_number_top TYPE numc10.
DATA:lv_lines TYPE numc10.
DATA:lv_menge TYPE menge_d.
DATA:lt_alv TYPE ty_basic,
lw_alv LIKE LINE OF lt_alv.
ok_key = ok_code.
CLEAR:ok_code,lv_menge.
CASE ok_key.
WHEN '&XINZENG'.
IF gv_gsmng IS INITIAL.
MESSAGE '请输入数量' TYPE 'E'.
ELSE.
IF gv_gsmng >= gv_gsmng_total.
MESSAGE '拆分数量不能大于最大可拆分数量' TYPE 'E'.
ENDIF.
ENDIF.
CLEAR:lv_menge,lv_lines.
gt_tab[] = VALUE #( BASE gt_tab ( plnum = gv_plnum
pwwrk = gv_werks
gsmng = gv_gsmng ) ).
READ TABLE gt_tab ASSIGNING FIELD-SYMBOL(<fs_tab>) INDEX 1.
IF sy-subrc EQ 0.
IF <fs_tab>-gsmng - gv_gsmng > 0.
<fs_tab>-gsmng = <fs_tab>-gsmng - gv_gsmng.
ENDIF.
ENDIF.
lv_menge = REDUCE menge_d( INIT sum = 0 FOR ls_tab IN gt_tab NEXT sum = sum + ls_tab-gsmng ).
IF lv_menge > gv_gsmng_total.
lv_lines = lines( gt_tab ).
DELETE gt_tab INDEX lv_lines.
ENDIF.
WHEN '&SHANCHU'.
CLEAR:lv_selline,lv_tabix,lv_answer,lv_menge.
GET CURSOR LINE lv_selline.
lv_tabix = tc_tab-top_line + lv_selline - 1.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = '确认是否删除第' && lv_tabix && '行'
titel = '提示'
cancel_display = 'X'
IMPORTING
answer = lv_answer.
IF lv_answer = 'J' AND lv_tabix > 0.
IF lv_tabix = 1.
MESSAGE '不能删除第一行' TYPE 'E'.
ELSE.
lv_menge = gt_tab[ lv_tabix ]-gsmng.
DELETE gt_tab INDEX lv_tabix.
READ TABLE gt_tab ASSIGNING <fs_tab> INDEX 1.
IF sy-subrc EQ 0 AND <fs_tab>-gsmng + lv_menge =< gv_gsmng_total.
<fs_tab>-gsmng = <fs_tab>-gsmng + lv_menge.
ENDIF.
ENDIF.
ENDIF.
WHEN '&CONFIRM'.
CLEAR:lv_tabix,lv_number,lv_number_top.
REFRESH lt_alv.
lv_menge = REDUCE menge_d( INIT sum = 0 FOR ls_tab IN gt_tab
NEXT sum = sum + ls_tab-gsmng ).
IF lv_menge <> gv_gsmng_total.
MESSAGE '拆分数量合计不等于可拆分数量' TYPE 'E'.
ENDIF.
SORT gt_alv BY number.
SORT gt_alv_temp BY number.
lv_tabix = lines( gt_alv ).
lv_number = gt_alv[ lv_tabix ]-number.
lv_number_top = gt_alv[ lv_tabix ]-number_top.
LOOP AT gt_tab INTO gw_tab.
IF sy-tabix = '1'."修改当前行
READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WITH KEY number_top = gv_number_top BINARY SEARCH .
IF sy-subrc EQ 0.
LOOP AT gt_alv ASSIGNING <fs_alv> WHERE number_top = gv_number_top.
IF <fs_alv>-number_top <> gv_number_top.
EXIT.
ENDIF.
IF <fs_alv>-stufe = '.0'.
<fs_alv>-gsmng = gw_tab-gsmng.
ELSE.
<fs_alv>-gsmng = gw_tab-gsmng * <fs_alv>-menge_bc.
ENDIF.
* READ TABLE gt_alv_temp ASSIGNING FIELD-SYMBOL(<fs_alv_temp>) WITH KEY number = <fs_alv>-number BINARY SEARCH.
* IF sy-subrc EQ 0.
* <fs_alv_temp>-gsmng = <fs_alv>-gsmng.
* ENDIF.
ENDLOOP.
ENDIF.
ELSE."新增行 及其下阶
lv_number_top = lv_number_top + 1.
READ TABLE gt_alv_temp INTO DATA(lw_alv_temp) WITH KEY number_top = gv_number_top BINARY SEARCH .
IF sy-subrc EQ 0.
LOOP AT gt_alv_temp INTO lw_alv_temp FROM sy-tabix.
IF lw_alv_temp-number_top <> gv_number_top.
EXIT.
ENDIF.
MOVE-CORRESPONDING lw_alv_temp TO lw_alv.
IF lw_alv_temp-stufe = '.0'.
lw_alv-gsmng = gw_tab-gsmng.
ELSE.
lw_alv-gsmng = gw_tab-gsmng * lw_alv_temp-menge_bc.
ENDIF.
lv_number = lv_number + 1.
lw_alv-number = lv_number.
lw_alv-number_top = lv_number_top.
APPEND lw_alv TO lt_alv.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
IF lt_alv[] IS NOT INITIAL.
LOOP AT gt_alv INTO DATA(ls_alv) WHERE number_top = gv_number_top.
READ TABLE gt_alv_temp ASSIGNING FIELD-SYMBOL(<fs_alv_temp>) WITH KEY number = ls_alv-number BINARY SEARCH.
IF sy-subrc EQ 0.
<fs_alv_temp>-gsmng = <fs_alv>-gsmng.
ENDIF.
ENDLOOP.
APPEND LINES OF lt_alv[] TO gt_alv.
APPEND LINES OF lt_alv[] TO gt_alv_temp.
ENDIF.
LEAVE TO SCREEN 0.
WHEN '&CANCEL' OR 'F03' OR 'F05' OR 'F12'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_collapse_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_collapse_alv .
DATA:lt_alv TYPE ty_basic,
ls_alv LIKE LINE OF lt_alv.
READ TABLE gt_alv INTO DATA(lw_alv) WITH KEY number_top = gw_alv-number_top stufe = '.1'.
IF sy-subrc EQ 0.
LOOP AT gt_alv INTO DATA(gs_alv) WHERE number_top = gw_alv-number_top AND stufe <> '.0'.
DELETE gt_alv.
ENDLOOP.
ELSE.
LOOP AT gt_alv_temp INTO DATA(lw_alv_temp) WHERE number_top = gw_alv-number_top AND stufe <> '.0'.
MOVE-CORRESPONDING lw_alv_temp TO ls_alv.
APPEND ls_alv TO lt_alv.
ENDLOOP.
APPEND LINES OF lt_alv[] TO gt_alv[].
SORT gt_alv BY number.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CLEAR_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_clear_data .
CLEAR:gv_matnr,
gv_maktx,
gv_psttr,
gv_pedtr,
gv_gsmng_total,
gv_gsmng,
gv_werks,
gv_plnum,
gv_number,
gv_number_top.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_log_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_log_data .
DATA:lt_temp TYPE TABLE OF ztpp0019.
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_ztpp0019
FROM ztpp0019
WHERE datum IN s_datum AND
auart IN s_auart AND
pwwrk IN s_pwwrk AND
matnr IN s_matnr AND
verid IN s_verid AND
dispo IN s_dispo AND
"plgrp IN s_plgrp AND
plnum IN s_plnum AND
pertr IN s_pertr AND
psttr IN s_psttr AND
pedtr IN s_pedtr AND
datum IN s_datum AND
aufnr IN s_aufnr AND
zzorder IN s_zzord.
IF gt_ztpp0019[] IS NOT INITIAL.
SELECT * INTO TABLE @DATA(lt_ztpp0019)
FROM ztpp0019
FOR ALL ENTRIES IN @gt_ztpp0019
WHERE zzorder = @gt_ztpp0019-aufnr.
SORT lt_ztpp0019 BY zzorder.
LOOP AT gt_ztpp0019 INTO DATA(gw_ztpp0019).
READ TABLE lt_ztpp0019 INTO DATA(lw_ztpp0019) WITH KEY zzorder = gw_ztpp0019-aufnr BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc EQ 0.
LOOP AT lt_ztpp0019 INTO lw_ztpp0019 FROM sy-tabix.
APPEND INITIAL LINE TO lt_temp ASSIGNING FIELD-SYMBOL(<fs_out>).
MOVE-CORRESPONDING lw_ztpp0019 TO <fs_out>.
ENDLOOP.
ENDIF.
ENDLOOP.
IF lt_temp[] IS NOT INITIAL.
APPEND LINES OF lt_temp[] TO gt_ztpp0019[].
SORT gt_ztpp0019 BY guid_32.
DELETE ADJACENT DUPLICATES FROM gt_ztpp0019 COMPARING ALL FIELDS.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_log_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_log_alv .
DATA:g_repid TYPE sy-repid.
CLEAR:gs_layout.
g_repid = sy-repid.
"g_layout-zebra = 'X' .
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
" gs_layout-box_fname = 'SEL'.
CLEAR:gt_fieldcat[],gt_fieldcat[].
PERFORM frm_generate_fieldcat_log.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = gt_ztpp0019
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.
*&---------------------------------------------------------------------*
*& Form frm_generate_fieldcat_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_generate_fieldcat_log .
DEFINE def_modify_fieldcat.
&1-scrtext_l = &2.
&1-scrtext_m = &2.
&1-reptext = &2.
&1-scrtext_s = &2.
END-OF-DEFINITION.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
CHANGING t_table = gt_ztpp0019 ).
gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = salv_table->get_columns( )
r_aggregations = salv_table->get_aggregations( ) ).
CATCH cx_root.
ENDTRY.
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
CASE <fs_filedcat>-fieldname.
WHEN 'STATUS'.
def_modify_fieldcat <fs_filedcat> '状态'.
<fs_filedcat>-icon = 'X'.
<fs_filedcat>-no_out = 'X'.
WHEN 'SEL'OR 'NUMBER' OR 'NUMBER_TOP' OR 'MATNR_TOP' OR 'MTART' OR 'MENGE_BC' OR 'MANDT' OR 'GUID_32'. "'PRFG_F' OR 'PRFG_S' .
<fs_filedcat>-no_out = 'X'.
WHEN 'STUFE'.
<fs_filedcat>-hotspot = 'X'.
def_modify_fieldcat <fs_filedcat> 'BOM层级'.
WHEN 'BAPI_MTYPE'.
def_modify_fieldcat <fs_filedcat> '消息'.
WHEN 'BAPI_MSG'.
def_modify_fieldcat <fs_filedcat> '消息文本'.
WHEN 'STUFE'.
def_modify_fieldcat <fs_filedcat> '层级'.
WHEN 'MATNR1'.
<fs_filedcat>-no_out = 'X'.
def_modify_fieldcat <fs_filedcat> '上层物料'.
WHEN 'MAKTX1'.
<fs_filedcat>-no_out = 'X'.
def_modify_fieldcat <fs_filedcat> '上层物料描述'.
WHEN 'MATNR'.
def_modify_fieldcat <fs_filedcat> '组件物料'.
WHEN 'MAKTX'.
def_modify_fieldcat <fs_filedcat> '组件物料描述'.
WHEN 'GSMNG'.
def_modify_fieldcat <fs_filedcat> '订货数量'.
WHEN 'DATUM'.
def_modify_fieldcat <fs_filedcat> '创建日期'.
WHEN 'UZEIT'.
def_modify_fieldcat <fs_filedcat> '创建时间'.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_plgx_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_plgx_data .
DATA: lv_bedat TYPE budat,
lv_endat TYPE budat,
lv_fevor TYPE fevor,
lt_field TYPE TABLE OF sval,
lv_ret TYPE c.
lt_field = VALUE #(
( tabname = 'ZSPPR0024' fieldname = 'BEDAT' value = sy-datum field_obl = 'X' )
( tabname = 'ZSPPR0024' fieldname = 'ENDAT' value = sy-datum field_obl = 'X' )
( tabname = 'ZSPPR0024' fieldname = 'FEVOR' value = '' field_obl = 'X' )
).
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = '批量更新选择'
start_column = '25'
start_row = '10'
IMPORTING
returncode = lv_ret
TABLES
fields = lt_field
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
IF lv_ret = 'A'.
RETURN.
ELSE.
lv_bedat = VALUE #( lt_field[ 1 ]-value OPTIONAL ).
lv_endat = VALUE #( lt_field[ 2 ]-value OPTIONAL ).
lv_fevor = VALUE #( lt_field[ 3 ]-value OPTIONAL ).
ENDIF.
IF lv_bedat IS INITIAL OR lv_bedat IS INITIAL OR lv_fevor IS INITIAL.
RETURN.
ENDIF.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE sel = 'X'.
<fs_alv>-psttr = lv_bedat.
<fs_alv>-pedtr = lv_endat.
<fs_alv>-fevor = lv_fevor.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_change_order_arbpl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_AUFNR
*& --> <FS_GROUP>_ARBPL
*&---------------------------------------------------------------------*
FORM frm_change_order_arbpl USING pv_aufnr TYPE aufnr
pv_arbpl TYPE arbpl
CHANGING pv_mtype TYPE bapi_mtype
pv_msg TYPE bapi_msg.
* DATA:lt_routing TYPE cose_t_opr_change,
* ls_routing TYPE cose_s_opr_change,
* ls_return TYPE bapiret2.
*
* lv_aufnr = '000021067183'.
* ls_routing-vornr = '0030'.
* ls_routing-arbpl = 'DP2010'.
* ls_routing-arbpl_x = 'X'.
* ls_routing-ltxa1 = '壓鑄成形'.
* ls_routing-ltxa1_x = 'X'.
* ls_routing-vgw01 = 70.
* ls_routing-vgw01_x = 'X'.
* APPEND ls_routing TO lt_routing.
*
*
* CALL FUNCTION 'CO_SE_PRODORD_OPR_CHANGE'
* EXPORTING
* iv_order_number = pv_aufnr
* it_opr_change = lt_routing
** it_user_stat =
* iv_refresh = 'X'
* iv_order_post = 'X'
* iv_commit = 'X'
* IMPORTING
* es_return = ls_return.
ENDFORM.
INCLUDE :ZPPR0024_CLC
*&---------------------------------------------------------------------*
*& 包含 ZPPR0024_CLC
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Class lcl_event_receiver
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
e_fieldvalue
es_row_no
er_event_data
et_bad_cells.
METHODS handle_modify
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Class (Implementation) lcl_event_receiver
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_modify.
* DATA stbl TYPE lvc_s_stbl.
* DATA(lv_stlan) = VALUE mkal-stlan( ).
* DATA(lv_verwe) = VALUE plko-verwe( ).
*
*
** 生产订单ZP01 对应BOM用途1,工艺路线用途1
** 生产订单ZP02 对应BOM用途2,工艺路线用途1
** 生产订单ZP03 对应BOM用途3,工艺路线用途1
** 生产订单ZP08 对应BOM用途Y,工艺路线用途Y
** 生产订单ZP09 对应BOM用途Y,工艺路线用途Y
*
* IF gt_alv[] IS NOT INITIAL.
* SELECT * INTO TABLE @DATA(lt_ztpp0020)
* FROM ztpp0020
* FOR ALL ENTRIES IN @gt_alv
* WHERE fevor = @gt_alv-fevor.
* SORT lt_ztpp0020 BY fevor.
*
* LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
* READ TABLE lt_ztpp0020 INTO DATA(lw_ztpp0020) WITH KEY fevor = <fs_alv>-fevor BINARY SEARCH.
* IF sy-subrc EQ 0.
* <fs_alv>-arbpl = lw_ztpp0020-arbpl.
* ENDIF.
* ENDLOOP.
*
* SELECT mkal~matnr,
* mkal~werks,
* mkal~verid,
* mkal~text1,
* mkal~adatu,
* mkal~stlan,"BOM用途
* plko~verwe,"工艺路线用途
* crhd~arbpl,
* mkal~prfg_f,
* mkal~prfg_s
* INTO TABLE @DATA(lt_mkal)
* FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
* mkal~plnnr = plko~plnnr AND
* mkal~alnal = plko~plnal
* INNER JOIN plpo ON plpo~plnty = plko~plnty AND
* plpo~plnnr = plko~plnnr AND
* plpo~zaehl = plko~zaehl
* INNER JOIN crhd ON crhd~objid = plpo~arbid AND crhd~objty = 'A'
* FOR ALL ENTRIES IN @gt_alv
* WHERE mkal~matnr = @gt_alv-matnr AND
* mkal~werks = @gt_alv-pwwrk AND
* crhd~arbpl = @gt_alv-arbpl AND
* mkal~bdatu >= @sy-datum AND
* mkal~adatu <= @sy-datum AND
* plko~loekz = ''.
*
* SORT lt_mkal BY matnr werks arbpl DESCENDING.
*
* LOOP AT gt_alv ASSIGNING <fs_alv>.
*
** IF <fs_alv>-auart <> p_auart.
* CASE <fs_alv>-auart.
* WHEN 'ZP01'.
* lv_stlan = '1'.
* lv_verwe = '1'.
* WHEN 'ZP02'.
* lv_stlan = '2'.
* lv_verwe = '1'.
* WHEN 'ZP03'.
* lv_stlan = '3'.
* lv_verwe = '1'.
* WHEN 'ZP08'.
* lv_stlan = 'Y'.
* lv_verwe = 'Y'.
* WHEN 'ZP09'.
* lv_stlan = 'Y'.
* lv_verwe = 'Y'.
* WHEN OTHERS.
* ENDCASE.
** ENDIF.
*
* READ TABLE lt_mkal INTO DATA(lw_mkal) WITH KEY matnr = <fs_alv>-matnr werks = <fs_alv>-pwwrk arbpl = <fs_alv>-arbpl BINARY SEARCH.
* IF sy-subrc EQ 0.
* <fs_alv>-verid = lw_mkal-verid.
* <fs_alv>-text1 = lw_mkal-text1.
* <fs_alv>-prfg_f = lw_mkal-prfg_f.
* <fs_alv>-prfg_s = lw_mkal-prfg_s.
* IF lv_stlan <> lw_mkal-stlan OR lv_verwe <> lw_mkal-verwe.
* CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
* ENDIF.
* ELSE.
* CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
* ENDIF.
*
* IF <fs_alv>-aufnr IS NOT INITIAL OR <fs_alv>-zzorder IS NOT INITIAL..
* ELSE.
* IF <fs_alv>-verid IS INITIAL..
* <fs_alv>-bapi_mtype = 'E'.
* <fs_alv>-bapi_msg = '找不到生产版本'.
* ELSE.
* CLEAR:<fs_alv>-bapi_mtype,<fs_alv>-bapi_msg .
* ENDIF.
* ENDIF.
* ENDLOOP.
* ENDIF.
* 稳定刷新
* stbl-row = 'X'." 基于行的稳定刷新
* stbl-col = 'X'." 基于列稳定刷新
*
* CALL METHOD ref_grid->refresh_table_display
* EXPORTING
* is_stable = stbl.
ENDMETHOD. "HANDLE_MODIFY
METHOD handle_f4.
CASE e_fieldname.
WHEN 'FEVOR'. "自定义的字段
PERFORM frm_f4_help_fevor USING et_bad_cells
es_row_no
er_event_data
"e_display
e_fieldname .
WHEN 'DISPO'.
PERFORM frm_f4_help_dispo USING et_bad_cells
es_row_no
er_event_data
"e_display
e_fieldname .
ENDCASE.
ENDMETHOD. "
ENDCLASS. "lcl_event_receiver
屏幕:9000
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_TAB'
MODULE tc_tab_change_tc_attr.
*&SPWIZARD: MODULE TC_TAB_CHANGE_COL_ATTR.
LOOP AT gt_tab
INTO gw_tab
WITH CONTROL tc_tab
CURSOR tc_tab-current_line.
MODULE tc_tab_get_lines.
*&SPWIZARD: MODULE TC_TAB_CHANGE_FIELD_ATTR
ENDLOOP.
MODULE status_9000.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TC_TAB'
LOOP AT gt_tab.
CHAIN.
FIELD gw_tab-plnum.
FIELD gw_tab-pwwrk.
FIELD gw_tab-gsmng.
ENDCHAIN.
ENDLOOP.
MODULE tc_tab_user_command.
*&SPWIZARD: MODULE TC_TAB_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TC_TAB_CHANGE_COL_ATTR.
MODULE user_command_9000.