三层BOM

Code listing for: ZPPR001 
Description: 三层BOM显示报表


*======================================================================*
* T-Code:         ZPPR001                                           *
* Program Name    ZPPR001                                             *
* DESCRIPTION:      三层BOM显示报表                                  *
*                                                                      *
* TYPE:             Report                                             *
* APPLICATION AREA: PP                                                 *
*----------------------------------------------------------------------*
* FUNCTION:         显示三层BOM显示报表,方便导入新bom                            *
*                                                                      *
*----------------------------------------------------------------------*
* MODIFICATION LOG:                                                    *
* VER  DD/MM/YY  Author         DESCRIPTION             CHANGE REQUEST *
* ---  --------  -------------  ----------------------  ---------------*
* 000  25/07/13  libo           Initial release          DEVK906922    *
*----------------------------------------------------------------------*


REPORT  zppr001 NO STANDARD PAGE HEADING.
TABLES:mast,
       mara.
DATA:BEGIN OF gt_output OCCURS 0,
        werks LIKE mast-werks,      "工厂
        matnr LIKE mast-matnr,      "物料号
        maktx1 LIKE makt-maktx,     "物料描述
        stlan LIKE mast-stlan,      "BOM用途
        stlal LIKE mast-stlal,      "可选的BOM
        stktx LIKE stko-stktx,      "可选BOM文本
        bmeng(18),                  "BOM基本数量
        bmein LIKE  stpox-mmein,     "BOM基本数量单位 MMEIN
        posnr LIKE stpo-posnr,      "BOM 项目号
        idnrk LIKE stpo-idnrk,      "组件
        maktx LIKE makt-maktx,      "描述
        mnglg LIKE stpox-mnglg,      "组件数量
        meins LIKE stpox-meins,     "组件数量单位
        lgort LIKE  stpox-lgort,     "生产仓储地点
        brgew LIKE mara-brgew,      "毛重
        ntgew LIKE mara-ntgew,       "净重
        level TYPE char1,"层级
     END OF gt_output.

DATA:gt_data LIKE STANDARD TABLE OF gt_output WITH HEADER LINE.
DATA:gt_stb LIKE STANDARD TABLE OF stpox WITH HEADER LINE.
include zincalv.
DATA: BEGIN OF gt_stpo OCCURS 0,
        werks LIKE mast-werks,
        matnr LIKE mast-matnr,
        maktx1 LIKE makt-maktx,
        bmeng LIKE  stko-bmeng,     "BOM基本数量
        bmein LIKE  stko-bmein,     "BOM基本数量单位
        stlan LIKE mast-stlan,      "BOM用途
        stlnr LIKE mast-stlnr,      "物料单
        stlty LIKE stpo-stlty,
        stlkn LIKE stpo-stlkn,
        stpoz LIKE stpo-stpoz,
        stlal LIKE mast-stlal,      "可选的BOM
        stktx LIKE stko-stktx,      "可选文字 002 add
        posnr LIKE stpo-posnr,      "BOM 项目号
        postp LIKE stpo-postp,      "项目类别(物料单)
        oidnrk LIKE stpo-idnrk,      "old组件
        omaktx LIKE makt-maktx,      "old描述
        omenge LIKE stpo-menge,      "old组件数量
        omeins LIKE  stpo-meins,     "old组件数量单位
        olgort LIKE  stpo-lgort,     "old生产仓储地点
        idnrk LIKE stpo-idnrk,      "组件
        maktx LIKE makt-maktx,      "描述
        menge LIKE stpo-menge,      "组件数量
        meins LIKE  stpo-meins,     "组件数量单位
        lgort LIKE  stpo-lgort,     "生产仓储地点
       END OF gt_stpo.
DATA:gt_makt LIKE STANDARD TABLE OF makt WITH HEADER LINE.
DATA:BEGIN OF gt_mtnrv OCCURS 0,
     matnr LIKE mara-matnr,
     matkl LIKE mara-matkl,
     END OF gt_mtnrv.
DATA:gt_mtnrv_lt LIKE STANDARD TABLE OF gt_mtnrv WITH HEADER LINE,
     gt_mtnrv_tp LIKE STANDARD TABLE OF gt_mtnrv  WITH HEADER LINE,
     gt_mtnrv_zlj LIKE STANDARD TABLE OF gt_mtnrv WITH HEADER LINE.
DATA:BEGIN OF gt_mara OCCURS 0,
     matkl LIKE mara-matkl,
     matnr LIKE mara-matnr,
     lvorm LIKE mara-lvorm,
     brgew LIKE mara-brgew,
     ntgew LIKE mara-ntgew,
     meins LIKE mara-meins,
     END OF gt_mara.
DATA:BEGIN OF gt_matnr OCCURS 0,
     matnr LIKE mara-matnr,
     level TYPE char1,"层级
     matkl LIKE mara-matkl,
     idnrk LIKE mara-matnr,
     posnr(4) TYPE n,
     END OF gt_matnr.
DATA:BEGIN OF gt_mast OCCURS 0,
     matnr LIKE mast-matnr,
     werks LIKE mast-werks,
     stlan LIKE mast-stlan,
     stlnr LIKE mast-stlnr,
     stlal LIKE mast-stlal,
     stktx LIKE stko-stktx,
     bmeng LIKE stko-bmeng,
     bmein LIKE stko-bmein,
    END OF gt_mast.
RANGES:r_lt FOR mara-matnr,"轮胎
       r_tp FOR mara-matnr,"胎胚
       r_gs FOR mara-matnr,"钢丝
       r_zlj FOR mara-matnr,"终炼胶
       r_ycl FOR mara-matnr."原材料
CONSTANTS:c_zlj LIKE mara-matkl VALUE '113',
          c_m TYPE char1 VALUE 'M',
          c_char_x TYPE char1 VALUE 'X'.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

PARAMETERS: p_werks LIKE mkal-werks  OBLIGATORY. "工厂

SELECT-OPTIONS:s_matnr FOR mara-matnr. "物料号
SELECT-OPTIONS:s_lvorm FOR mara-lvorm, "删除标记
               s_stlal FOR mast-stlal."可选bom
PARAMETERS:p_datuv LIKE stas-datuv DEFAULT sy-datum."BOM起始有效期

SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
  PERFORM frm_init_range.
  PERFORM frm_get_data.
  PERFORM frm_process_data.
  PERFORM frm_disp_data.
*&---------------------------------------------------------------------*
*&      Form  frm_get_bom
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_get_data.
  write_screen text-i01.
  DATA:l_tabix LIKE sy-tabix.

  SELECT matnr matkl INTO CORRESPONDING FIELDS OF TABLE gt_mtnrv
         FROM mara WHERE matnr IN s_matnr AND
                         ( matkl IN r_lt OR
                           matkl IN r_tp OR
                           matkl IN r_zlj ) AND
                         lvorm IN s_lvorm.

  gt_mtnrv_zlj[] = gt_mtnrv[].
  gt_mtnrv_tp[] = gt_mtnrv[].
  gt_mtnrv_lt[] = gt_mtnrv[].
  DELETE gt_mtnrv_lt WHERE matkl NOT IN r_lt.
  DELETE gt_mtnrv_tp WHERE matkl NOT IN r_tp.
  DELETE gt_mtnrv_zlj WHERE matkl NOT IN r_zlj.
  IF gt_mtnrv[] IS NOT INITIAL.
    SELECT mast~matnr  mast~werks mast~stlan  mast~stlnr
           mast~stlal  stko~stktx stko~bmeng stko~bmein
         INTO CORRESPONDING FIELDS OF TABLE gt_mast
         FROM mast INNER JOIN mara ON mast~matnr = mara~matnr
                   INNER JOIN stko
                             ON  mast~stlnr = stko~stlnr
                             AND mast~stlal = stko~stlal
                             AND stko~lkenz = ''
                             AND stko~stlty = c_m
         FOR ALL entries IN gt_mtnrv
      WHERE mast~matnr = gt_mtnrv-matnr AND
            mast~werks = p_werks AND
            mast~stlal IN s_stlal AND
            mast~stlan = '1'.
  ENDIF.
  DATA:lt_stb LIKE STANDARD TABLE OF stpox WITH HEADER LINE,
       lt_mast LIKE STANDARD TABLE OF mast WITH HEADER LINE,
       lt_mat LIKE STANDARD TABLE OF cscmat WITH HEADER LINE.
  REFRESH:gt_stb,gt_data.
  LOOP AT gt_mtnrv_lt.
    REFRESH:lt_stb,lt_mat.
    LOOP AT gt_mast WHERE matnr = gt_mtnrv_lt-matnr.
      PERFORM sub_get_bom TABLES lt_stb"lt_mat
                         USING '' gt_mast-matnr gt_mast-stlal
                                gt_mast-stlan gt_mast-werks gt_mast-stktx gt_mast-bmeng gt_mast-bmein 'LT'.

      APPEND LINES OF lt_stb TO gt_stb.
    ENDLOOP.

  ENDLOOP.
  LOOP AT gt_mtnrv_tp.
    LOOP AT gt_mast WHERE matnr = gt_mtnrv_tp-matnr.
      PERFORM sub_get_bom TABLES lt_stb "lt_mat
                          USING c_char_x gt_mast-matnr gt_mast-stlal
                                gt_mast-stlan gt_mast-werks gt_mast-stktx gt_mast-bmeng gt_mast-bmein 'TP'.

      APPEND LINES OF lt_stb TO gt_stb.
    ENDLOOP.
  ENDLOOP.

  LOOP AT gt_mtnrv_zlj.
    LOOP AT gt_mast WHERE matnr = gt_mtnrv_zlj-matnr.
      PERFORM sub_get_bom  TABLES lt_stb" lt_mat
                         USING c_char_x gt_mast-matnr gt_mast-stlal
                                gt_mast-stlan gt_mast-werks gt_mast-stktx gt_mast-bmeng gt_mast-bmein 'ZLJ'.

      APPEND LINES OF lt_stb TO gt_stb.
    ENDLOOP.
  ENDLOOP.

  IF gt_mast[] IS NOT INITIAL.
    SELECT matnr maktx APPENDING CORRESPONDING FIELDS OF TABLE gt_makt
          FROM makt FOR ALL ENTRIES IN gt_mast
                    WHERE matnr = gt_mast-matnr AND
                          spras = sy-langu.
    SELECT  matkl  matnr  lvorm  brgew  ntgew meins APPENDING TABLE gt_mara
        FROM mara FOR ALL ENTRIES IN gt_mast
        WHERE matnr = gt_mast-matnr.
  ENDIF.

  IF gt_data[] IS NOT INITIAL.
    SELECT matnr maktx APPENDING CORRESPONDING FIELDS OF TABLE gt_makt
        FROM makt FOR ALL ENTRIES IN gt_data
                  WHERE matnr = gt_data-idnrk AND
                        spras = sy-langu.
    SELECT  matkl  matnr  lvorm  brgew  ntgew meins APPENDING TABLE gt_mara
        FROM mara FOR ALL ENTRIES IN gt_data
        WHERE matnr = gt_data-idnrk.
  ENDIF.
ENDFORM.                    "frm_get_bom
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_RANGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_init_range .
  REFRESH:r_lt,r_tp,r_gs,r_zlj,r_ycl.
  "轮胎
  insert_range r_lt 'I' 'EQ' '31' ''.
  insert_range:r_lt 'I' 'EQ' '32' ''.
  insert_range:r_lt 'I' 'EQ' '34' ''.
  "胎胚
  insert_range:r_tp 'I' 'EQ' '204' ''.
  "钢丝
  insert_range:r_gs 'I' 'BT' '114' '117'.
  "终炼胶
  insert_range:r_zlj 'I' 'EQ' '223' ''.
  "原材料
  insert_range:r_ycl 'I' 'BT' '100' '113'.
ENDFORM.                    " FRM_INIT_RANGE
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_process_data .
  DATA:l_posnr(4) TYPE n,
       l_tabix LIKE sy-tabix.
*  DATA:lt_data LIKE STANDARD TABLE OF gt_data WITH HEADER LINE.
  REFRESH:gt_matnr.
  write_screen text-i02.
*先的到所有数据
  LOOP AT gt_data.
    l_tabix = sy-tabix.
    CLEAR:gt_matnr.
    gt_matnr-matnr = gt_data-matnr.
    gt_matnr-idnrk = gt_data-idnrk.
    READ TABLE gt_mara WITH KEY matnr = gt_data-idnrk.
    IF sy-subrc = 0.
      gt_matnr-matkl = gt_mara-matkl.
    ENDIF.
    READ TABLE gt_mara WITH KEY matnr = gt_data-matnr.
    IF sy-subrc = 0.
      gt_data-ntgew = gt_mara-ntgew.
      gt_data-brgew = gt_mara-brgew.
    ENDIF.
    IF gt_matnr-matkl IN r_lt.
      gt_matnr-level = '1'.
    ENDIF.
    IF gt_matnr-matkl IN r_tp.
      gt_matnr-level = '2'.
    ENDIF.
    IF gt_matnr-matkl IN r_gs OR gt_matnr-matkl IN r_zlj.
      gt_matnr-level = '3'.
    ENDIF.
    IF gt_matnr-matkl IN r_ycl.
      gt_matnr-level = '4'.
    ENDIF.
    IF gt_matnr-matkl IN r_zlj.
      gt_matnr-matkl = c_zlj.
    ENDIF.
    COLLECT gt_matnr.

    gt_data-level = gt_matnr-level.
    READ TABLE gt_makt WITH KEY matnr = gt_data-matnr.
    IF sy-subrc = 0.
      gt_data-maktx1 = gt_makt-maktx.
    ENDIF.
    READ TABLE gt_makt WITH KEY matnr = gt_data-idnrk.
    IF sy-subrc = 0.
      gt_data-maktx = gt_makt-maktx.
    ENDIF.
    MODIFY gt_data INDEX l_tabix TRANSPORTING maktx1 maktx ntgew brgew.
  ENDLOOP.
  SORT gt_matnr BY matnr level matkl idnrk.
  LOOP AT gt_matnr.
    l_tabix = sy-tabix.
    AT NEW level.
      CLEAR:l_posnr.
    ENDAT.
    l_posnr = l_posnr + 10.
    IF  gt_matnr-matkl = c_zlj.
      gt_matnr-matkl = '223'.
    ENDIF.
    gt_matnr-posnr = l_posnr.
    MODIFY gt_matnr INDEX l_tabix TRANSPORTING posnr matkl.
  ENDLOOP.

*赋值项目号
  LOOP AT gt_data.
    l_tabix = sy-tabix.
    READ TABLE gt_matnr WITH KEY matnr = gt_data-matnr
                                 idnrk = gt_data-idnrk.
    IF sy-subrc = 0.
      gt_data-posnr = gt_matnr-posnr.
      MODIFY gt_data INDEX l_tabix TRANSPORTING posnr.
    ENDIF.
  ENDLOOP.
  SORT gt_data BY matnr stlal level posnr idnrk.
  gt_output[] = gt_data[].
ENDFORM.                    " FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_DISP_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_disp_data .
  PERFORM sub_init_layout USING text-i04 ''.
  PERFORM sub_insert_fields.
  PERFORM sub_disp_data_new.
ENDFORM.                    " FRM_DISP_DATA
*&---------------------------------------------------------------------*
*&      Form  SUB_INSERT_FIELDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_insert_fields .
  alv_head  'WERKS'   text-t01  space     c_char_x  space '04'  ."工厂
  alv_head  'MATNR'   text-t02  c_char_x  c_char_x  space '18'  ."物料号
  alv_head  'MAKTX1'  text-t03  space     space     space '40'  ."物料描述
  alv_head  'STLAN'   text-t04  space     space     space '01'  ."BOM用途
  alv_head  'STLAL'   text-t05  c_char_x  space     space '02'  ."可选的BOM
  alv_head  'STKTX'   text-t06  space     space     space '40'  ."可选BOM文本
  alv_head  'BMENG'   text-t07  space     space     space '18'  ."BOM基本数量
  alv_head  'BMEIN'   text-t08  space     space     space '03'  ."BOM基本单位
  alv_head  'POSNR'   text-t09  space     space     space '04'  ."BOM 项目号
  alv_head  'IDNRK'   text-t10  c_char_x  space     space '18'  ."组件
  alv_head  'MAKTX'   text-t11  space     space     space '40'  ."描述
  alv_head  'MNGLG'   text-t12  space     space     space '18'  ."组件数量
  alv_head  'MEINS'   text-t13  space     space     space '03'  ."组件数量单位
  alv_head  'LGORT'   text-t14  space     space     space '04'  ."生产仓储地点
  alv_head  'BRGEW'   text-t15  space     space     space '18'  ."毛重
  alv_head  'NTGEW'   text-t16  space     space     space '18'  ."净重
ENDFORM.                    " SUB_INSERT_FIELDS
*&---------------------------------------------------------------------*
*&      Form  SUB_DISP_DATA_NEW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_disp_data_new.
  write_screen text-i03.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_interface_check        = ''
      i_callback_program       = sy-cprog
      i_callback_pf_status_set = 'SET_PF_STATUS'
      i_grid_title             = text-i04
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      i_save                   = 'A'
      i_default                = c_char_x
    TABLES
      t_outtab                 = gt_output[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    " SUB_DISP_DATA_NEW

*&---------------------------------------------------------------------*
*&      Form  set_pf_status_r1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'PF_STATUS'.
ENDFORM.                    "set-pf-status
*&---------------------------------------------------------------------*
*&      Form  SUB_GET_BOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_L_MEHRS  text
*      -->P_L_MTNRV  text
*      -->P_L_STLAL  text
*      -->P_L_STLAN  text
*      -->P_L_WERKS  text
*      -->P_LT_STB  text
*      -->P_LT_MAT  text
*----------------------------------------------------------------------*
FORM sub_get_bom TABLES   lt_stb STRUCTURE stpox
*                           lt_mat STRUCTURE cscmat
                  USING    l_mehrs
                           l_mtnrv
                           l_stlal
                           l_stlan
                           l_werks
                           l_stktx
                           l_emeng
                           l_bmein
                           l_type.
  REFRESH:lt_stb.
  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      capid                 = 'PP01'
      datuv                 = p_datuv
      mdmps                 = space
      mehrs                 = l_mehrs
      mtnrv                 = l_mtnrv
      stlal                 = l_stlal
      stlan                 = l_stlan
      emeng                 = l_emeng
      werks                 = l_werks
    TABLES
      stb                   = lt_stb[]
*      matcat                = lt_mat[]
    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.
  LOOP AT lt_stb.
    CLEAR:gt_data.
    CASE l_type.
      WHEN 'LT'.
        CHECK lt_stb-matkl IN r_tp.
      WHEN 'TP'.
        CHECK lt_stb-matkl IN r_zlj OR lt_stb-matkl IN r_gs.
      WHEN 'ZLJ'.
        CHECK lt_stb-matkl IN r_ycl.
      WHEN OTHERS.
    ENDCASE.
    gt_data-werks =  l_werks.
    gt_data-matnr = l_mtnrv.
    gt_data-stlan = l_stlan.      "BOM用途
    gt_data-stlal = l_stlal.     "可选的BOM
    gt_data-stktx = l_stktx.
    WRITE  l_emeng TO gt_data-bmeng.
    CONDENSE gt_data-bmeng.
    gt_data-bmein = l_bmein.
    gt_data-idnrk = lt_stb-idnrk.      "组件
    gt_data-mnglg = lt_stb-mnglg.      "组件数量
    gt_data-meins = lt_stb-meins.     "组件数量单位
    gt_data-lgort = lt_stb-lgort.     "生产仓储地点
    COLLECT gt_data.
  ENDLOOP.
ENDFORM.                    " SUB_GET_BOM

*Text elements
*----------------------------------------------------------
* 001 选项
* I01 取数据...
* I02 处理数据...
* I03 显示数据...
* I04 三层BOM显示报表
* T01 工厂
* T02 物料号
* T03 物料描述
* T04 BOM用途
* T05 可选的BOM
* T06 可选BOM文本
* T07 BOM基本数量
* T08 BOM基本数量单位
* T09 BOM#项目号
* T10 组件
* T11 描述
* T12 组件数量
* T13 组件数量单位
* T14 生产仓储地点
* T15 毛重
* T16 净重


*Selection texts
*----------------------------------------------------------
* P_DATUV         有效起始日期
* P_WERKS         工厂
* S_LVORM         物料删除标记
* S_MATNR         物料
* S_STLAL         可选BOM

Extracted by Direct Download Enterprise version 1.3 - E.G.Mellodew. 1998-2004 UK. Sap Release 700

posted @ 2014-08-25 08:45  Eric.su  阅读(459)  评论(0编辑  收藏  举报