工艺路线标准工时报表

转自: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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值