SAP BOM 相关Function
展开BOM:
可以多层展开:
CS_BOM_EXPL_MAT_V2()
对于capid参数,一般情况下,我们所取的都生产用BOM,所以必须指定为"PP01" 。如果是其它类型的BOM应用,则可以按需要选择:
PP01------ Production - general
BEST------ Inventory management
INST ------ Plant maintenance
PC01 ------ Costing
PI01 ------ Process manufacturing
SD01------ Sales and distribution
不可多层:
CSAP_MAT_BOM_READ(可RFC调用)
CABM_READ_BOM (不可RFC)
创建BOM:
BAPI_MATERIAL_BOM_GROUP_CREATE(可以创建BOM组)
CSAP_MAT_BOM_CREATE
CSAP_MAT_BOM_MAINTAIN(创建可选的BOM有问题)
反查BOM:
CS_WHERE_USED_MAT
其他:
CSAP_MAT_BOM_ALLOC_CREATE
CSAP_MAT_BOM_ALLOC_DELETE
CSAP_MAT_BOM_CLOSE
CSAP_MAT_BOM_DELETE
CSAP_MAT_BOM_ITEM_SELECT
CSAP_MAT_BOM_OPEN
CSAP_MAT_BOM_READ
CSAP_MAT_BOM_SELECT
FUNCTION ZRFC_BOM_EXPL.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_WERKS) TYPE WERKS_D OPTIONAL
*" VALUE(I_MATNR) TYPE MATNR OPTIONAL
*" VALUE(I_DATUM) TYPE DATUM DEFAULT SY-DATUM
*" TABLES
*" OUTPUT STRUCTURE ZRFC_BOM_EXPL OPTIONAL
*"----------------------------------------------------------------------
DATA: GIT_STPOX LIKE STPOX OCCURS 0 WITH HEADER LINE.
DATA: GIT_CSCMAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01' "BOM类型,比如生产BOM,研发BOM,销售BOM等等
DATUV = SY-DATUM "填入日期,函数据此日期筛选出有效的组件
EHNDL = '1'
EMENG = 1000 "设定的用量单位
* MEHRS = 'X' "有值表示多层展开,类似事物码CS12
MTNRV = I_MATNR "BOM料号
STLAN = '1' "类似参数CAPID,限定被展开BOM的性质
WERKS = I_WERKS "
TABLES
STB = GIT_STPOX "
MATCAT = GIT_CSCMAT. "
LOOP AT GIT_STPOX.
OUTPUT-MATKL = GIT_STPOX-MATKL.
OUTPUT-IDNRK = GIT_STPOX-IDNRK.
IF GIT_STPOX-IDNRK <> ''.
OUTPUT-DOBJT = GIT_STPOX-IDNRK.
ELSE.
OUTPUT-DOBJT = GIT_STPOX-POTX1.
ENDIF.
OUTPUT-OJTXP = GIT_STPOX-OJTXP.
OUTPUT-MNGKO = GIT_STPOX-MENGE.
OUTPUT-MEINS = GIT_STPOX-MEINS.
APPEND OUTPUT.
CLEAR OUTPUT.
ENDLOOP.
ENDFUNCTION.
顺查BOM(展开BOM清单、CS12)与逆查BOM(查上层物料、CS15)
1.顺查BOM
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = pm_capid “应用程序一般为PP01
datuv = pm_datuv “通常为系统的当前日期
mtnrv = pm_mtnrv “要展开BOM的物料
mehrs = 'X' “ x表示多层展开﹐space表示只展开第一层
werks = pm_werks “通常为1000
IMPORTING
topmat = selpool
dstst = dstst_flg
TABLES
stb = stb “展开的BOM存放在该内表
matcat = matcat “下面含有元件的物料存放在该内表
2.逆查BOM
DATA: 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.
CLEAR:IT_WULTB,IT_WULTB[].
CALL FUNCTION 'CS_WHERE_USED_MAT'
EXPORTING
DATUB = SY-DATUM
DATUV = SY-DATUM
MATNR = P_C_MATNR
* POSTP = ' '
* RETCODE_ONLY = ' '
* STLAN = ' '
MCLMT = '00000000'
WERKS = S2_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.
ABAP Bom按层展开的几种实现方法
- *递归的方式实现
- FUNCTION zbomexplode.
- *"--------------------------------------------------------- *"
- *"Local Interface:
- *"IMPORTING
- *"REFERENCE(MATNR) TYPE MATNR
- *"REFERENCE(WERKS) TYPE WERKS_D
- *"TABLES
- *"PARENT STRUCTURE SBOM
- *"CHILDREN STRUCTURE SBOM
- *"EXCEPTIONS
- *" NO_BOM_FOUND *"----------------------------------------------------------
- DATA: it_a TYPE TABLE OF sbom.
- DATA: it_b TYPE TABLE OF sbom.
- IF parent[] IS INITIAL.
- * first time that call to the FM
- SELECT stpo~idnrk INTO TABLE it_a
- FROM mast INNER JOIN stpo
- ON mast~stlnr = stpo~stlnr
- WHERE mast~matnr = matnr
- AND mast~werks = werks.
- IF it_a[] IS INITIAL.
- RAISE no_bom_found.
- ENDIF.
- ELSE.
- SELECT stpo~idnrk INTO TABLE it_a
- FROM mast
- INNER JOIN stpo ON mast~stlnr = stpo~stlnr
- FOR ALL ENTRIES IN parent
- WHERE mast~matnr = parent-matnr
- AND mast~werks = werks.
- * if there is no any sub item, then stop the recursion IF it_a[] IS INITIAL.
- EXIT.
- ENDIF.
- ENDIF.
- APPEND LINES OF it_a TO children.
- * get sub items recursively
- CALL FUNCTION 'Z_BOM_EXPLODE'
- EXPORTING
- matnr = ''
- werks = werks
- TABLES
- parent = it_a
- children = it_b.
- APPEND LINES OF it_b TO children.
- * delete duplicate sub items at the end
- IF parent[] IS INITIAL.
- SORT children BY matnr.
- DELETE ADJACENT DUPLICATES FROM children.
- ENDIF.
- ENDFUNCTION.
- *使用循环代替递归的一种做法1,更便于做异常处理,程序运行时系统也不要维护递归堆栈。这个程序不好的地方在于要用两个itab频繁copy数据。
- FUNCTION zbomexplode1.
- *"--------------------------------------------------------- *"
- *"Local Interface:
- *" IMPORTING
- *" VALUE(MATNR) TYPE MATNR
- *" VALUE(WERKS) TYPE WERKS_D *" TABLES
- *" CHILDREN STRUCTURE SBOM *" EXCEPTIONS
- *" NO_BOM_FOUND *"---------------------------------------------------------
- DATA: it_a TYPE TABLE OF sbom,
- it_b TYPE TABLE OF sbom,
- it_result TYPE TABLE OF sbom.
- SELECT stpo~idnrk
- INTO TABLE it_a
- FROM mast
- INNER JOIN stpo ON mast~stlnr = stpo~stlnr
- WHERE mast~matnr = matnr
- AND mast~werks = werks.
- APPEND LINES OF it_a TO it_result.
- WHILE NOT it_a[] IS INITIAL.
- SELECT stpo~idnrk
- INTO TABLE it_b
- FROM mast INNER JOIN stpo
- ON mast~stlnr = stpo~stlnr
- FOR ALL ENTRIES IN it_a
- WHERE mast~matnr = it_a-matnr
- AND mast~werks = werks.
- APPEND LINES OF it_b TO it_result.
- it_a[] = it_b[].
- ENDWHILE.
- * delete duplicate sub items
- SORT it_result BY matnr.
- DELETE ADJACENT DUPLICATES FROM it_result.
- children[] = it_result[].
- ENDFUNCTION.
- FUNCTION zbomexplode2.
- *"---------------------------------------------------------- *"
- *"Local Interface: *" IMPORTING
- *" VALUE(MATNR) TYPE MATNR
- *" VALUE(WERKS) TYPE WERKS_D
- *" TABLES
- *" CHILDREN STRUCTURE SBOM
- *" EXCEPTIONS *" NO_BOM_FOUND
- *"----------------------------------------------------------
- DATA: it_result TYPE TABLE OF sbom,
- wa_bom TYPE sbom.
- SELECT stpo~idnrk
- INTO TABLE it_result
- FROM mast INNER JOIN stpo
- ON mast~stlnr = stpo~stlnr
- WHERE mast~matnr = matnr
- AND mast~werks = werks.
- LOOP AT it_result INTO wa_bom.
- SELECT stpo~idnrk
- APPENDING TABLE it_result
- FROM mast INNER JOIN stpo
- ON mast~stlnr = stpo~stlnr
- WHERE mast~matnr = wa_bom-matnr
- AND mast~werks = werks.
- ENDLOOP.
- * delete duplicate sub items
- sort it_result by matnr.
- delete adjacent duplicates from it_result.
- children[] = it_result[].
- ENDFUNCTION.
- *调用BAPI实现
- FUNCTION zbomexplode.
- *"--------------------------------------------------------- *"
- *"Local Interface: *" IMPORTING
- *" VALUE(MATNR) LIKE MARA-MATNR
- *" VALUE(WERKS) LIKE MARC-WERKS OPTIONAL
- *" VALUE(CAPID) LIKE TC04-CAPID DEFAULT 'PP01'
- *" TABLES
- *" STB STRUCTURE STPOX
- *" RETURN STRUCTURE BAPIRET2
- *"---------------------------------------------------------
- IF werks IS INITIAL."Added in case external call does not know
- werks = '1000'.
- ENDIF.
- IF capid IS INITIAL.
- capid = 'PP01'.
- ENDIF.
- CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
- EXPORTING
- capid = capid
- datuv = sy-datum
- mehrs = 'X'
- mtnrv = matnr
- werks = werks
- TABLES
- stb = stb
- EXCEPTIONS
- no_bom_found = 1.
- IF sy-subrc <> 0.
- msg_typ = 'E'.
- msg_id = 'Z_EF'.
- msg_no = '002'.
- msg_v1 = matnr.
- IF NOT msg_typ IS INITIAL.
- * append error to table RETURN
- CALL FUNCTION 'BALW_BAPIRETURN_GET2'
- EXPORTING
- type = msg_typ
- cl = msg_id
- number = msg_no
- par1 = msg_v1
- par2 = msg_v2
- par3 = msg_v3
- par4 = msg_v4
- parameter = space
- row = space
- field = space
- IMPORTING
- return = wa_return_tmp.
- APPEND wa_return_tmp TO return.
- ENDIF.
- ENDIF.
- ENDFUNCTION

浙公网安备 33010602011771号