SAP PP工单在制品数量报表分享
一、报表逻辑






二、报表界面

三、报表代码
*&———————————————————————*
*& Report ZRPPP_0015
*&———————————————————————*
*& 09.07.2021 08:55:45 By Guoxj 工单在制品数量报表
*&———————————————————————*
REPORT zrppp_0015.
TYPE-POOLS:slis.
TABLES: afko,afpo,ztmm_mara,ztmm_marc,cskt,crhd,resb,caufv,
sscrfields ,icon,stxh.
DATA: BEGIN OF gt_msg OCCURS 0,
msgid LIKE sy-msgid,
msgty LIKE sy-msgty,
msgno LIKE sy-msgno,
msgv1 LIKE sy-msgv1,
msgv2 LIKE sy-msgv2,
msgv3 LIKE sy-msgv3,
msgv4 LIKE sy-msgv4,
lineno LIKE mesg-zeile,
END OF gt_msg.
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_layout TYPE REF TO cl_salv_layout.
DATA: gs_program TYPE salv_s_layout_key.
DATA: gr_columns TYPE REF TO cl_salv_columns_table.
DATA: gr_column TYPE REF TO cl_salv_column_table.
DATA: gr_display TYPE REF TO cl_salv_display_settings.
TYPES: BEGIN OF ty_salv ,
aufnr TYPE afpo-aufnr,
matnr TYPE afpo-matnr,
maktx TYPE makt-maktx,
matnr_ltext TYPE char255,
zzxmbm TYPE ztmm_marc-zzxmbm,
psmng TYPE afpo-psmng,
wemng TYPE afpo-wemng,
zwemng TYPE afpo-wemng,
zsbsl TYPE p DECIMALS 3, “实报数量
zzt TYPE char4,
matnr1 TYPE resb-matnr,
maktx1 TYPE makt-maktx,
maktx_ltxt TYPE char255,
meins TYPE resb-meins,
bdmng TYPE resb-bdmng,
enmng TYPE resb-enmng,
zenmng TYPE resb-enmng,
zenmng1 TYPE resb-enmng,
zenmng2 TYPE resb-enmng,
labst TYPE mard-labst,
zenmng3(16) TYPE p DECIMALS 9 , ” resb-enmng,
zausch TYPE char10,
zenmng4(16) TYPE p DECIMALS 9 , “resb-enmng,
dwerk TYPE afpo-dwerk,
ftrmi TYPE afko-ftrmi,
tecodat TYPE datum,
idat2 TYPE caufv-idat2,
ltext TYPE cskt-ltext,
arbpl TYPE crhd-arbpl,
kostl TYPE ztpp001_info-kostl, ” 成本中心
zbmmc TYPE ztpp001_info-zbmmc, ” 成本中心描述
zzbfl TYPE char10,
zzdl TYPE char10,
dauat TYPE afpo-dauat,
ablad TYPE afpo-ablad,
zltext TYPE caufv-zltext,
gstrp TYPE afko-gstrp,
zddxqs TYPE caufv-zddxqs,
zkunnr TYPE caufv-zkunnr,
zkondm TYPE caufv-zkondm,
zygll TYPE caufv-zygll,
zbz TYPE caufv-zbz,
sttxt TYPE j_stext,
rsnum TYPE resb-rsnum,
rspos TYPE resb-rspos,
btn TYPE char10,
END OF ty_salv .
TYPES: BEGIN OF ty_bom ,
stlnr TYPE resb-stlnr,
stlty TYPE resb-stlty,
stlkn TYPE resb-stlkn,
stpoz TYPE resb-stpoz,
END OF ty_bom .
DATA:BEGIN OF gt_tab OCCURS 0 .
INCLUDE TYPE ty_salv .
INCLUDE TYPE ty_bom .
DATA:
objnr TYPE aufk-objnr,
objid TYPE aufk-objid,
posnr TYPE resb-posnr,
item_objnr TYPE resb-objnr,
ausch TYPE resb-ausch,
routing_no TYPE co_aufpl,
* kostl TYPE kostl,
esmng TYPE resb-esmng, “工单组件单位用量
flg TYPE c,
shkzg TYPE resb-shkzg,
bwart TYPE resb-bwart,
aufpl TYPE co_aufpl,
END OF gt_tab .
DATA:gt_tab_show TYPE TABLE OF ty_salv .
DATA:BEGIN OF gt_anr OCCURS 0 .
DATA: aufnr LIKE gt_tab-aufnr,
zzt LIKE gt_tab-zzt,
flg LIKE gt_tab-flg,
arbpl LIKE gt_tab-arbpl,
routing_no LIKE gt_tab-routing_no,
kostl LIKE gt_tab-kostl,
END OF gt_anr .
DATA:BEGIN OF gw_info.
DATA: ztype TYPE bapi_mtype,
zmsg TYPE bapi_msg,
* m_best_eko TYPE char1, “采购组织
* m_best_bsa TYPE char1, “凭证类型
* m_best_wrk TYPE char1, “工厂
* m_best_ekg TYPE char1, “采购组
zaopp_prs TYPE char1, “价格权限
END OF gw_info .
DATA: flg_err TYPE c,
flg_query TYPE c, “仅查询,不读取物料长文本,工单状态等数据
gv_check TYPE i.
DATA: “dauat TYPE zspp_000-dauat,
arbpl TYPE zspp_000-arbpl,
ltext TYPE zspp_000-ltext.
DATA: r_lgort_x TYPE RANGE OF mard-lgort.
CLASS l_cl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function.
METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS.
CLASS l_cl_handle_events IMPLEMENTATION.
METHOD on_user_command.
PERFORM handle_user_command USING e_salv_function.
ENDMETHOD.
METHOD on_link_click.
PERFORM handle_link_click USING row column.
ENDMETHOD.
ENDCLASS.
SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_dwerk FOR afpo-dwerk NO-EXTENSION NO INTERVALS OBLIGATORY MEMORY ID wrk,
s_aufnr FOR afpo-aufnr,
s_matnr FOR afpo-matnr,
s_zzxmbm FOR ztmm_marc-zzxmbm NO INTERVALS,
s_matnr1 FOR resb-matnr,”cskt-ltext,
s_arbpl FOR arbpl,
s_ltext FOR ltext NO-EXTENSION NO INTERVALS ,
s_ftrmi FOR afko-ftrmi,
s_idat2 FOR caufv-idat2 .
PARAMETERS p_zero AS CHECKBOX .
* PARAMETERS: zzt TYPE char10 DEFAULT '' AS LISTBOX VISIBLE LENGTH 15 USER-COMMAND chgzt .
* PARAMETERS: zflag AS CHECKBOX DEFAULT '' USER-COMMAND chk.
SELECTION-SCREEN SKIP 1 .
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.”定位
SELECTION-SCREEN COMMENT 1(8) txt .
SELECTION-SCREEN POSITION 10.
PARAMETERS all AS CHECKBOX USER-COMMAND cmd.
SELECTION-SCREEN COMMENT 11(5) chk FOR FIELD all.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN ULINE .
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.”定位
SELECTION-SCREEN COMMENT 5(8) chk1 FOR FIELD crtd.
SELECTION-SCREEN COMMENT 20(5) chk2 FOR FIELD rel.
SELECTION-SCREEN COMMENT 34(5) chk3 FOR FIELD teco.
SELECTION-SCREEN POSITION 1.
PARAMETERS crtd AS CHECKBOX .
SELECTION-SCREEN POSITION 15.
PARAMETERS rel AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN POSITION 29.
PARAMETERS teco AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.”定位
SELECTION-SCREEN COMMENT 5(8) chk4 FOR FIELD flag.
SELECTION-SCREEN COMMENT 20(5) chk5 FOR FIELD del.
SELECTION-SCREEN COMMENT 34(5) chk6 FOR FIELD lock.
SELECTION-SCREEN COMMENT 48(5) chk7 FOR FIELD close.
SELECTION-SCREEN POSITION 1.
PARAMETERS flag AS CHECKBOX .
SELECTION-SCREEN POSITION 15.
PARAMETERS del AS CHECKBOX.
SELECTION-SCREEN POSITION 29.
PARAMETERS lock AS CHECKBOX.
SELECTION-SCREEN POSITION 43.
PARAMETERS close AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK part1.
AT SELECTION-SCREEN OUTPUT.
ADD 1 TO gv_check .
CHECK gv_check > 1 .
crtd = rel = teco = flag = del = lock = close = all .
* IF zflag = 'X' .
* zzt = '' .
* ENDIF.
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-low .
* PERFORM frm_search_ltext .
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_ltext-high .
* PERFORM frm_search_ltext .
INITIALIZATION.
txt = '工单状态:' .
chk = '全选'.
chk1 = '已创建'.
chk2 = '已下达'.
chk3 = '技术关闭' .
chk4 = '标记'.
chk5 = '删除'.
chk6 = '锁定' .
chk7 = '财务结算' .
* DATA itab_list TYPE vrm_values.
* itab_list = VALUE #(
* ( key = 'CRTD' text = '已创建' )
* ( key = 'REL' text = '已审批' )
* ( key = 'TECO' text = '技术性完成' )
* ( key = '标记' text = '标记' )
* ( key = '删除' text = '删除' )
* ( key = '锁定' text = '锁定' )
* ( key = '结算' text = '已财务结算' )
*
* ).
*
* CALL FUNCTION 'VRM_SET_VALUES'
* EXPORTING
* id = 'ZZT'
* values = itab_list.
* REFRESH itab_list.
DATA: lv_begdat TYPE datum,
lv_enddat TYPE datum.
DATA: BEGIN OF date,
j(4),
m(2),
t(2),
END OF date.
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = sy-datum
IMPORTING
last_day_of_month = lv_enddat
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.
date = lv_enddat.
date-t = '01'.
lv_begdat = date .
* r_lgort_x = VALUE #( sign = 'I' option = 'EQ' ( low = '9999' )
* ( low = 'BRJ1' )
* ( low = 'BRJ2' )
* ( low = 'CMP1' )
* ( low = 'CMS1' )
* ( low = 'CQ04' )
* ( low = 'LD01' )
* ( low = 'MRJS' )
* ( low = 'RJ01' )
* ( low = 'RJ03' )
* ( low = 'RJP1' )
* ( low = 'RJS1' )
* ( low = 'RJS3' )
* ( low = 'XN02' )
* ( low = 'ZY02' )
* ( low = 'ZY03' )
* ( low = 'ZY04' )
* ( low = 'ZY05' )
* ( low = 'ZY06' )
* ( low = 'ZY07' )
* ( low = 'ZYLD' )
* ( low = 'ZZZZ' ) ) .
START-OF-SELECTION.
IF crtd = '' AND rel = '' AND teco = '' AND flag = '' AND del = '' AND lock = '' AND close = '' AND all = '' .
MESSAGE '请选择工单状态.' TYPE 'S' DISPLAY LIKE 'E' .
RETURN.
ENDIF.
PERFORM frm_check_auth .
CHECK flg_err = '' .
SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
INTO TABLE @r_lgort_x
FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_dwerk .
IF cl_abap_matcher=>matches( pattern = 'ZPP002' text = sy-tcode ) .
flg_query = 'X' .
ENDIF.
PERFORM frm_get_data .
* IF gt_tab[] IS INITIAL.
* MESSAGE '未查询到数据' TYPE 'S' DISPLAY LIKE 'W' .
* ENDIF.
PERFORM frm_show_alv .
*&———————————————————————*
*& Form frm_show_alv
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_show_alv .
CLEAR gt_tab_show[] .
MOVE-CORRESPONDING gt_tab[] TO gt_tab_show[] .
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_tab_show[]
).
CATCH cx_salv_msg.
ENDTRY.
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( 'X' ).
DEFINE mcr_undisplay.
TRY.
gr_column ?= gr_columns->get_column( &1 ).
gr_column->set_visible( cl_salv_column_table=>false ).
gr_column->set_technical( 'X' ) .
CATCH cx_salv_not_found .
ENDTRY.
END-OF-DEFINITION.
DATA: s TYPE scrtext_s,
m TYPE scrtext_m,
l TYPE scrtext_l.
DEFINE mcr_setcoltext.
TRY.
gr_column ?= gr_columns->get_column( &1 ).
s = &2 .m = &2. l = &2 .
gr_column->set_short_text( s ).
gr_column->set_medium_text( m ).
gr_column->set_long_text( l ).
CATCH cx_salv_not_found .
ENDTRY.
END-OF-DEFINITION.
DEFINE mcr_zzero.
TRY.
gr_column ?= gr_columns->get_column( &1 ).
gr_column->set_edit_mask( '==ZZERO' ).
CATCH cx_salv_not_found .
ENDTRY.
END-OF-DEFINITION.
IF s_dwerk-low+0(3) <> '813'.
mcr_undisplay: 'ZDDXQS',
'ZKONDM',
'ZYGLL',
'ZBZ'.
ENDIF.
IF rel = ''.
mcr_undisplay: 'BTN'.
ENDIF.
mcr_setcoltext:
'AUFNR' '工单号',
'MATNR' '物料编码',
'MAKTX' '物料描述',
'MATNR_LTEXT' '物料长文本',
'ZZXMBM' '项目编码',
'PSMNG' '已订购量',
'WEMNG' '完成数量',
'ZWEMNG' '未完成数量',
'ZZT' '加工单状态',
'STTXT' '加工单状态(全)',
'MATNR1' '组件物料编码',
'MAKTX1' '组件物料描述',
'MAKTX_LTXT' '组件物料长文本',
'MEINS' '计量单位',
'BDMNG' '需求数量',
'ENMNG' '发放量',
'ZENMNG' '组件短缺量',
'ZENMNG1' '报废数量',
'ZENMNG2' '在制品数量',
'LABST' '现有数量',
'ZENMNG3' '组件单位用量',
'ZAUSCH' '单位损耗',
'ZENMNG4' 'BOM单位用量(不含报废率)',
'DWERK' '地点',
'FTRMI' '发放日期',
'TECODAT' 'TECO日期',
'IDAT2' '工单关闭日期',
'LTEXT' '部门名称',
'ARBPL' '工作中心',
'KOSTL' '成本中心',
'ZBMMC' '成本中心描述',
'ZZBFL' '报废率',
'ZZDL' '单龄',
'DAUAT' '订单类型',
'ABLAD' '备注1(卸货点)',
'ZLTEXT' '备注文本',
'ZDDXQS' '订单需求数',
'ZKONDM' '终端客户',
'ZYGLL' '预估良率',
'ZBZ' '备注',
'ZSBSL' '实报数量',
'RSNUM' '预留号',
'RSPOS' '预留行号',
'BTN' '操作'.
mcr_zzero: 'PSMNG', 'WEMNG' , 'ZWEMNG' ,'BDMNG','ENMNG','ZENMNG', 'ZENMNG1',
'ZENMNG2' , 'LABST' , 'ZENMNG3' ,'ZENMNG4' , 'ZSBSL'.
TRY.
gr_column ?= gr_columns->get_column( 'BTN' ).
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
gr_column ?= gr_columns->get_column( 'AUFNR' ).
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
gr_column ?= gr_columns->get_column( 'ZENMNG2' ).
gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
CATCH cx_salv_not_found .
ENDTRY.
TRY.
DATA lv_status TYPE sypfkey .
lv_status = 'STANDARD' .
CALL METHOD gr_table->set_screen_status
EXPORTING
report = sy-repid
pfstatus = lv_status
set_functions = gr_table->c_functions_all.
CATCH cx_sy_arithmetic_error INTO DATA(exc).
ENDTRY.
gr_layout = gr_table->get_layout( ).
gs_program-report = sy-repid.
gr_layout->set_key( gs_program ).
gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
gr_layout->set_default( 'X' ).
“=====事件注册
DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
“=====获取事件对象
DATA: lr_event TYPE REF TO cl_salv_events_table.
CREATE OBJECT lr_handle_event.
lr_event = gr_table->get_event( ).
SET HANDLER lr_handle_event->on_user_command FOR lr_event.
SET HANDLER lr_handle_event->on_link_click FOR lr_event.
gr_table->display( ).
ENDFORM.
*&———————————————————————*
*& Form frm_get_data
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_get_data .
RANGES:r_matnr FOR mara-matnr,
r_matnr_tmp FOR mara-matnr,
r_aufnr FOR afpo-aufnr,
r_aufnr_tmp FOR afpo-aufnr,
r_lgort FOR mdlg-lgort.
TYPES: BEGIN OF ty_aufnr ,
aufnr TYPE aufnr,
END OF ty_aufnr .
DATA: lt_aufnr TYPE TABLE OF ty_aufnr,
lt_aufnr_tmp TYPE TABLE OF ty_aufnr.
DATA:lv_tmp TYPE char20,
lv_char TYPE qsollwertc,
lv_menge(16) TYPE p DECIMALS 10,
lv_dec(5) TYPE p DECIMALS 2.
TYPES:BEGIN OF ty_tab ,
aufnr TYPE afpo-aufnr,
matnr1 TYPE resb-matnr.
INCLUDE TYPE ty_bom .
TYPES: END OF ty_tab .
DATA:lt_tab TYPE TABLE OF ty_tab .
DATA wheresql TYPE TABLE OF edpline .
DATA gh_ztpp001_info TYPE ztpp001_info.
DATA gd_ztpp001_info TYPE TABLE OF ztpp001_info.
* DATA:tline TYPE STANDARD TABLE OF tline WITH HEADER LINE,
* tdname TYPE thead-tdname.
* BREAK guoxiongjie .
*
“筛选项目编码
IF s_zzxmbm[] IS NOT INITIAL.
LOOP AT s_zzxmbm.
CONCATENATE '%' s_zzxmbm-low '%' INTO lv_tmp .
SELECT matnr, werks ,zzxmbm APPENDING TABLE @DATA(lt_xmbm) FROM ztmm_marc
WHERE zzxmbm LIKE @lv_tmp AND werks IN @s_dwerk .
ENDLOOP.
DATA:lw_xmbm LIKE LINE OF lt_xmbm.
LOOP AT lt_xmbm INTO lw_xmbm .
r_matnr-sign = 'I'.
r_matnr-option = 'EQ'.
r_matnr-low = lw_xmbm-matnr .
APPEND r_matnr .
ENDLOOP.
IF r_matnr[] IS INITIAL .
RETURN .
ENDIF .
ENDIF.
APPEND 'afpo~dwerk IN @s_dwerk AND ' TO wheresql .
APPEND 'afpo~aufnr IN @s_aufnr AND ' TO wheresql .
APPEND 'resb~matnr IN @s_matnr1 AND ' TO wheresql .
IF p_zero IS INITIAL.
APPEND '( resb~bdmng > 0 or resb~enmng > 0 ) AND ' TO wheresql .”增加提货数大于0筛选-211211-lys
ENDIF.
APPEND 'afko~ftrmi IN @s_ftrmi AND ' TO wheresql .
APPEND 'caufv~idat2 IN @s_idat2 AND ' TO wheresql .
APPEND LINES OF s_matnr[] TO r_matnr_tmp[].
APPEND LINES OF r_matnr[] TO r_matnr_tmp[].
DELETE r_matnr_tmp WHERE low NOT IN r_matnr .
DELETE r_matnr_tmp WHERE low NOT IN s_matnr .
SORT r_matnr_tmp .
DELETE ADJACENT DUPLICATES FROM r_matnr_tmp[].
APPEND 'afpo~matnr IN @r_matnr_tmp AND ' TO wheresql .
“筛选部门
IF s_ltext[] IS NOT INITIAL.
IF sy-uname CS 'MES' AND s_dwerk-low = '8030'. ” 8030 特殊处理, MES调用时传入的是车间文本,需分开处理
DATA(lv_gzzx) = |%{ s_ltext-low }%|.
* SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
* INTO TABLE @r_aufnr
SELECT a~aufnr
FROM ztpp001_info AS a INNER JOIN aufk AS b ON a~aufnr = b~aufnr
INNER JOIN afko AS c ON a~aufnr = c~aufnr
WHERE a~ktext LIKE @lv_gzzx AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
AND c~ftrmi IN @s_ftrmi
AND c~plnbez IN @r_matnr_tmp
INTO TABLE @lt_aufnr_tmp.
IF sy-subrc NE 0.
RETURN .
ENDIF.
ELSE.
DATA(lv_bmmc) = |%{ s_ltext-low }%|.
* SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
* INTO TABLE @r_aufnr
SELECT a~aufnr
FROM ztpp001_info AS a INNER JOIN aufk AS b ON a~aufnr = b~aufnr
INNER JOIN afko AS c ON a~aufnr = c~aufnr
WHERE a~zbmmc LIKE @lv_bmmc AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
AND c~ftrmi IN @s_ftrmi
AND c~plnbez IN @r_matnr_tmp
INTO TABLE @lt_aufnr_tmp.
IF sy-subrc NE 0.
RETURN .
ENDIF.
ENDIF.
ENDIF.
“筛选工作中心
IF s_arbpl[] IS NOT INITIAL.
* SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
* INTO TABLE @r_aufnr
SELECT a~aufnr
FROM ztpp001_info AS a INNER JOIN aufk AS b ON a~aufnr = b~aufnr
INNER JOIN afko AS c ON a~aufnr = c~aufnr
WHERE a~zgzzx IN @s_arbpl AND a~aufnr IN @s_aufnr AND b~werks IN @s_dwerk
AND c~ftrmi IN @s_ftrmi
INTO TABLE @lt_aufnr_tmp.
ENDIF.
SELECT
CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, a~aufnr AS low
FROM @lt_aufnr_tmp AS a
INTO TABLE @r_aufnr_tmp .
* APPEND LINES OF s_aufnr[] TO r_aufnr_tmp[].
* APPEND LINES OF r_aufnr[] TO r_aufnr_tmp[].
* DELETE r_aufnr_tmp WHERE low NOT IN s_aufnr .
* DELETE r_aufnr_tmp WHERE low NOT IN r_aufnr .
“筛选工单状态
*I0001 ZH CRTD 已创建
*I0002 ZH RELL 已审批
*I0045 ZH TECO 技术性完成
*I0076 ZH FLAG 标记
*I0013 ZH DELL 删除
*I0043 ZH LOKD 已锁定
*I0046 ZH CLSD 已结算
“需要的状态取出来
DATA r_stat TYPE RANGE OF jest-stat .
r_stat = VALUE #( sign = 'I' option = 'EQ' ( low = 'I0001' high = crtd )
( low = 'I0002' high = rel )
( low = 'I0045' high = teco )
( low = 'I0076' high = flag )
( low = 'I0013' high = del )
( low = 'I0043' high = lock )
( low = 'I0046' high = close )
).
DELETE r_stat WHERE high = '' .
CLEAR:r_aufnr[] .
SELECT “DISTINCT aufk~aufnr “, vsaufk~stat
* CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, aufk~aufnr AS low
* INTO TABLE @r_aufnr
aufk~aufnr
FROM vsaufk INNER JOIN aufk ON vsaufk~objnr = aufk~objnr
WHERE inact EQ ' ' AND aufk~werks IN @s_dwerk AND stat IN @r_stat AND aufk~aufnr IN @r_aufnr_tmp
AND aufk~werks IN @s_dwerk AND aufk~idat2 IN @s_idat2
INTO TABLE @lt_aufnr .
* IF r_aufnr[] IS INITIAL.
IF lt_aufnr[] IS INITIAL.
EXIT .
ENDIF.
* SORT r_aufnr .
* DELETE ADJACENT DUPLICATES FROM r_aufnr[] .
* APPEND LINES OF r_aufnr[] TO r_aufnr_tmp[].
* DELETE r_aufnr_tmp WHERE low NOT IN r_aufnr .
* SORT r_aufnr_tmp .
* DELETE ADJACENT DUPLICATES FROM r_aufnr_tmp[].
* APPEND 'afpo~aufnr IN r_aufnr_tmp ' TO wheresql .
* APPEND 'afpo~aufnr = r_aufnr_tmp-low ' TO wheresql .
IF teco = 'X' OR flag = 'X' OR del = 'X' OR close = 'X' . “此4种状态的工单所有组件自动打上了删除标记
ELSE.
APPEND ' resb~xloek = '' '' ' TO wheresql .
ENDIF.
“排除虚拟件
APPEND ' resb~DUMPS = '' '' ' TO wheresql .
SELECT
afpo~aufnr,
afpo~matnr,
afpo~psmng,
afpo~wemng,
resb~matnr AS matnr1,
resb~meins AS meins,
resb~bdmng,
resb~enmng,
resb~ausch,
afpo~dwerk,
afko~ftrmi,
resb~esmng,
resb~posnr,
caufv~idat2,
caufv~objnr,
caufv~objid,
resb~stlnr,
resb~stlty,
resb~stlkn,
resb~stpoz,
resb~objnr AS item_objnr,
afpo~dauat,
resb~bwart,
resb~shkzg,
afpo~ablad,
caufv~zltext,
afko~gstrp,
caufv~zddxqs,
caufv~zkunnr,
caufv~zkondm,
caufv~zygll,
caufv~zbz,
afko~aufpl,
resb~rsnum,
resb~rspos
FROM afpo INNER JOIN afko ON afpo~aufnr = afko~aufnr
INNER JOIN caufv ON afpo~aufnr = caufv~aufnr
INNER JOIN resb ON resb~rsnum = afko~rsnum
* FOR ALL ENTRIES IN r_aufnr_tmp
INNER JOIN @lt_aufnr AS a ON afko~aufnr = a~aufnr
WHERE (wheresql)
INTO CORRESPONDING FIELDS OF TABLE @gt_tab.
IF r_matnr_tmp[] IS NOT INITIAL.
DELETE gt_tab WHERE matnr NOT IN r_matnr_tmp .
ELSE.
r_matnr[] = VALUE #( FOR wa_mat IN gt_tab ( sign = 'I' option = 'EQ' low = wa_mat-matnr1 ) ).
ENDIF.
** “结算日期.
** SELECT aufnr,idat2 INTO TABLE @DATA(lt_caufv) FROM caufv FOR ALL ENTRIES IN @gt_tab
** WHERE aufnr = @gt_tab-aufnr .
** DATA:lw_caufv LIKE LINE OF lt_caufv .
*
SELECT * FROM ztpp001_info FOR ALL ENTRIES IN @gt_tab WHERE aufnr = @gt_tab-aufnr
INTO TABLE @DATA(lt_info) .
MOVE-CORRESPONDING gt_tab[] TO lt_tab[] .
SELECT c~aufnr,c~matnr1,b~menge,a~bmeng
FROM @lt_tab AS c
LEFT JOIN stko AS a ON a~stlnr = c~stlnr AND a~stlty = c~stlty
LEFT JOIN stpo AS b ON c~stlnr = b~stlnr AND c~stlty = b~stlty AND c~matnr1 = b~idnrk
WHERE a~datuv LE @sy-datum AND a~valid_to GE @sy-datum
AND b~datuv LE @sy-datum AND b~valid_to GE @sy-datum
INTO TABLE @DATA(lt_stpo) .
IF gt_tab[] IS NOT INITIAL .
SELECT * INTO CORRESPONDING FIELDS OF TABLE gd_ztpp001_info FROM ztpp001_info FOR ALL ENTRIES IN gt_tab
WHERE aufnr = gt_tab-aufnr.
SORT gd_ztpp001_info BY aufnr.
ENDIF.
LOOP AT gt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>).
* READ TABLE lt_caufv INTO lw_caufv WITH KEY aufnr = <sy_tab>-aufnr .
* IF sy-subrc EQ 0.
* <sy_tab>-idat2 = lw_caufv-idat2 .
* ENDIF.
* PERFORM frm_get_aufnr TABLES lt_cskt USING <sy_tab> .
* 'LTEXT' '部门名称',
* 'ARBPL' '工作中心',
READ TABLE lt_info INTO DATA(lw_info) WITH KEY aufnr = <sy_tab>-aufnr .
IF sy-subrc EQ 0 .
<sy_tab>-arbpl = lw_info-zgzzx .
IF lw_info-zbmmc IS INITIAL.
SELECT SINGLE ktext FROM cskt WHERE kostl = @lw_info-kostl AND spras = 1
INTO @<sy_tab>-ltext .
UPDATE ztpp001_info SET zbmmc = <sy_tab>-ltext WHERE aufnr = <sy_tab>-aufnr AND kostl = lw_info-kostl .
ELSE.
<sy_tab>-ltext = lw_info-zbmmc .
ENDIF.
ENDIF.
PERFORM frm_get_aufnr_a USING <sy_tab> .
* INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-aufnr ) INTO TABLE r_aufnr.
* DATA(lv_aufnr) = |{ <sy_tab>-aufnr ALPHA = OUT }|.
* INSERT VALUE #( sign = 'I' option = 'EQ' low = lv_aufnr ) INTO TABLE r_aufnr.
* INSERT VALUE #( sign = 'I' option = 'EQ' low = <sy_tab>-matnr1 ) INTO TABLE r_matnr.
ENDLOOP.
DELETE gt_tab WHERE flg = 'X' .
* TECO日期
SELECT objnr, udate FROM jcds FOR ALL ENTRIES IN @gt_tab
WHERE objnr = @gt_tab-objnr AND stat = 'I0045' AND inact = '' AND usnam <> 'IT_ERP'
INTO TABLE @DATA(lt_jcds) .
“物料描述
SELECT matnr, maktx INTO TABLE @DATA(lt_makt) FROM makt FOR ALL ENTRIES IN @gt_tab
WHERE ( matnr = @gt_tab-matnr OR matnr = @gt_tab-matnr1 )
AND spras = @sy-langu .
DATA:lw_makt LIKE LINE OF lt_makt.
“物料项目编码
SELECT matnr, werks,zzxmbm INTO TABLE @lt_xmbm FROM ztmm_marc FOR ALL ENTRIES IN @gt_tab
WHERE matnr = @gt_tab-matnr AND werks = @gt_tab-dwerk .
“成本中心名称
* SELECT kostl,ltext INTO TABLE @lt_cskt FROM cskt FOR ALL ENTRIES IN @gt_tab
* WHERE kostl = @gt_tab-kostl AND spras = @sy-langu .
* DATA:lw_cskt LIKE LINE OF lt_cskt.
* TYPES:BEGIN OF ty_aufnr,
* aufnr TYPE aufnr,
* END OF ty_aufnr .
* DATA: t_aufnr TYPE TABLE OF ty_aufnr .
* t_aufnr = VALUE #( FOR wa IN r_aufnr_tmp ( aufnr = wa-low ) ).
“报废数量
SELECT ztpp005~aufnr, matnr, SUM( enmng1 ) AS bfsl
FROM @lt_aufnr AS a INNER JOIN ztpp005 ON ztpp005~aufnr = a~aufnr
GROUP BY ztpp005~aufnr, matnr
INTO TABLE @DATA(lt_005) .
DATA:lw_005 LIKE LINE OF lt_005 .
SELECT ztpp009~aufnr, matnr1, SUM( znum1 ) AS bfsl
FROM @lt_aufnr AS a INNER JOIN ztpp009 ON ztpp009~aufnr = a~aufnr
GROUP BY ztpp009~aufnr, matnr1
INTO TABLE @DATA(lt_009).
DATA:lw_009 LIKE LINE OF lt_009 .
“库存数量
* SELECT CAST( 'I' AS CHAR( 1 ) ) AS sign,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
* INTO TABLE @r_lgort
* FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_dwerk .
SELECT matnr, SUM( labst ) AS labst INTO TABLE @DATA(lt_mard)
FROM mard
WHERE matnr IN @r_matnr AND werks IN @s_dwerk AND lgort NOT IN @r_lgort_x
AND labst > 0
GROUP BY matnr .
DATA:lw_mard LIKE LINE OF lt_mard .
SELECT * INTO TABLE @DATA(lt_012)
FROM ztpp012 .
DATA:lw_012 LIKE LINE OF lt_012 .
SELECT aufpl, aplzl, arbid
FROM afvc FOR ALL ENTRIES IN @gt_tab
WHERE aufpl = @gt_tab-aufpl
INTO TABLE @DATA(lt_afvc) .
DATA where_sql TYPE TABLE OF edpline .
IF s_dwerk-low = '8030'.
APPEND ' left( c~arbpl,2 ) <> ''WB'' ' TO where_sql . “8030排除外包工序
ENDIF.
SELECT arbpl, a~aufpl,a~aplzl, a~vgw01, a~vge01,a~ism01 ,a~vgw02, a~vge02,a~ism02 ,a~vgw03, a~vge03,a~ism03 ,a~ile01 ,a~bmsch ,a~mgvrg ,a~lmnga
FROM afvv AS a INNER JOIN @lt_afvc AS b ON a~aufpl = b~aufpl AND a~aplzl = b~aplzl
INNER JOIN crhd AS c ON b~arbid = c~objid
WHERE (where_sql)
INTO TABLE @DATA(lt_afvv) .
SORT lt_afvv BY aufpl aplzl ASCENDING .
SORT gt_tab ASCENDING BY aufnr posnr .
LOOP AT gt_tab ASSIGNING <sy_tab>.
READ TABLE gd_ztpp001_info INTO gh_ztpp001_info WITH KEY aufnr = <sy_tab>-aufnr BINARY SEARCH.
IF sy-subrc EQ 0 .
<sy_tab>-kostl = gh_ztpp001_info-kostl. ” 成本中心
<sy_tab>-zbmmc = gh_ztpp001_info-zbmmc. ” 成本中心描述
ENDIF.
“实报数量取工序最小的数量
SELECT MIN( a~lmnga ) FROM @lt_afvv AS a WHERE aufpl = @<sy_tab>-aufpl
INTO @<sy_tab>-zsbsl .
* READ TABLE lt_jcds INTO DATA(lw_jcds) WITH KEY objnr = <sy_tab>-objnr .
* IF sy-subrc EQ 0 .
* <sy_tab>-tecodat = lw_jcds-udate .
* ENDIF.
SELECT SINGLE MAX( a~udate ) FROM @lt_jcds AS a WHERE objnr = @<sy_tab>-objnr INTO @DATA(lv_udate).
IF sy-subrc EQ 0 .
<sy_tab>-tecodat = lv_udate .
ENDIF.
READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr .
IF sy-subrc EQ 0.
<sy_tab>-maktx = lw_makt-maktx .
ENDIF.
“物料长文本
PERFORM frm_get_mat_ltext USING <sy_tab>-matnr CHANGING <sy_tab>-matnr_ltext .
READ TABLE lt_makt INTO lw_makt WITH KEY matnr = <sy_tab>-matnr1 .
IF sy-subrc EQ 0.
<sy_tab>-maktx1 = lw_makt-maktx .
ENDIF.
“物料组件物料长文本
PERFORM frm_get_mat_ltext USING <sy_tab>-matnr1 CHANGING <sy_tab>-maktx_ltxt .
READ TABLE lt_xmbm INTO lw_xmbm WITH KEY matnr = <sy_tab>-matnr werks = <sy_tab>-dwerk .
IF sy-subrc EQ 0.
<sy_tab>-zzxmbm = lw_xmbm-zzxmbm .
ENDIF.
* READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = <sy_tab>-kostl .
* IF sy-subrc EQ 0.
* <sy_tab>-ltext = lw_cskt-ltext .
* ENDIF.
<sy_tab>-zwemng = <sy_tab>-psmng – <sy_tab>-wemng.
<sy_tab>-zenmng = <sy_tab>-bdmng – <sy_tab>-enmng.
“报废数量
READ TABLE lt_009 INTO lw_009 WITH KEY aufnr = <sy_tab>-aufnr matnr1 = <sy_tab>-matnr1.
IF sy-subrc EQ 0.
<sy_tab>-zenmng1 = lw_009-bfsl .
ENDIF.
DATA(lv_aufnr) = |{ <sy_tab>-aufnr ALPHA = OUT }|.
DATA(lv_matnr) = |{ <sy_tab>-matnr1 ALPHA = OUT }|.
IF <sy_tab>-zenmng1 IS INITIAL .
READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = lv_aufnr matnr = lv_matnr.
IF sy-subrc EQ 0.
<sy_tab>-zenmng1 = lw_005-bfsl .
ELSE.
READ TABLE lt_005 INTO lw_005 WITH KEY aufnr = <sy_tab>-aufnr matnr = <sy_tab>-matnr1.
IF sy-subrc EQ 0.
<sy_tab>-zenmng1 = lw_005-bfsl .
ENDIF.
ENDIF.
ENDIF.
“库存数量
READ TABLE lt_mard INTO lw_mard WITH KEY matnr = <sy_tab>-matnr1 .
IF sy-subrc EQ 0 .
<sy_tab>-labst = lw_mard-labst .
ENDIF.
“组件单位用量
“开工单的时候如果不手动对工单组件需求数量进行修改,工单生成的预留的ESMNG与原组件BOM单耗一致,与使用可能性和优先级无关。
“如果对工单组件的需求数量进行修改后,预留的ESMNG变成(1-使用可能性)*原BOM单耗。
CALL FUNCTION 'QSS0_FLTP_TO_CHAR_CONVERSION'
EXPORTING
i_number_of_digits = 9
i_fltp_value = <sy_tab>-esmng
IMPORTING
e_char_field = lv_char.
<sy_tab>-zenmng3 = lv_char .
“单位损耗
IF <sy_tab>-ausch IS NOT INITIAL.
<sy_tab>-zausch = <sy_tab>-ausch .” / 100 .
CONCATENATE <sy_tab>-zausch '%' INTO <sy_tab>-zausch .
CONDENSE <sy_tab>-zausch NO-GAPS .
ENDIF.
* CALL FUNCTION 'ROUND'
* EXPORTING
* decimals = 6
* input = lv_menge
* sign = '-'
* IMPORTING
* output = <sy_tab>-zenmng4
* EXCEPTIONS
* input_invalid = 1
* overflow = 2
* type_invalid = 3
* OTHERS = 4.
“报废率
IF <sy_tab>-zenmng1 > 0 AND <sy_tab>-enmng > 0 .
<sy_tab>-zzbfl = <sy_tab>-zenmng1 / <sy_tab>-enmng .
lv_dec = <sy_tab>-zzbfl * 100 .
<sy_tab>-zzbfl = lv_dec .
CONCATENATE <sy_tab>-zzbfl '%' INTO <sy_tab>-zzbfl .
ELSE.
CLEAR:<sy_tab>-zzbfl .
ENDIF.
CLEAR lv_menge.
* DATA(lv_bfsl) = <sy_tab>-bdmng – <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) .
“BOM单位用量(不含报废率)
* lv_menge = ( <sy_tab>-bdmng – lv_bfsl ) / <sy_tab>-psmng.
* lv_menge = <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng .
READ TABLE lt_stpo INTO DATA(lw_stpo) WITH KEY aufnr = <sy_tab>-aufnr matnr1 = <sy_tab>-matnr1 .
IF sy-subrc EQ 0.
lv_menge = lw_stpo-menge / lw_stpo-bmeng .
ELSE.
lv_menge = <sy_tab>-zenmng3 / ( 1 + <sy_tab>-ausch / 100 ) . “BOM表有变化取不到值时计算出来
ENDIF.
<sy_tab>-zenmng4 = lv_menge .
“在制品数量
* 1 组件单位用量
* 2 BOM单位用量(不含报废率)
* READ TABLE lt_012 INTO lw_012 WITH KEY werks = s_dwerk-low .
* IF sy-subrc EQ 0.
* IF lw_012-dwyl = '1'.
* DATA(lv_dwyl) = <sy_tab>-zenmng3. “组件单位用量
* ELSEIF lw_012-dwyl = '2'.
* lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
* ENDIF.
* ELSE.
* “没维护,默认
* IF s_dwerk-low = '1001'.
* lv_dwyl = <sy_tab>-zenmng3. “组件单位用量
* ELSEIF s_dwerk-low = '1002' .
* lv_dwyl = <sy_tab>-zenmng4. “BOM单位用量(不含报废率)
* ENDIF.
* ENDIF.
* <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-wemng * lv_dwyl ) – <sy_tab>-zenmng1 .
* ENMNG发放量 – ( BDMNG需求数量 / PSMNG已订购量) * WEMNG完成数量 * (1-AUSCH单位损耗/100) – ZENMNG1报废数量
* <sy_tab>-zenmng2 = <sy_tab>-enmng – ( <sy_tab>-bdmng / <sy_tab>-psmng ) * <sy_tab>-wemng * ( 1 – <sy_tab>-ausch / 100 ) – <sy_tab>-zenmng1 .
* 在制数量的计算逻辑:
* ABU:在制数 = 已领数 – 需求数 / 订购数 * 已入库数 – 报废数
* CBU:在制数 = 已领数 – 需求数/(1+损耗%) / 订购数 * 已入库数 – 报废数
* IF s_dwerk-low = '1001'.
* <sy_tab>-zenmng2 = <sy_tab>-enmng – <sy_tab>-bdmng / <sy_tab>-psmng * <sy_tab>-wemng – <sy_tab>-zenmng1 .
* ELSEIF s_dwerk-low = '1002'.
* <sy_tab>-zenmng2 = <sy_tab>-enmng – <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng * <sy_tab>-wemng – <sy_tab>-zenmng1 .
* ENDIF.
“10.14,统一计算公式
<sy_tab>-zenmng2 = <sy_tab>-enmng – <sy_tab>-bdmng / ( 1 + <sy_tab>-ausch / 100 ) / <sy_tab>-psmng * <sy_tab>-wemng – <sy_tab>-zenmng1 .
IF <sy_tab>-meins = 'EA'.
IF <sy_tab>-zenmng2 < 0 .
<sy_tab>-zenmng2 = ceil( <sy_tab>-zenmng2 ) .
ELSE.
<sy_tab>-zenmng2 = floor( <sy_tab>-zenmng2 ) .
ENDIF.
ENDIF.
IF <sy_tab>-dauat = 'CJ01' AND <sy_tab>-bwart = '531' AND <sy_tab>-enmng > 0.”20211210_LYS
<sy_tab>-bdmng = <sy_tab>-bdmng * -1 .
<sy_tab>-enmng = <sy_tab>-enmng * -1 .
<sy_tab>-zenmng2 = <sy_tab>-zenmng2 * -1 .
ENDIF.
“8131, 无物料号工单时的处理逻辑
IF <sy_tab>-dwerk = '8131' AND <sy_tab>-matnr IS INITIAL .
<sy_tab>-bdmng = <sy_tab>-bdmng * -1 . “需求数量
<sy_tab>-enmng = <sy_tab>-enmng * -1 . “发放量
<sy_tab>-zenmng2 = <sy_tab>-zenmng2 * -1 . “在制品数量
ENDIF.
“单龄
* IF <sy_tab>-ftrmi IS NOT INITIAL .
* <sy_tab>-zzdl = <sy_tab>-ftrmi – sy-datum .
* ENDIF.
IF <sy_tab>-ftrmi IS NOT INITIAL .
IF <sy_tab>-dwerk = '8021' OR <sy_tab>-dwerk = '8022'.
<sy_tab>-ftrmi = <sy_tab>-gstrp.
<sy_tab>-zzdl = <sy_tab>-gstrp – sy-datum.
ELSE.
<sy_tab>-zzdl = <sy_tab>-ftrmi – sy-datum .
ENDIF.
“TECO状态以TECO日期-当前日期.
IF <sy_tab>-tecodat IS NOT INITIAL .
<sy_tab>-zzdl = <sy_tab>-ftrmi – <sy_tab>-tecodat .
ENDIF.
ELSE.
CLEAR <sy_tab>-zzdl .
ENDIF.
IF <sy_tab>-zzt = 'TECO' AND <sy_tab>-idat2 IS NOT INITIAL.
CLEAR <sy_tab>-idat2 .
ENDIF.
AT NEW aufnr.
IF <sy_tab>-zzt = 'REL'.
<sy_tab>-btn = '@3X@关闭工单'.
ENDIF.
ENDAT.
ENDLOOP.
ENDFORM.
*&———————————————————————*
*& Form frm_check_auth
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_check_auth .
* DATA:lt_values TYPE TABLE OF us335 WITH HEADER LINE .
* CLEAR:gw_info .
*
* CLEAR:gt_msg,gt_msg[].
* gt_msg-msgid = '00' .
* gt_msg-msgty = 'E' .
* gt_msg-msgno = '001' .
*
* AUTHORITY-CHECK OBJECT 'ZAUTMM_PRS' ID 'ZACTIVE' FIELD 'X'.
* IF sy-subrc NE 0. “价格权限
* gw_info-zaopp_prs = 'X'.
* ENDIF.
ENDFORM.
*&———————————————————————*
*& Form frm_search_ltext
*&———————————————————————*
*& text
*&———————————————————————*
*& –> p1 text
*& <– p2 text
*&———————————————————————*
FORM frm_search_ltext .
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'CSKT'
fieldname = 'LTEXT'
searchhelp = 'ZSH_CSKT_LTEXT'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_LTEXT'
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
ENDFORM.
*&———————————————————————*
*& Form frm_get_aufnr
*&———————————————————————*
*& text
*&———————————————————————*
*& –> <SY_TAB>
*& –> FLG_GET
*&———————————————————————*
FORM frm_get_aufnr TABLES pt_cskt USING pv_tab LIKE LINE OF gt_tab.
* DATA:lw_objects TYPE bapi_pp_order_objects,
* lt_header TYPE TABLE OF bapi_order_header1 WITH HEADER LINE,
* lt_operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE,
* lw_return TYPE bapiret2.
*
* DATA:BEGIN OF lt_cskt OCCURS 0 .
* DATA:kostl TYPE cskt-kostl,
* ltext TYPE cskt-ltext,
* END OF lt_cskt .
*
* READ TABLE gt_anr WITH KEY aufnr = pv_tab-aufnr .
* IF sy-subrc EQ 0.
* MOVE-CORRESPONDING gt_anr TO pv_tab .
* RETURN.
* ENDIF.
*
* lt_cskt[] = pt_cskt[].
*
*
* CLEAR pv_tab-flg .
* lw_objects-header = 'X' .
* lw_objects-operations = 'X' .
*
* CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
* EXPORTING
* number = pv_tab-aufnr
* order_objects = lw_objects
* IMPORTING
* return = lw_return
* TABLES
* header = lt_header
* operation = lt_operation.
*
* LOOP AT lt_header.
*
* DATA(routing_no) = lt_header-routing_no .
* DATA(plant) = lt_header-production_plant .
*
* IF lt_header-system_status CS '删除' . lt_header-system_status = '删除' . ENDIF.
* IF lt_header-system_status CS '标记' . lt_header-system_status = '标记' . ENDIF.
* IF lt_header-system_status CS '结算' . lt_header-system_status = '结算' . ENDIF.
* IF lt_header-system_status CS '锁定' . lt_header-system_status = '锁定' . ENDIF.
*
* REPLACE 'RELR' INTO lt_header-system_status WITH ''.
* pv_tab-zzt = lt_header-system_status .
* IF all = 'X' AND
* ( lt_header-system_status CS 'CRTD' OR lt_header-system_status CS 'REL' OR lt_header-system_status CS 'TECO'
* OR lt_header-system_status CS '锁定' OR lt_header-system_status CS '结算' OR lt_header-system_status CS '删除'
* OR lt_header-system_status CS '标记' ).
* pv_tab-flg = ''.
* EXIT .
* ELSEIF all = '' AND ( flag = 'X' OR del = 'X' OR lock = 'X' OR close = 'X' OR crtd = 'X' OR rel = 'X' OR teco = 'X') .
* pv_tab-flg = 'X' .
* IF flag = 'X' AND lt_header-system_status CS '标记'.
* pv_tab-flg = '' .
* ENDIF.
* IF del = 'X' AND lt_header-system_status CS '删除'.
* pv_tab-flg = '' .
* ENDIF.
* IF lock = 'X' AND lt_header-system_status CS '锁定'.
* pv_tab-flg = '' .
* ENDIF.
* IF close = 'X' AND lt_header-system_status CS '结算'.
* pv_tab-flg = '' .
* ENDIF.
* IF crtd = 'X' AND lt_header-system_status CS 'CRTD'.
* pv_tab-flg = '' .
* ENDIF.
* IF rel = 'X' AND lt_header-system_status CS 'REL'.
* pv_tab-flg = '' .
* ENDIF.
* IF teco = 'X' AND lt_header-system_status CS 'TECO'.
* pv_tab-flg = '' .
* ENDIF.
* ELSE.
* pv_tab-zzt = ''.
* pv_tab-flg = 'X' .
* RETURN .
* ENDIF.
*
*
* ENDLOOP.
*
* LOOP AT lt_operation WHERE routing_no = routing_no AND system_status NS '删除' AND work_center <> ''.
* DATA(work_center) = lt_operation-work_center .
* EXIT .
* ENDLOOP.
*
* IF work_center NOT IN s_arbpl.
* pv_tab-flg = 'X' .
* RETURN .
* ENDIF.
* pv_tab-arbpl = work_center .
*
* SELECT SINGLE kostl INTO @DATA(lv_kostl) FROM crhd INNER JOIN crco ON crhd~objid = crco~objid
* WHERE arbpl = @work_center AND werks = @plant .
*
* pv_tab-routing_no = routing_no .
* pv_tab-kostl = lv_kostl .
*
*
* IF lt_cskt[] IS NOT INITIAL.
* DATA:lw_cskt LIKE LINE OF lt_cskt .
* READ TABLE lt_cskt INTO lw_cskt WITH KEY kostl = lv_kostl .
* IF sy-subrc NE 0.
* pv_tab-flg = 'X' .
* RETURN .
* ENDIF.
* ENDIF.
*
* DEFINE marco_anr_txt.
* IF lt_header-system_status CS &1 .”'CRTD' .
* pv_tab-zzt = &2 .”'创建' .
* ENDIF.
* END-OF-DEFINITION.
* marco_anr_txt:'CRTD' '已创建',
* 'REL' '已下达' ,
* 'TECO' '技术关闭' ,
* '标记' '标记' ,
* '删除' '删除' ,
* '锁定' '锁定' ,
* '结算' '已财务结算' .
*
* INSERT VALUE #( aufnr = pv_tab-aufnr
* zzt = pv_tab-zzt
* flg = pv_tab-flg
* arbpl = pv_tab-arbpl
* routing_no = pv_tab-routing_no
* kostl = pv_tab-kostl ) INTO TABLE gt_anr.
*
*
ENDFORM.
*&———————————————————————*
*& Form frm_get_aufnr_a
*&———————————————————————*
*& text
*&———————————————————————*
*& –> <SY_TAB>
*&———————————————————————*
FORM frm_get_aufnr_a USING pv_tab LIKE LINE OF gt_tab.
DATA:lv_zzt TYPE char4 .
CHECK flg_query NE 'X' .
“查询工单状态
LOOP AT gt_tab INTO DATA(tmp_tab) WHERE aufnr = pv_tab-aufnr AND zzt <> ''.
DATA(query_flg) = 'X' .
pv_tab-zzt = tmp_tab-zzt .
pv_tab-sttxt = tmp_tab-sttxt .
EXIT .
ENDLOOP.
IF query_flg NE 'X' .
CALL FUNCTION 'Z_FMPP_013'
EXPORTING
objnr = pv_tab-objnr
* AUFNR =
IMPORTING
status = pv_tab-zzt
sttxt = pv_tab-sttxt.
CASE pv_tab-zzt .
WHEN '标记'.
IF ( crtd = 'X' OR rel = 'X' ) AND flag = '' . pv_tab-flg = 'X'. ENDIF .
WHEN '删除'.
IF ( crtd = 'X' OR rel = 'X' ) AND del = '' . pv_tab-flg = 'X'. ENDIF .
WHEN '结算'.
IF ( crtd = 'X' OR rel = 'X' ) AND close = '' . pv_tab-flg = 'X'. ENDIF .
WHEN '锁定'.
IF ( crtd = 'X' OR rel = 'X' ) AND lock = '' . pv_tab-flg = 'X'. ENDIF .
ENDCASE.
ENDIF.
CLEAR query_flg .
“查询组件状态
IF ( crtd = '' AND rel = '' ) OR all = 'X' .
DATA: item_zt TYPE char4 .
CALL FUNCTION 'Z_FMPP_013'
EXPORTING
objnr = pv_tab-item_objnr
* AUFNR =
IMPORTING
status = item_zt.
CASE item_zt .
WHEN '删除'.
pv_tab-flg = 'X'.
ENDCASE.
ENDIF.
CHECK pv_tab-arbpl IS INITIAL OR pv_tab-ltext IS INITIAL .
DATA:lw_objects TYPE bapi_pp_order_objects,
lt_header TYPE TABLE OF bapi_order_header1 WITH HEADER LINE,
lt_operation TYPE TABLE OF bapi_order_operation1 WITH HEADER LINE,
lw_return TYPE bapiret2.
lw_objects-header = 'X' .
lw_objects-operations = 'X' .
CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
EXPORTING
number = pv_tab-aufnr
order_objects = lw_objects
IMPORTING
return = lw_return
TABLES
header = lt_header
operation = lt_operation.
CHECK lt_header[] IS NOT INITIAL .
DATA(routing_no) = lt_header[ 1 ]-routing_no .
DATA(plant) = lt_header[ 1 ]-production_plant .
LOOP AT lt_operation WHERE routing_no = routing_no AND system_status NS '删除' AND work_center <> ''.
DATA(work_center) = lt_operation-work_center . ” ARBPL
EXIT .
ENDLOOP.
SELECT SINGLE ltext, m_cramn~ktext, crhd~arbpl ,crco~kostl INTO @DATA(lw_info)
FROM crhd INNER JOIN crco ON crhd~objid = crco~objid
INNER JOIN cskt ON crco~kostl = cskt~kostl AND spras = @sy-langu
INNER JOIN m_cramn ON crhd~arbpl = m_cramn~arbpl AND crhd~werks = m_cramn~werks
* WHERE crhd~objid = @pv_tab-objid .”AND werks = @plant .
WHERE crhd~arbpl = @work_center AND crhd~werks = @plant .
pv_tab-arbpl = lw_info-arbpl .
pv_tab-ltext = lw_info-ltext .
UPDATE ztpp001_info SET zbmmc = lw_info-ltext kostl = lw_info-kostl zgzzx = lw_info-arbpl ktext = lw_info-ktext
WHERE aufnr = pv_tab-aufnr .
COMMIT WORK .
ENDFORM.
*&———————————————————————*
*& Form frm_get_mat_ltext
*&———————————————————————*
*& text
*&———————————————————————*
*& –> <SY_TAB>_MATNR
*& <– <SY_TAB>_LTEXT
*&———————————————————————*
FORM frm_get_mat_ltext USING pv_matnr
CHANGING pv_ltext1.
DATA:lt_tline LIKE tline OCCURS 0 WITH HEADER LINE.
DATA:l_tdname LIKE stxh-tdname.
CHECK flg_query NE 'X' .
l_tdname = pv_matnr.
SELECT SINGLE * FROM stxh
WHERE tdobject = 'MATERIAL' AND tdname = l_tdname AND tdid = 'GRUN'.
IF sy-subrc EQ 0.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = sy-mandt
id = 'GRUN'
language = sy-langu
name = l_tdname
object = 'MATERIAL'
TABLES
lines = lt_tline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc EQ 0.
LOOP AT lt_tline.
CONCATENATE pv_ltext1 ' ' lt_tline-tdline INTO pv_ltext1.
CONDENSE pv_ltext1.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM.
*&———————————————————————*
*& Form handle_link_click
*&———————————————————————*
*& text
*&———————————————————————*
*& –> ROW
*& –> COLUMN
*&———————————————————————*
FORM handle_link_click USING p_row p_column.
READ TABLE gt_tab_show INTO DATA(lw_tab) INDEX p_row .
CHECK sy-subrc EQ 0 .
IF p_column = 'AUFNR' AND lw_tab-aufnr <> ''.
SET PARAMETER ID 'ANR' FIELD lw_tab-aufnr.
CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
ELSEIF p_column = 'ZENMNG2' .”在制数量
DATA(tmp_text) = '在制品数量 = 发放量 – 需求数量 / ( 1 + 单位损耗/100 ) / 已订购量 * 完成数量 – 报废数量'.
DATA(tmp_qty) = lw_tab-zenmng2 && ' = ' && lw_tab-enmng && ' – ' && lw_tab-bdmng && ' / ( 1 + ' && lw_tab-zausch && ' / 100 ) / ' && lw_tab-psmng && ' * ' && lw_tab-wemng && ' – ' && lw_tab-zenmng1 .
cl_demo_output=>new(
)->begin_section( `在制品数量`
)->write_text( |{ tmp_text }
| && |{ tmp_qty }|
)->display( ).
ELSEIF p_column = 'BTN'.
* BREAK guoxiongjie .
IF lw_tab-btn+0(4) = '@3X@'.
BREAK guoxiongjie .
DATA lv_answer TYPE char1 .
DATA lt_tab LIKE TABLE OF gt_tab .
lt_tab[] = gt_tab_show[] .
DELETE lt_tab WHERE aufnr <> lw_tab-aufnr .
SELECT SUM( a~bdmng ) AS bdmng ,SUM( a~enmng ) AS enmng
FROM @lt_tab AS a INTO @DATA(tmp_tab) .
SELECT SINGLE a~aufnr FROM @lt_tab AS a
WHERE zenmng2 <> 0
INTO @DATA(tmp_anfnr) .
IF sy-subrc EQ 0.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = '操作提示'
text_question = '工单在制数量不为0,是否继续?'
text_button_1 = '是'
text_button_2 = '否'
display_cancel_button = ''
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
CHECK lv_answer = 1 .
ENDIF.
* DATA lv_answer TYPE char1 .
DATA: line1(46) TYPE c .
DATA: line2(44) TYPE c .
DATA: line3(44) TYPE c .
DATA: line4(44) TYPE c .
DATA: line5(40) TYPE c .
DATA: line6(40) TYPE c .
DATA: text TYPE string .
DATA(zwf) = '…………………………………….' .
line1 = |工 单:{ lw_tab-aufnr ALPHA = OUT }{ zwf }| .
line2 = |已订购数:{ lw_tab-psmng }{ zwf }|.
line3 = |完成数量:{ lw_tab-wemng }{ zwf }|.
line4 = |实报数量:{ lw_tab-zsbsl }{ zwf }|.
line5 = |组件-需求数量(合计):{ tmp_tab-bdmng }{ zwf }|.
line6 = |组件-发 放 量(合计):{ tmp_tab-enmng }{ zwf }|.
text = |{ line1 }{ line2 }{ line3 }{ line4 }{ line5 }{ line6 } 对工单执行TECO,是否继续?|.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = '提示'
text_question = text
text_button_1 = '是'
text_button_2 = '否'
display_cancel_button = ''
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF lv_answer = 1 .
DATA: t_order TYPE TABLE OF bapi_order_key .
DATA: t_return TYPE TABLE OF bapi_order_return .
t_order = VALUE #( ( order_number = lw_tab-aufnr ) ) .
CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
TABLES
orders = t_order
detail_return = t_return.
READ TABLE t_return INTO DATA(w_return) WITH KEY type = 'E'.
IF sy-subrc EQ 0.
MESSAGE w_return-message TYPE 'S' DISPLAY LIKE 'E' .
ELSE.
CLEAR: lw_tab .
lw_tab-btn = '@ME@已执行' .
CALL FUNCTION 'Z_FMPP_013'
EXPORTING
aufnr = t_order[ 1 ]-order_number
IMPORTING
status = lw_tab-zzt
sttxt = lw_tab-sttxt.
MODIFY gt_tab_show FROM lw_tab TRANSPORTING btn zzt sttxt WHERE aufnr = t_order[ 1 ]-order_number .
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( 'X' ).
CALL METHOD gr_table->refresh
EXPORTING
s_stable = VALUE #( row = 'X' col = 'X' )
refresh_mode = if_salv_c_refresh=>soft.
gr_table->refresh( ).
MESSAGE '技术上完成 已执行' TYPE 'S'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&———————————————————————*
*& Form handle_user_command
*&———————————————————————*
*& text
*&———————————————————————*
*& –> E_SALV_FUNCTION
*&———————————————————————*
FORM handle_user_command USING e_salv_function.
IF e_salv_function = '&REFRESH' .
gr_columns = gr_table->get_columns( ).
gr_columns->set_optimize( 'X' ).
CALL METHOD gr_table->refresh
EXPORTING
s_stable = VALUE #( row = 'X' col = 'X' )
refresh_mode = if_salv_c_refresh=>soft.
ENDIF.
ENDFORM.


