SAP BOM读取逻辑

相关表

Table Description Table Description
MAST Material BOM PLKO Routing Group Header
STKO BOM Header PLSO Routing Group Sequence
STPO BOM Positions (detail) PLPO Routing Group Operations
MAPL Assignment fo Task Lists to Materials AFKO Production Order Header
STZU Permanent BOM data AFPO Production Order Position (details)

可用函数:CSAP_MAT_BOM_READ

读取逻辑

查找 Material,Plant,Material Desc

TABLE:MARA、MARC、MAKT

MARA-MATNR    
MARC-WERKS   
MARA-MTART (Material type)
Note: Proceeding to Step 2 or 3 or 4 depends on the input radio button for 
      Production or Engineering or ALL BOM option.

查找 BOM - Engineering

TABLE:MAST、STKO、STOP、STZU

Material (MAST-MATNR) = Materials selected above
  AND Plant (MASTWERKS) = As in input 
  AND BOM usage (MAST-STLAN) = 2 (Engineering usage).
Read BOM Header and Item
      Read BOM Header from table  [STKO].
          BOM Number (STKO-STLNR) = BOM number got in previous step and
          BOM alternative (STKO-STLAL) = BOM alternative got in previous step.
      Read BOM Item details from  [STOP].
          BOM number (STOP-STLNR) = STKO-STNLR.
      Read BOM text from table  STZU.

查找 BOM – Production

TABLE:MAST、STKO、STOP、STZU、MKAL

Material (MAST-MATNR) = Materials selected above AND Plant (MASTWERKS) = As in input 
  AND BOM usage (MAST-STLAN) = 1 (Production usage).
Read BOM Header and Item
  Read BOM Header from table  [STKO].
    BOM Number (STKO-STLNR) = BOM number got in previous step
    AND BOM alternative (STKO-STLAL) = BOM alternative got in previous step.
  Read BOM Item details from  [STOP].
    BOM number (STOP-STLNR) = STKO-STNLR.
  Read BOM text from table STZU.
Search for Resource / Production Version (Production BOMs only)   [MKAL]
  Material number (MKALMATNR) = Material number from above selection (MAST) 
    And Plant (MKALWERKS) = Plant from above selection (MAST)
    And Alternative BOM (MKAL-STLAL) = Alternative BOM from above selection (MAST) 
    And  BOM Usage (MKAL-STLAN) = 1 (Production BOM).
Note:
1. If no production version exists for any of the BOMs write such records at the bottom of 
   the report under the heading No Production Version Exists (Production BOMs).
2. Sort the output on Plant, Usage and then on Material.
3. If multiple plants then the report will be displayed Plant wise.
    Header to be displayed for Production / Engineering BOM option.
4. Material BOM Comparison.  [MAST]
   Material (MAST-MATNR) = Materials selected above AND Plant (MASTWERKS) = As in input.
    Read BOM Header and Item
  	 Read BOM Header from table [STKO].
    	  BOM Number (STKO-STLNR) = BOM number got in previous step and
    	  BOM alternative (STKO-STLAL) = BOM alternative got in previous step.
  	 Read BOM Item details from [STOP].
          BOM number (STOP-STLNR) = STKO-STNLR.

BOM逆向和正向查询

顺查BOM(CS12)

CS_BOM_EXPL_MAT_V2:展 BOM 表。

capid 参数,一般情况下所取的 BOM 都是生产用 BOM(capid = PP01)。

  • PP01:Production - general
  • BEST:Inventory management
  • INST:Plant maintenance
  • PC01:Costing
  • PI01:Process manufacturing
  • SD01:Sales and distribution

其它参数注意事项:

  • DATUV 一定不能省,否则运行出错。
  • 输出的数量一般用 MNGKO 而不是 MENGE,因为 MNGKO 计算了用量、替代的实际值。

展开单层BOM、多层BOM

MDMPS (虚拟件) MEHRS (多层展开) 展开模式
SPACE X 全展(显示包含虚拟件)
X X 展1或2层(下层遇虚拟件则展开至其下一层,显示包含虚拟件)
SPACE SPACE 展一层(下层为虚拟件,不再向下展开)
X SPACE 展一层 (同3,下层为虚拟件,不再向下展开)
  • 即:MEHRS 置空,不论 MDMPS 如何设置,都只展一层,并且如果下层就是虚拟件,不展开虚拟件至其更下一层,与2)要区别开来。

BOM 说明:

  • MQ(成品)<——MC(虚拟件)
    • MA <—— 底层材料 a、b、c
    • MF <—— 底层材料 d、e、f

BAPI 使用

DATA: selpool TYPE TABLE OF cstmat WITH HEADER LINE.
DATA: dstst_flg LIKE csdata-xfeld.
DATA: matcat TYPE TABLE OF cscmat WITH HEADER LINE.
DATA: stb TYPE STANDARD TABLE OF stpox WITH HEADER LINE.
DATA: return TYPE TABLE OF bapireturn WITH HEADER LINE.

CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
  EXPORTING
    capid = 'PP01'       "BOM应用程序,应用程序一般为PP01"
    datuv = sy-datum     "有效开始日通常为系统的当前日期"
    ehndl = '1'
    emeng = menge        "需求数量"
    mtnrv = p_matnr      "物料专用号,要展开BOM的物料"
    mehrs = 'X'          "x表示多层展开﹐space表示只展开第一层"
    werks = p_werks      "工厂"
    stlan = '1'          "BOM用途"
    stlal = '1'          "可选BOM的编号"
  IMPORTING
    topmat = selpool     "抬头明细"
    dstst  = dstst_flg
  TABLES
    stb = stb           "展开的BOM存放在该内表"
    matcat = matcat     "下面含有元件的物料存放在该内表"
  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
            .
IF SY-SUBRC <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"获取物料BOM清单 Items"
CALL FUNCTION 'CSAP_MAT_BOM_ITEM_SELECT'
  EXPORTING
    i_stpo                     = ls_i_stpo
    material                   = lv_i_matnr
    plant                      = lv_i_plant
    bom_usage                  = lv_i_usage
    alternative                = lv_i_alter
    fl_material_check          = lc_check
    fl_foreign_key_check       = lc_check
    valid_from                 = lv_i_datuv
    valid_to                   = lv_i_datub
  TABLES
    t_stpo                     = lt_e_stpo
  EXCEPTIONS
    error                      = error_msg
    others                     = error_other.

逆查 BOM(CS15):取物料的上层物料

CS_WHERE_USED_MAT:反查BOM表;反查单层BOM、多层BOM。

DATA: WULTB LIKE STANDARD TABLE OF STPOV WITH HEADER LINE,
      IT_WULTB LIKE STPOV OCCURS 0 WITH HEADER LINE,
      IT_EQUICAT LIKE CSCEQUI OCCURS 0 WITH HEADER LINE,
      IT_KNDCAT LIKE CSCKND OCCURS 0 WITH HEADER LINE,
      IT_MATCAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE,
      IT_STDCAT LIKE CSCSTD OCCURS 0 WITH HEADER LINE,
      IT_TPLCAT LIKE CSCTPL OCCURS 0 WITH HEADER LINE,
      IT_PRJCAT LIKE CSCPRJ OCCURS 0 WITH HEADER LINE.
FORM WHERE_USER_BOM .
  CLEAR:IT_WULTB,IT_WULTB[].
  CALL FUNCTION 'CS_WHERE_USED_MAT'
    EXPORTING
      DATUB        = SY-DATUM    "有效日期To"
      DATUV        = SY-DATUM    "有效日期From"
      MATNR        = MARA-MATNR  "物料号"
*     POSTP        = ' '
*     RETCODE_ONLY = ' '
*     STLAN        = ' '         "BOM用途"
*     MCLMT        = '00000000'
      WERKS        = P_WERKS
*    IMPORTING
*    TOPMAT        =
    TABLES
       WULTB       = IT_WULTB    "上层物料明细,包含编码、编码描述、上层需求数量、子件需求数量等"
       EQUICAT     = IT_EQUICAT
       KNDCAT      = IT_KNDCAT
       MATCAT      = IT_MATCAT   "反查出的子件上层物料明细(按物料号汇总后的结果)"
       STDCAT      = IT_STDCAT
       TPLCAT      = IT_TPLCAT
    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.
ENDFORM.   " WHERE_USER_BOM "

FORM WHERE_USER_BOM_MULIT .
  DATA: lv_index TYPE I,
        p_matnr TYPE matnr.
  DESCRIBE TABLE wultb LINES lv_index.
  IF lv_index <> 0.
    READ TABLE wultb INDEX lv_index.
    p_matnr = wultb-matnr.
  ENDIF.
  CLEAR IT_WULTB[].
  CALL  FUNCTION  'CS_WHERE_USED_MAT'
     EXPORTING
      DATUB              = SY-DATUM
      DATUV              = SY-DATUM
      MATNR              = p_matnr
*     POSTP               = ' '
*     RETCODE_ONLY        = ' '
*     STLAN               = ' '
      MCLMT              = '00000000'
      WERKS              = p_werks
*    IMPORTING
*    TOPMAT              =
     TABLES
       WULTB           = IT_WULTB
       EQUICAT         = IT_EQUICAT
       KNDCAT          = IT_KNDCAT
       MATCAT          = IT_MATCAT
       STDCAT          = IT_STDCAT
       TPLCAT          = IT_TPLCAT
     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."如果展开到最顶层,该值为3,不继续展开"
    IT_WULTB-LEVEL = lv_index + 1.
    APPEND IT_WULTB TO WULTB.
    PERFORM WHERE_USER_BOM_MULIT.
  ENDIF.
ENDFORM.                    " WHERE_USER_BOM_MULIT "

T-Code:CS02 :确保递归 BOM 的比例在 0.95 左右。即:产品 A,其 BOM 中的 A 的消耗量应该小于 0.95.

创建 BOM

BAPI_MATERIAL_BOM_GROUP_CREATE:可以创建 BOM 组

CSAP_MAT_BOM_CREATE:创建 BOM

CSAP_MAT_BOM_MAINTAIN:维护 BOM,创建可选的 BOM 会有问题

批量删除 BOM 分配

CALL FUNCTION 'CSAP_MAT_BOM_ALLOC_DELETE'
  EXPORTING
    MATERIAL                 = ITAB-MATNR
    PLANT                    = ITAB-WERKS
    BOM_USAGE                = '1'  "BOM 用途"
    ALTERNATIVE              =
    FL_NO_CHANGE_DOC         = ' '
    FL_COMMIT_AND_WAIT       = ' '
  IMPORTING
    FL_WARNING               = FLG_WARNING
    BOM_NO                   = BOM_NO
  TABLES
    T_PLANT                  =
  EXCEPTIONS
    ERROR                    = 1
    OTHERS                   = 2.
IF FLG_WARNING = 'X'.
  WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除成功'.
ELSE.
  WRITE :/ ITAB-WERKS,ITAB-MATNR , '删除失败'.
ENDIF.