转自:http://iamskay.blog.163.com/blog/static/1337975632010612242110/
*&---------------------------------------------------------------------*
* Programe name: ZPR03
* T-Code : *****
* Description : 工艺路线标准工时报表
* Author : *****
* Date : 2010-03-04
* Request NO. : C01K905748
*---------------------------------------------------------------------*
* Modification Log
* Date Author Num Description
* 2010-03-04 ***** 001 New Create
*---------------------------------------------------------------------*
REPORT ZPR03 NO STANDARD PAGE HEADING.
*---------------------------------------------------------------------*
*Tables defination
*---------------------------------------------------------------------*
TABLES: MARA, MARC, MAPL, PLAS, PLPO, CRHD, CRTX.
*---------------------------------------------------------------------*
*Type pools defination
*---------------------------------------------------------------------*
type-pools: slis.
*---------------------------------------------------------------------*
*Data defination
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*Inner table and Workspace defination
*---------------------------------------------------------------------*
DATA: BEGIN OF TD_DISP OCCURS 0,
SECT TYPE C, "显示选择用
WERKS TYPE T001W-WERKS, "工厂
MTART TYPE MARA-MTART, "物料类型
FERTH TYPE MARA-FERTH, "生产/检验备忘录(客户)
MATNR TYPE MARA-MATNR, "物料
MATNR_EXT TYPE MATNR_EXT,
MAKTX TYPE MAKT-MAKTX, "物料描述
PLNAL TYPE PLAS-PLNAL, "组计数器
ARBPL TYPE CRHD-ARBPL, "工作中心
VGW02 TYPE PLPO-VGW02, "标准工时
ANZMA TYPE PLPO-ANZMA, "雇员数量
USR00 TYPE PLPO-USR00, "线外人数
CAPAC TYPE PLPO-BMSCH, "标准产能
ROWCL TYPE CHAR4,
END OF TD_DISP.
DATA:TD_FIELDCAT TYPE TABLE OF SLIS_FIELDCAT_ALV WITH HEADER LINE,
TD_LAYOUT TYPE SLIS_LAYOUT_ALV.
*---------------------------------------------------------------------*
*Screen defination
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-S01.
PARAMETERS P_WERKS TYPE MARC-WERKS OBLIGATORY DEFAULT '1002'.
SELECT-OPTIONS S_MTART FOR MARA-MTART. "物料类型
SELECT-OPTIONS S_FERTH FOR MARA-FERTH. "生产/检验备忘录
SELECT-OPTIONS S_MATNR FOR MARA-MATNR. "物料
SELECT-OPTIONS S_ARBPL FOR CRHD-ARBPL. "工作中心
SELECTION-SCREEN END OF BLOCK BK1.
*---------------------------------------------------------------------*
*AT SELECTION-SCREEN ON
*---------------------------------------------------------------------*
AT SELECTION-SCREEN ON P_WERKS.
PERFORM FRM_CHECK_INPUT_WERKS.
*---------------------------------------------------------------------*
*Start-of-selection
*---------------------------------------------------------------------*
START-OF-SELECTION.
* 根据选择条件,取得数据
PERFORM FRM_GET_DATA.
* 设置显示格式
PERFORM FRM_SET_LAYOUT.
* 显示数据
PERFORM FRM_DISPLAY_DATA.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_INPUT_WERKS
*&---------------------------------------------------------------------*
* 检查工厂的输入
*----------------------------------------------------------------------*
form FRM_CHECK_INPUT_WERKS .
DATA: LW_WERKS TYPE T001W-WERKS.
SELECT SINGLE WERKS
INTO LW_WERKS
FROM T001W
WHERE WERKS = P_WERKS.
IF SY-SUBRC <> 0.
MESSAGE TEXT-M01 TYPE 'S'.
STOP.
ENDIF.
endform. " FRM_CHECK_INPUT_WERKS
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* 根据选择条件,取得数据
*----------------------------------------------------------------------*
form FRM_GET_DATA .
DATA: BEGIN OF TD_MATNR OCCURS 0,
WERKS TYPE MARC-WERKS, "工厂
MTART TYPE MARA-MTART, "物料类型
FERTH TYPE MARA-FERTH, "生产/检验备忘录(客户)
MATNR TYPE MARA-MATNR, "物料
MAKTX TYPE MAKT-MAKTX, "物料描述
END OF TD_MATNR.
DATA: BEGIN OF TD_TIME OCCURS 0,
MATNR TYPE MAPL-MATNR,
WERKS TYPE MAPL-WERKS,
PLNTY TYPE PLAS-PLNTY, "任务清单类型
PLNNR TYPE PLAS-PLNNR, "任务清单组码
PLNAL TYPE PLAS-PLNAL, "
PLNKN TYPE PLAS-PLNKN, "任务清单节点数
ZAEHL TYPE PLAS-ZAEHL, "内部计数器
VGW02 TYPE PLPO-VGW02, "机器工时
VGE02 TYPE PLPO-VGE02, "机器工时单位
ANZMA TYPE PLPO-ANZMA, "雇员数量
BMSCH TYPE PLPO-BMSCH, "基本数量
MEINH TYPE PLPO-MEINH, "作业/工序的计量单位
* UMREZ TYPE PLPO-UMREZ, "计量单位转换:表头
* UMREN TYPE PLPO-UMREN, "计量单位转换:工序
USR00 TYPE PLPO-USR00, "线外人数
ARBID TYPE PLPO-ARBID, "对象标识
ARBPL TYPE CRHD-ARBPL, "工作中心
END OF TD_TIME.
IF SY-BATCH <> 'X'.
call function 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 20
TEXT = '取得物料数据……'.
ENDIF.
* 取得物料数据
SELECT MARC~WERKS "工厂
MARA~MTART "物料类型
MARA~FERTH "客户
MARA~MATNR "物料
MAKT~MAKTX "物料描述
INTO TABLE TD_MATNR
FROM MARA INNER JOIN MARC
ON MARA~MATNR = MARC~MATNR
AND MARC~WERKS = P_WERKS
INNER JOIN MAKT
ON MARA~MATNR = MAKT~MATNR
AND MAKT~SPRAS = SY-LANGU
INNER JOIN MAPL
ON MARC~MATNR = MAPL~MATNR
AND MARC~WERKS = MAPL~WERKS
WHERE MARA~MATNR IN S_MATNR
AND MARA~MTART IN S_MTART
AND MARA~FERTH IN S_FERTH
AND MAPL~PLNTY = 'N'.
IF TD_MATNR[] IS INITIAL.
MESSAGE TEXT-M02 TYPE 'S'.
STOP.
ENDIF.
SORT TD_MATNR BY WERKS MATNR.
DELETE ADJACENT DUPLICATES FROM TD_MATNR COMPARING WERKS MATNR.
IF SY-BATCH <> 'X'.
call function 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 40
TEXT = '取得工时数据……'.
ENDIF.
* 取得工时数据
SELECT MAPL~MATNR "物料
MAPL~WERKS "工厂
PLAS~PLNTY "Task List Type
PLAS~PLNNR "Key for Task List Group
PLAS~PLNAL "Group Counter
PLAS~PLNKN "Number of the task list node
PLAS~ZAEHL "Internal counter
PLPO~VGW02 "标准工时
PLPO~VGE02 "标准工时单位
PLPO~ANZMA "Number of employees
PLPO~BMSCH "Base Quantity
PLPO~MEINH "Unit of Measure for Activity/Operation
PLPO~USR00 "线外人员
PLPO~ARBID "Object ID
CRHD~ARBPL "Work center
INTO TABLE TD_TIME
FROM MAPL INNER JOIN PLAS ON
MAPL~PLNTY = PLAS~PLNTY
AND MAPL~PLNNR = PLAS~PLNNR
AND MAPL~PLNAL = PLAS~PLNAL
AND PLAS~LOEKZ NE 'X'
INNER JOIN PLPO ON
PLAS~PLNTY = PLPO~PLNTY
AND PLAS~PLNNR = PLPO~PLNNR
AND PLAS~PLNKN = PLPO~PLNKN
AND PLAS~ZAEHL = PLPO~ZAEHL
AND PLPO~WERKS = P_WERKS
AND PLPO~LOEKZ NE 'X'
AND PLPO~CKSELKZ EQ 'X'
INNER JOIN CRHD ON
PLPO~ARBID = CRHD~OBJID
AND CRHD~WERKS = P_WERKS
AND CRHD~OBJTY = 'A'
* FOR ALL ENTRIES IN TD_MATNR
WHERE MAPL~WERKS = P_WERKS
AND MAPL~PLNTY EQ 'N'
AND MAPL~LOEKZ NE 'X'
* AND MAPL~MATNR = TD_MATNR-MATNR
AND MAPL~MATNR IN S_MATNR
AND MAPL~LOEKZ NE 'X'
AND MAPL~PLNTY EQ 'N'
AND PLPO~STEUS IN ('ZP01','ZP04','PP03')
AND CRHD~ARBPL IN S_ARBPL.
* READ TABLE TD_MATNR WITH KEY MATNR = TD_TIME-MATNR BINARY SEARCH.
* IF SY-SUBRC = 0.
* APPEND TD_TIME.
* ELSE.
* CONTINUE.
* ENDIF.
* ENDSELECT.
IF SY-BATCH <> 'X'.
call function 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 60
TEXT = '计算工时数据和产能……'.
ENDIF.
DATA: LW_ROWCL TYPE CHAR4 VALUE 'C210'.
DATA: FLG TYPE C VALUE SPACE.
REFRESH: TD_DISP[].
LOOP AT TD_MATNR.
TD_DISP-WERKS = TD_MATNR-WERKS. "工厂
TD_DISP-MTART = TD_MATNR-MTART. "物料类型
TD_DISP-FERTH = TD_MATNR-FERTH. "生产/检验备忘录(客户)
TD_DISP-MATNR = TD_MATNR-MATNR. "物料
TD_DISP-MAKTX = TD_MATNR-MAKTX. "物料描述
IF LW_ROWCL <> 'C410' AND FLG = 'X'.
LW_ROWCL = 'C410'.
FLG = SPACE.
ELSEIF LW_ROWCL <> 'C210' AND FLG = 'X'.
LW_ROWCL = 'C210'.
FLG = SPACE.
ENDIF.
TD_DISP-ROWCL = LW_ROWCL.
LOOP AT TD_TIME WHERE MATNR = TD_MATNR-MATNR AND
WERKS = TD_MATNR-WERKS.
FLG = 'X'.
TD_DISP-PLNAL = TD_TIME-PLNAL. "组计数器
TD_DISP-ARBPL = TD_TIME-ARBPL. "工作中心
IF TD_TIME-BMSCH <> 0.
TD_DISP-VGW02 = TD_TIME-VGW02 / TD_TIME-BMSCH.
ENDIF.
IF TD_TIME-VGE02 = 'H'.
TD_DISP-VGW02 = TD_DISP-VGW02 * 3600.
ELSEIF TD_TIME-VGE02 = 'MIN'.
TD_DISP-VGW02 = TD_DISP-VGW02 * 60.
ENDIF.
TD_DISP-ANZMA = TD_TIME-ANZMA.
TD_DISP-USR00 = TD_TIME-USR00.
IF TD_DISP-VGW02 <> 0.
TD_DISP-CAPAC = 3600 / TD_DISP-VGW02.
ENDIF.
call function 'CONVERSION_EXIT_MATN1_OUTPUT'
exporting
input = TD_DISP-MATNR
IMPORTING
OUTPUT = TD_DISP-MATNR_EXT .
APPEND TD_DISP.
CLEAR: TD_TIME.
ENDLOOP.
CLEAR: TD_DISP.
ENDLOOP.
IF TD_DISP[] IS INITIAL.
MESSAGE TEXT-M03 TYPE 'S'.
STOP.
ENDIF.
endform. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
* 设置显示格式
*----------------------------------------------------------------------*
form FRM_SET_LAYOUT .
* 设定显示字段
REFRESH TD_FIELDCAT[].
PERFORM SUB_FILL_FIELDCAT_ALV USING:
'TD_DISP' 'WERKS' SPACE SPACE '工厂',
'TD_DISP' 'MTART' SPACE SPACE '物料类型',
'TD_DISP' 'FERTH' SPACE SPACE '客户',
'TD_DISP' 'MATNR_EXT' SPACE SPACE '物料',
'TD_DISP' 'MAKTX' SPACE SPACE '物料描述',
'TD_DISP' 'PLNAL' SPACE SPACE '组计数器',
'TD_DISP' 'ARBPL' SPACE SPACE '工作中心',
'TD_DISP' 'VGW02' SPACE SPACE '标准工时(S)',
'TD_DISP' 'ANZMA' SPACE SPACE '雇员数量',
'TD_DISP' 'USR00' SPACE SPACE '线外人数',
'TD_DISP' 'CAPAC' SPACE SPACE '标准产能'.
* 设定显示控制
CLEAR TD_LAYOUT.
TD_LAYOUT-ZEBRA = 'X'.
TD_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
TD_LAYOUT-BOX_FIELDNAME = 'SECT'.
TD_LAYOUT-INFO_FIELDNAME = 'ROWCL'.
TD_LAYOUT-WINDOW_TITLEBAR = '工艺路线标准工时报表'.
endform. " FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
* 显示数据
*----------------------------------------------------------------------*
form FRM_DISPLAY_DATA .
call function 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT = TD_LAYOUT
IT_FIELDCAT = TD_FIELDCAT[]
I_DEFAULT = 'X'
I_SAVE = 'A'
tables
t_outtab = TD_DISP[]
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. " FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& Form SUB_FILL_FIELDCAT_ALV
*&---------------------------------------------------------------------*
* 填充显示字段
*----------------------------------------------------------------------*
form SUB_FILL_FIELDCAT_ALV USING VALUE(I_TABNAME)
VALUE(I_FIELDNAME)
VALUE(I_QTABNAME)
VALUE(I_QFIELDNAME)
VALUE(I_SELTEXT_M).
CLEAR:
TD_FIELDCAT.
TD_FIELDCAT-TABNAME = I_TABNAME.
TD_FIELDCAT-FIELDNAME = I_FIELDNAME.
TD_FIELDCAT-QTABNAME = I_QTABNAME.
TD_FIELDCAT-QFIELDNAME = I_QFIELDNAME.
TD_FIELDCAT-SELTEXT_M = I_SELTEXT_M.
APPEND TD_FIELDCAT.
endform.