BOM相关的部分BAPI:
-
创建物料BOM:BAPI_MATERIAL_BOM_GROUP_CREATE2.
-
创建BOM:CSAP_MAT_BOM_CREATE
-
更改BOM:CSAP_MAT_BOM_MAINTAIN
-
展开BOM:CS_BOM_EXPL_MAT_V2,用SE38:rcs13001传入参数也可以查询。
讲一下1与2区别:1是创建BOM组;2是简单的只创建BOM。
如果在创建时,项目长文本未超过两行,使用1;否则,请使用2。
那么当使用1创建BOM组,又要项目长文本超两行以上了,那就需要用到CSAP_MAT_BOM_MAINTAIN,更改BOM项目长文本。
详细操作步骤及代码
1.对BAPI:CSAP_MAT_BOM_MAINTAIN先做测试,SE37->执行BAPI,输入相关参数;
Table:T_STPO
字段ITEM_NODE(项目ID),字段ITEM_COUNT(内部计数器)
运行结果:
2.接下来是要注意点,传长文本;
超3行及以上才是长文本的溢出的部分
点击项目长文本只能看到溢出部分长文本,第1行与第二行留在CS03界面上的
3.测试BAPI成功后,接下就是代码调用BAPI;(代码部分)
REPORT Z.
DATA L_FL_WARNING TYPE CAPIFLAG-FLWARNING.
DATA LT_STPO_UPDT TYPE TABLE OF STPO_API03 WITH HEADER LINE.
DATA OT_STPO1 TYPE TABLE OF STPO_API03 WITH HEADER LINE.
DATA LW_STKO_UPDT TYPE STKO_API01.
TYPES:BEGIN OF T_STR,
STR(220) TYPE C,
END OF T_STR.
DATA: LT_LONGTEXT TYPE STANDARD TABLE OF CSLTX_LINE,
OT_LTX_LINE TYPE STANDARD TABLE OF CSLTX_LINE,
LV_TEXT TYPE CHAR220 VALUE 'CA9,CA11, CA12, CA20, CA22,CD1,CD2,CD3,CD4,CD5, CE1, CE2, CE8, CL1, CL4, CL6, CQ1, CQ5, CQ6test123'.
DATA LT_TEXT TYPE TABLE OF T_STR.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
TEXT = CONV STRING( LV_TEXT )
* IMPORTING
* LENGTH =
TABLES
FTEXT_TAB = LT_TEXT.
CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'
EXPORTING
INPUT = '0280'
IMPORTING
OUTPUT = LT_STPO_UPDT-IDENTIFIER.
APPEND VALUE #( OBJECT_ID = '2' IDENTIFIER = LT_STPO_UPDT-IDENTIFIER TDFORMAT = '*' TDLINE = SPACE ) TO LT_LONGTEXT.
APPEND VALUE #( OBJECT_ID = '2' IDENTIFIER = LT_STPO_UPDT-IDENTIFIER TDFORMAT = '*' TDLINE = SPACE ) TO LT_LONGTEXT.
LOOP AT LT_TEXT ASSIGNING FIELD-SYMBOL(<FS_TEXT>).
APPEND VALUE #( OBJECT_ID = '2' IDENTIFIER = LT_STPO_UPDT-IDENTIFIER TDFORMAT = '*' TDLINE = <FS_TEXT> ) TO LT_LONGTEXT.
ENDLOOP.
*LW_STKO_UPDT-BASE_QUAN = '8'.
*LW_STKO_UPDT-BOM_STATUS = '01'.
*LW_STKO_UPDT-ALT_TEXT = '123456'.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = '123456abc-test' "组件物料
IMPORTING
OUTPUT = LT_STPO_UPDT-COMPONENT
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
LT_STPO_UPDT-ITEM_CATEG = 'L'.
LT_STPO_UPDT-ITEM_NO = '0280'.
*LT_STPO_UPDT-COMPONENT = '123456abc-test'."组件物料
LT_STPO_UPDT-COMP_QTY = '13'.
LT_STPO_UPDT-BOM_NO = '00067093'.
LT_STPO_UPDT-ITEM_NODE = '00000001'.
LT_STPO_UPDT-ITEM_COUNT = '00000002'.
APPEND LT_STPO_UPDT.
SELECT MAST~MATNR,
MAST~WERKS,
STPO~STLTY,
STPO~STLNR,
STPO~STLKN, "BOM项目节点号
STPO~STPOZ , "内部计数器
STPO~IDNRK ,"组件
STPO~POSNR ,"行项目编号
STPO~POSTP "行项目类别
FROM MAST
LEFT JOIN STPO
ON STPO~STLNR = MAST~STLNR
INTO TABLE @DATA(LT_STPO3)
WHERE MAST~MATNR = 'abc-test123' "父阶物料
AND MAST~WERKS = '1011'.
SORT LT_STPO3 BY STLNR STPOZ.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
MATERIAL = 'abc-test123' "父阶物料
PLANT = '1011'
BOM_USAGE = '1'
ALTERNATIVE = '01'
VALID_FROM = '2020.02.25'
* CHANGE_NO =
* REVISION_LEVEL =
I_STKO = LW_STKO_UPDT
* FL_NO_CHANGE_DOC = ' '
FL_COMMIT_AND_WAIT = 'X'
* FL_CAD = ' '
* FL_BOM_CREATE = ' '
FL_NEW_ITEM = 'X'
* FL_COMPLETE = 'X'
* FL_DEFAULT_VALUES = 'X'
* FL_IDENTIFY_BY_GUID = ' '
* FL_RECURSIVE = ' '
IMPORTING
FL_WARNING = L_FL_WARNING
* O_STKO =
TABLES
T_STPO = LT_STPO_UPDT
* T_DEP_DATA =
* T_DEP_DESCR =
* T_DEP_ORDER =
* T_DEP_SOURCE =
* T_DEP_DOC =
* T_DOC_LINK =
* T_DMU_TMX =
T_LTX_LINE = LT_LONGTEXT
* T_STPU =
* T_FSH_BOMD =
* T_SGT_BOMC =
EXCEPTIONS
ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
*读取BOM
CALL FUNCTION 'CSAP_MAT_BOM_READ'
EXPORTING
MATERIAL = 'abc-test123' "父阶物料
PLANT = '1011'
BOM_USAGE = '1'
ALTERNATIVE = '01'
VALID_FROM = '2020.02.25'
" CHANGE_NO = IS_ZRFC_S_PP005-AENNR
TABLES
T_STPO = OT_STPO1
T_LTX_LINE = OT_LTX_LINE
EXCEPTIONS
ERROR = 1
OTHERS = 2.
BREAK-POINT.
真是的,数量不传(LT_STPO_UPDT-COMP_QTY = '13'.),长文本改变不了,一直卡在这个点上!!
SELECT MAST~MATNR,
MAST~WERKS,
STPO~STLTY,
STPO~STLNR,
STPO~STLKN, "BOM项目节点号
STPO~STPOZ , "内部计数器
STPO~IDNRK ,"组件
STPO~POSNR ,"行项目编号
STPO~POSTP "行项目类别
FROM MAST
LEFT JOIN STPO
ON STPO~STLNR = MAST~STLNR
INTO TABLE @DATA(LT_STPO3)
WHERE MAST~MATNR = 'abc-test123' "父阶物料
AND MAST~WERKS = '1011'.
SORT LT_STPO3 BY STLNR STPOZ.
以上这段,也可以使用展BOM BAPI获取,看自己习惯哈~
4.抬头文本也是如此;
APPEND VALUE #( OBJECT_ID = '2' IDENTIFIER =
注解一下OBJECT_ID,指长文本是在抬头上,还是行项目上:
'1':指BOM抬头文本上(STPO);
'2':指BOM行项目文本上(STKO);
'0':暂没用到过(STZU).
IDENTIFIER是用于项目长文本的,指明在哪个BOM的ITEM上。
PS:还有如果改的是表头,一定要注意激活BOM(代码中要添加激活BOM),不然BOM是为2,未激活状态