sap_紅白:BOM批量反查(CS15)


sap_紅白:BOM批量反查(CS15)

 

http://www.zhsap.com/home.php?mod=space&uid=13587&do=blog&id=587

 

在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

本文來自:E-Works ,轉載請保留原文鏈接: http://blog.e-works.net.cn/634218/articles/311409.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM