加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

BOM反查(CS15)

(2013-01-21 15:21:22)
标签:

杂谈

分类: ABAP学习
在SAP中CS15是一个反查BOM的一个T_CODE.

但是CS15只能单个物料进行反查.

最近业务报出要多个物料进行反查.

反查一般用到的功能

1.CS_WHERE_USED_MAT

2.CS_WHERE_USED_MAT_VIA_CLA

3.CS_WHERE_USED_MAT_ANY

 

下面用 CS_WHERE_USED_MAT 写一下代码

*&---------------------------------------------------------------------*
*& Report  ZPPR012                                                     *
*& Write by:2012.07.19                                                 *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

report  zppr012 .

tables:rc29l,stpov_alv,stpov.

data:  begin of wa_tab,
   dstuf like stpov_alv-dstuf,               "展開層次  LEVEL
   stlan like stpov_alv-stlan,               "物料表用途  STLAN
   werks like stpov_alv-werks,               "工廠      WERKS
   objic like stpov_alv-objic,               "物件類型
   dobjt like stpov_alv-dobjt,               "物件 ID  MATNR
   dstal like stpov_alv-dstal,               "替代物料表
   dposn like stpov_alv-dposn,               "BOM 項目號碼 POSNR
   imovf like stpov_alv-imovf,               "指示碼:所需數量總額超過最大值
   dimng like stpov-bmeng ,                  "需求數量(顯示的)
   meopo like stpov_alv-meopo,               "計量單位(啟動使用清單物件) MEINS
   rmovf like stpov_alv-rmovf,               "指示碼:結果數量總額超過最大值
   drmng like stpov-bmeng ,                  "結果數量
   bmein like stpov_alv-bmein,               "BOM 的基礎計量單位
   menge like stpov-menge ,                  "元件數量
   bmeng like stpov-bmeng ,                  "基礎數量
   idnrk like stpov-idnrk,
end of wa_tab.

data : gt_tab like standard table of wa_tab with header line.
data : g_stpov like standard table of stpov with header line.

data  begin of g_mara occurs 0.
        include structure mara .
data  end   of g_mara.

data  begin of g_prjcat occurs 0.
        include structure cscprj .
data  end   of g_prjcat.

data  begin of g_tplcat occurs 0.
        include structure csctpl .
data  end   of g_tplcat.

data  begin of g_stdcat occurs 0.
        include structure cscstd .
data  end   of g_stdcat.

data  begin of g_matcat occurs 0.
        include structure cscmat .
data  end   of g_matcat.

data  begin of g_kndcat occurs 0.
        include structure cscknd .
data  end   of g_kndcat.

data  begin of g_equicat occurs 0.
        include structure cscequi .
data  end   of g_equicat.

data  begin of g_wultb occurs 0.
        include structure stpov .
data  end   of g_wultb.

data  begin of g_topmat occurs 0.
        include structure mc29s .
data  end   of g_topmat.


data:lc_grid type ref to cl_gui_alv_grid.

data:gt_fieldcat type slis_t_fieldcat_alv ,
     gs_fieldcat like line of gt_fieldcat,
     gt_layout   type slis_layout_alv ,
     gt_repid    like sy-repid,
     l_event     type slis_alv_event.

data: pos type i .
define set_fieldcat.
  clear gs_fieldcat.
  pos = pos + 1 .
  gs_fieldcat-col_pos = &1.
  gs_fieldcat-seltext_l = &2.
  gs_fieldcat-fieldname = &3.
  gs_fieldcat-tabname = &4.
  gs_fieldcat-symbol = &5.
  append gs_fieldcat to gt_fieldcat.
end-of-definition.

 

selection-screen begin of block title1 with frame title text-001.
select-options: sl_matnr for rc29l-matnr obligatory.
selection-screen skip 1.
selection-screen end of block title1.

*SELECTION-SCREEN BEGIN OF BLOCK title2 WITH FRAME TITLE text-002.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS:     p_dirkt TYPE kznul DEFAULT ''. "直接
*SELECTION-SCREEN COMMENT 3(10) text-p01.
*PARAMETERS:     p_uebkl TYPE kznul DEFAULT ''. "使用類別
*SELECTION-SCREEN COMMENT 16(10) text-p02.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title2.

*SELECTION-SCREEN BEGIN OF BLOCK title4 WITH FRAME TITLE text-004.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS:     p_doctp TYPE kznul DEFAULT ''. "文件結構
*SELECTION-SCREEN COMMENT 3(10) text-p03.
*PARAMETERS:     p_equtp TYPE kznul DEFAULT ''. "設備物料表
*SELECTION-SCREEN COMMENT 16(10) text-p04.
*PARAMETERS:     p_kndtp TYPE kznul DEFAULT ''. "訂單物料表
*SELECTION-SCREEN COMMENT 29(10) text-p05.
*PARAMETERS:     p_mattp TYPE kznul DEFAULT 'X'. "物料_BOM
*SELECTION-SCREEN COMMENT 42(10) text-p06.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN BEGIN OF LINE.
*PARAMETERS:     p_prjtp TYPE kznul DEFAULT ''. "WBS_物料表
*SELECTION-SCREEN COMMENT 3(10) text-p07.
*PARAMETERS:     p_stdtp TYPE kznul DEFAULT ''. "標準物料表
*SELECTION-SCREEN COMMENT 16(10) text-p08.
*PARAMETERS:     p_tpltp TYPE kznul DEFAULT ''. "功能位置_BOM
*SELECTION-SCREEN COMMENT 29(10) text-p09.
*SELECTION-SCREEN END OF LINE.
*SELECTION-SCREEN END OF BLOCK title4.

selection-screen begin of block title3 with frame title text-003.
parameters:  sl_datuv type rc29l-datuv default sy-datum. "生效日期
parameters:  sl_datub type rc29l-datub.                  "有效期限
selection-screen end of block title3.

selection-screen begin of block title5 with frame title text-005.
parameters:  sl_emeng type rc29l-emeng.                  "需求數量
parameters:  sl_rmeng type rc29l-rmeng.                  "結果數量
selection-screen end of block title5.

selection-screen begin of block title6 with frame title text-006.
parameters:  sl_werks type rc29l-werks obligatory .      "工廠
parameters:  sl_postp type rc29l-postp.                  "項目種類
parameters:  sl_stlan type rc29l-stlan.                  "用途
selection-screen end of block title6.

start-of-selection.
  if  sl_rmeng  is initial or sl_emeng  is initial  .
    if sl_emeng >= 0 or sl_emeng >= 0 .
      perform frm_get_data.
      perform frm_fieldcat.
      perform frm_display_alv.
    else.
       message text-m02 type 'I'.
    endif.

  else.
      message text-m01 type 'I'.
  endif.

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form frm_get_data .

  data  begin of s_wultb occurs 0.
          include structure stpov .
  data  end   of s_wultb.

  data  begin of s_matcat occurs 0.
          include structure cscmat .
  data  end   of s_matcat.

  select *
  into corresponding fields of table g_mara
  from mara
  where mara~matnr in sl_matnr .

  loop at g_mara.
    clear:s_wultb,s_matcat.

    call function 'CS_WHERE_USED_MAT'
      exporting
        datub                      = sl_datub     "有效期限
        datuv                      = sl_datuv     "生效日期
        matnr                      = g_mara-matnr "物料號碼
        postp                      = sl_postp     "項目類別
        stlan                      = sl_stlan     "物料表用途
        werks                      = sl_werks     "工廠
      importing
        topmat                     = g_topmat
      tables
        wultb                      = s_wultb
        equicat                    = g_equicat
        kndcat                     = g_kndcat
        matcat                     = s_matcat
        stdcat                     = g_stdcat
        tplcat                     = g_tplcat
        prjcat                     = g_prjcat
      exceptions
        call_invalid               = 1
        material_not_found         = 2
        no_where_used_rec_found    = 3
        no_where_used_rec_selected = 4
        no_where_used_rec_valid    = 5
        others                     = 6.
    if sy-subrc <> 0.
     " MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     "     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    endif.

*    append s_wultb  to g_wultb.
*    append s_matcat to g_matcat.
    append  lines  of  s_wultb   to  g_wultb.
    append  lines  of  s_matcat  to  g_matcat.
  endloop.

  loop at g_wultb.

*      sl_emeng  dimng "需求數量
*      sl_rmeng  drmng "結果數量


    if   sl_emeng  is initial and not sl_rmeng  is initial .

      gt_tab-drmng = sl_rmeng * abs( g_wultb-menge ) / abs( g_wultb-menge ).
      gt_tab-dimng = sl_rmeng *  g_wultb-menge  / abs( g_wultb-bmeng ).

    elseif   sl_rmeng  is initial and not sl_emeng  is initial.

      gt_tab-dimng = sl_emeng * abs( g_wultb-menge ) / g_wultb-menge.
      gt_tab-drmng = sl_emeng  / abs( g_wultb-menge ) / g_wultb-bmeng.

    elseif  sl_rmeng  is initial and sl_emeng  is initial .

      gt_tab-dimng = g_wultb-menge.
      gt_tab-drmng = g_wultb-bmeng.

    endif.

    if g_wultb-stlty = 'M'.
      gt_tab-objic =  '@A6@' .
    endif.

    gt_tab-dstuf =  g_wultb-level.
    gt_tab-stlan =  g_wultb-stlan.
    gt_tab-werks =  g_wultb-werks.
    gt_tab-dobjt =  g_wultb-matnr.
    gt_tab-dstal =  g_wultb-vwalt.
    gt_tab-dposn =  g_wultb-posnr.
    gt_tab-meopo =  g_wultb-emeih.
    gt_tab-bmein =  g_wultb-bmein.
    gt_tab-menge =  g_wultb-menge.
    gt_tab-bmeng =  g_wultb-bmeng.
    gt_tab-idnrk =  g_wultb-idnrk.
    append gt_tab.
  endloop.

endform.                    " frm_get_data
*&---------------------------------------------------------------------*
*&      Form  frm_fieldcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form frm_fieldcat .
  set_fieldcat:
   pos  text-a01 'DSTUF'      'GT_TAB'  '',
   pos  text-a02 'STLAN'      'GT_TAB'  '',
   pos  text-a03 'WERKS'      'GT_TAB'  '',
   pos  text-a04 'OBJIC'      'GT_TAB'  '',
   pos  text-a05 'DOBJT'      'GT_TAB'  '',
   pos  text-a06 'DSTAL'      'GT_TAB'  '',
   pos  text-a07 'DPOSN'      'GT_TAB'  '',
   pos  text-a08 'IMOVF'      'GT_TAB'  '',
   pos  text-a09 'DIMNG'      'GT_TAB'  '',
   pos  text-a10 'MEOPO'      'GT_TAB'  '',
   pos  text-a11 'RMOVF'      'GT_TAB'  '',
   pos  text-a12 'DRMNG'      'GT_TAB'  '',
   pos  text-a13 'BMEIN'      'GT_TAB'  '',
   pos  text-a16 'IDNRK'      'GT_TAB'  ''.
  " pos  text-a14 'MENGE'      'GT_TAB'  '',
  " pos  text-a15 'BMENG'      'GT_TAB'  ''.

endform.                    " frm_fieldcat
*&---------------------------------------------------------------------*
*&      Form  frm_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form frm_display_alv .

  gt_layout-colwidth_optimize = 'X' .

  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program = gt_repid
      is_layout          = gt_layout
      it_fieldcat        = gt_fieldcat[]
      i_default          = 'X'
      i_save             = 'A'
    tables
      t_outtab           = gt_tab
    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_alv


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有