【ABAP函数】+CSAP_MAT_BOM_MAINTAIN更改BOM长文本
在SAP的PP模块中,BOM是一个核心概念,与实际生产紧密相关。然而在实际业务中,BOM中有一个关键信息——“BOM点位字段”,用于记录如某个零件或子件上是否需要执行贴花等操作,而该字段在SAP标准字段中并不存在。通常,这类信息会借助BOM行项目的长文本进行存储。本文旨在说明如何通过程序更新BOM长文本,以实现该字段的维护。
首先有个注意点需要点明:
我们从截图来看,使用CS03查看BOM明细,如下:
双击项目编号,进入
在状态/长文本页签下,两个地方与文本有关,一个是行1、行2,一个是右边戴眼镜的长文本字段。行一行二是SAP的BOM项目文本字段,是标准的字段,可以在后台表里面直接读取;长文本就必须使用专用的函数才可以读取。
这里面还有个增强,就是行1与行2分别替代了长文本的前面两行。这个增强我不确定是系统自带的还是我之前的同事做的,大家可以自行查询一下。
目前的情况是:如果文本很长,超过80字符,那么就需要启用长文本。如果没超过80字符,那就不需要启用长文本
代码如下:
* 1、根据导入的数据按照父键物料排序DATA(LT_ALV1) = GT_ALV.SORT LT_ALV1 BY WERKS MATNR1.DELETE ADJACENT DUPLICATES FROM LT_ALV1 COMPARING WERKS MATNR1.DATA LV_DATE TYPE CSAP_MBOM-DATUV.
* 2、从后台表查询调用BAPI需要的数据SELECT MAST~MATNR,MAST~WERKS,MAST~STLAN,MAST~STLAL,STPO~STLTY,STPO~STLNR,STPO~STLKN, "BOM项目节点号STPO~STPOZ , "内部计数器STPO~DATUV, "有效起始日STPO~IDNRK ,"组件STPO~POSNR ,"行项目编号STPO~POSTP, "行项目类别STPO~MENGE "数量FROM MASTLEFT JOIN STPOON STPO~STLNR = MAST~STLNRINTO TABLE @DATA(LT_STPO3)FOR ALL ENTRIES IN @LT_ALV1WHERE MAST~MATNR = @LT_ALV1-MATNR1 "父阶物料AND MAST~WERKS = @LT_ALV1-WERKS.SORT LT_STPO3 BY MATNR IDNRK.
* 3、查看物料与主键的匹配是否正确LOOP AT LT_ALV1 INTO DATA(LS_ALV1).LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<ALV>) WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.READ TABLE LT_STPO3 INTO DATA(LS_STPO3) WITH KEY MATNR = <ALV>-MATNR1 IDNRK = <ALV>-MATNR2 BINARY SEARCH.IF SY-SUBRC <> 0.<ALV>-ICON = ICON_LED_RED.<ALV>-ZMSG = <ALV>-MATNR1 && 'BOM不包含该子键:' && <ALV>-MATNR2.ELSE.
* 4、按照元器件长度进行BAPI数据填充REFRESH:LT_TEXT.CALL FUNCTION 'SCMS_STRING_TO_FTEXT'EXPORTINGTEXT = CONV STRING( <ALV>-ZTEXT+80(420) )TABLESFTEXT_TAB = LT_TEXT.CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'EXPORTINGINPUT = LS_STPO3-POSNRIMPORTINGOUTPUT = 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.CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGINPUT = <ALV>-MATNR2 "组件物料IMPORTINGOUTPUT = LT_STPO_UPDT-COMPONENTEXCEPTIONSLENGTH_ERROR = 1OTHERS = 2.LT_STPO_UPDT-ITEM_CATEG = LS_STPO3-POSTP.LT_STPO_UPDT-ITEM_NO = LS_STPO3-POSNR.LT_STPO_UPDT-COMPONENT = LS_STPO3-IDNRK.LT_STPO_UPDT-COMP_QTY = LS_STPO3-MENGE.LT_STPO_UPDT-BOM_NO = LS_STPO3-STLNR.LT_STPO_UPDT-ITEM_NODE = LS_STPO3-STLKN.LT_STPO_UPDT-ITEM_COUNT = LS_STPO3-STPOZ.LT_STPO_UPDT-ITEM_TEXT1 = <ALV>-ZTEXT+0(40).LT_STPO_UPDT-ITEM_TEXT2 = <ALV>-ZTEXT+40(40).APPEND LT_STPO_UPDT.CLEAR:LT_STPO_UPDT.ENDIF.ENDLOOP.CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'EXPORTINGDATE_INTERNAL = SY-DATUMIMPORTINGDATE_EXTERNAL = LV_DATEEXCEPTIONSDATE_INTERNAL_IS_INVALID = 1OTHERS = 2.CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'EXPORTINGMATERIAL = LS_ALV1-MATNR1 "父阶物料PLANT = LS_ALV1-WERKSBOM_USAGE = '1'ALTERNATIVE = '01'VALID_FROM = LV_DATEI_STKO = LW_STKO_UPDTFL_COMMIT_AND_WAIT = 'X'FL_NEW_ITEM = 'X'IMPORTINGFL_WARNING = L_FL_WARNINGTABLEST_STPO = LT_STPO_UPDTT_LTX_LINE = LT_LONGTEXTEXCEPTIONSERROR = 1OTHERS = 2.IF SY-SUBRC <> 0.
* Implement suitable error handling hereROLLBACK WORK.LOOP AT GT_ALV ASSIGNING <ALV> WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.<ALV>-ICON = ICON_LED_RED.<ALV>-ZMSG = '元器件点位更新失败!'.ENDLOOP.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'.LOOP AT GT_ALV ASSIGNING <ALV> WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.<ALV>-ICON = ICON_LED_GREEN.<ALV>-ZMSG = '元器件点位更新成功!'.ENDLOOP.ENDIF.REFRESH: LT_STPO_UPDT,LT_LONGTEXT.ENDLOOP.
上面的代码只是调用函数的片段子例程,完整的BOM更改批导程序如下:
REPORT ZPPR0007.
TABLES:SSCRFIELDS.
*定义上传上来的表结构
TYPES: BEGIN OF TY_EXCEL,"导入模板WERKS TYPE MAST-WERKS , " 工厂MATNR1 TYPE MAST-MATNR , " 父物料编号MATNR2 TYPE MAST-MATNR , " 子物料编号ZTEXT(500) TYPE C, "点位元器件END OF TY_EXCEL,BEGIN OF TY_ALV.INCLUDE TYPE TY_EXCEL.
TYPES:ICON(4),ZMSG TYPE STRING,END OF TY_ALV.DATA: GT_FCAT TYPE LVC_T_FCAT,GS_FCAT TYPE LVC_S_FCAT,GS_LAYO TYPE LVC_S_LAYO.
DATA: GT_EVENTS TYPE SLIS_T_EVENT,GS_EVENTS TYPE SLIS_ALV_EVENT.
DATA: G_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA:FUNCTXT TYPE SMP_DYNTXT,FUNCTXT1 TYPE SMP_DYNTXT,FUNCTXT2 TYPE SMP_DYNTXT.
DATA:LT_SELTAB TYPE STANDARD TABLE OF VIMSELLIST.
DATA:GV_SAVE_PATH TYPE STRING,GT_RET TYPE STANDARD TABLE OF BAPIRET2,GT_EXCEL TYPE STANDARD TABLE OF TY_EXCEL,GS_EXCEL TYPE TY_EXCEL,GT_ALV TYPE STANDARD TABLE OF TY_ALV,GS_ALV TYPE TY_ALV.
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.DATA: LT_LONGTEXT TYPE STANDARD TABLE OF CSLTX_LINE,OT_LTX_LINE TYPE STANDARD TABLE OF CSLTX_LINE.
TYPES:BEGIN OF T_STR,STR(132) TYPE C,END OF T_STR.
DATA LT_TEXT TYPE TABLE OF T_STR.
DEFINE MACRO_ADD_FIELDCAT. "添加显示字段 定义ALV的宏CLEAR: GS_FCAT.GS_FCAT-FIELDNAME = &1.GS_FCAT-SCRTEXT_L = &2.GS_FCAT-SCRTEXT_M = &2.GS_FCAT-SCRTEXT_S = &2.GS_FCAT-REPTEXT = &2.GS_FCAT-REF_TABLE = &3.GS_FCAT-REF_FIELD = &4.APPEND GS_FCAT TO GT_FCAT.
END-OF-DEFINITION.
SELECTION-SCREEN:FUNCTION KEY 1. "在屏幕定义功能码INITIALIZATION.FUNCTXT-ICON_ID = ICON_EXPORT.FUNCTXT-QUICKINFO = '下载模板'.FUNCTXT-ICON_TEXT = '下载模板'.SSCRFIELDS-FUNCTXT_01 = FUNCTXT.SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME TITLE TEXT-001 .SELECTION-SCREEN:SKIP.PARAMETERS:P_FILE LIKE RLGRAP-FILENAME OBLIGATORY DEFAULT 'C:\批量更改BOM元器件模板.xlsx' MODIF ID M5.SELECTION-SCREEN SKIP.SELECTION-SCREEN END OF BLOCK BLK2.AT SELECTION-SCREEN .PERFORM FRM_BEFORE_EXECUTE."下载模板子例程INITIALIZATION.AT SELECTION-SCREEN OUTPUT.INITIALIZATION.AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE."搜索帮助PERFORM FRM_F4_FILEPATH. "选择上传路径START-OF-SELECTION.PERFORM FRM_UPLOAD_FILE_LONG. "上传Excel转化为SAP内表PERFORM FRM_CSAP_BOM.PERFORM FRM_DISPLAY_DATA."展示上传上来的数据END-OF-SELECTION.FORM FRM_F4_FILEPATH .DATA: LV_FILENAME LIKE RLGRAP-FILENAME.CALL FUNCTION 'WS_FILENAME_GET'EXPORTINGMASK = ',*.* ,*.*.'MODE = '0'TITLE = '请选择要上传的信息文件'IMPORTINGFILENAME = LV_FILENAMEEXCEPTIONSINV_WINSYS = 1NO_BATCH = 2SELECTION_CANCEL = 3SELECTION_ERROR = 4OTHERS = 5.IF SY-SUBRC <> 0.ENDIF.P_FILE = LV_FILENAME.
ENDFORM.FORM FRM_BEFORE_EXECUTE.CASE SSCRFIELDS-UCOMM.WHEN 'FC01'.PERFORM FRM_BEFORE_EXE. "下载模板EXIT.WHEN OTHERS.ENDCASE.
ENDFORM.FORM FRM_BEFORE_EXE .DATA: LS_KEY TYPE WWWDATATAB,LV_DOWN TYPE RLGRAP-FILENAME,LV_NAME TYPE RLGRAP-FILENAME,LV_PATH TYPE RLGRAP-FILENAME,LV_PATH_S TYPE STRING,LV_NAME_S TYPE STRING,LV_PATH_F TYPE STRING,LV_ACTION TYPE I,LV_TITLE TYPE STRING,LV_FILENAME TYPE STRING.CLEAR: LS_KEY.LS_KEY-RELID = 'MI'. "二进制对象CASE SSCRFIELDS-UCOMM.WHEN 'FC01'.LS_KEY-OBJID = 'ZPPR0006'.LV_FILENAME = '批量更改BOM元器件模板'.WHEN OTHERS.ENDCASE.CONCATENATE LV_FILENAME SY-DATUM '.xlsx' INTO LV_FILENAME.LV_TITLE = TEXT-010.CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOGEXPORTINGWINDOW_TITLE = LV_TITLEDEFAULT_EXTENSION = 'xlsx'DEFAULT_FILE_NAME = LV_FILENAMEFILE_FILTER = 'Excel Files(2007/2010/2013)|*.xlsx|Excel Files(2003)|*.xls'INITIAL_DIRECTORY = GV_SAVE_PATHCHANGINGFILENAME = LV_NAME_SPATH = LV_PATH_SFULLPATH = LV_PATH_FUSER_ACTION = LV_ACTIONEXCEPTIONSCNTL_ERROR = 1ERROR_NO_GUI = 2NOT_SUPPORTED_BY_GUI = 3OTHERS = 4.IF SY-SUBRC <> 0.MESSAGE ID SY-MSGIDTYPE SY-MSGTYNUMBER SY-MSGNOWITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4.RETURN.ELSE.GV_SAVE_PATH = LV_PATH_S.IF LV_ACTION EQ CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.MESSAGE S004(ZSD01).RETURN.ENDIF.ENDIF.LV_DOWN = LV_PATH_F.CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'EXPORTINGKEY = LS_KEYDESTINATION = LV_DOWN.CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'EXPORTINGFULL_NAME = LV_DOWNIMPORTINGSTRIPPED_NAME = LV_NAMEFILE_PATH = LV_PATH.CALL FUNCTION 'GUI_RUN'EXPORTINGCOMMAND = 'EXCEL'PARAMETER = LV_NAMECD = LV_PATH.
ENDFORM.
FORM FRM_UPLOAD_FILE_LONG .DATA: GT_XLSTMP TYPE ZALSMEX_TABLINE_LONG OCCURS 0 WITH HEADER LINE,CL_EXCEPTION TYPE REF TO CX_ROOT.DATA: GV_OKCODE LIKE SY-UCOMM,GV_INDEX TYPE I,GV_TABIX TYPE I.DATA: LV_PREV_MATNR1 TYPE MATNR,LT_MATNR2 TYPE TABLE OF MATNR.FIELD-SYMBOLS: <FS_G_TABLE> TYPE STANDARD TABLE,<FS_G_TMP_TABLE> TYPE STANDARD TABLE, " excel临时文件存放内表<FS_G_WORK> TYPE ANY,<FS_G_TMP_WORK> TYPE ANY, " excel临时文件存放工作区<FS_G_FIELD>,<FS_G_TMP_FIELD>,<FS_G_DATA> TYPE ANY TABLE. " 存放从submit中返回的ALV的数据CLEAR: GT_XLSTMP.CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLEL'EXPORTINGFILENAME = P_FILEI_BEGIN_COL = 1I_BEGIN_ROW = 2I_END_COL = 4I_END_ROW = 999999TABLESINTERN = GT_XLSTMPEXCEPTIONSINCONSISTENT_PARAMETERS = 1UPLOAD_OLE = 2OTHERS = 3.IF SY-SUBRC <> 0.MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNOWITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ELSE.* 将数据转换成自建表的数据格式SORT GT_XLSTMP BY ROW COL.TRY .LOOP AT GT_XLSTMP.CLEAR: GV_INDEX.MOVE GT_XLSTMP-COL TO GV_INDEX.UNASSIGN <FS_G_FIELD>.ASSIGN COMPONENT GV_INDEX OF STRUCTURE GS_EXCEL TO <FS_G_FIELD>.IF SY-SUBRC = 0.MOVE GT_XLSTMP-VALUE TO <FS_G_FIELD>.AT END OF ROW.APPEND GS_EXCEL TO GT_EXCEL.CLEAR: GS_EXCEL.ENDAT.ELSE.MESSAGE '数据格式异常,请检查!' TYPE 'S' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDIF.ENDLOOP.CATCH CX_ROOT INTO CL_EXCEPTION. " 捕获数据格式错误异常MESSAGE '数据格式异常,请检查!' TYPE 'S' DISPLAY LIKE 'E'.LEAVE LIST-PROCESSING.ENDTRY.ENDIF.LOOP AT GT_EXCEL ASSIGNING FIELD-SYMBOL(<EXCEL>).MOVE-CORRESPONDING <EXCEL> TO GS_ALV.APPEND GS_ALV TO GT_ALV.ENDLOOP."一次只能导入同一个工厂数据IF LINES( GT_ALV ) > 0.DATA(LV_FIRST_WERKS) = GT_ALV[ 1 ]-WERKS.LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<ALV_CHECK>).IF <ALV_CHECK>-WERKS <> LV_FIRST_WERKS.
* MESSAGE '一次只能导入同一个工厂的数据,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
* LEAVE LIST-PROCESSING.<ALV_CHECK>-ZMSG = | 一次只能导入同一个工厂的数据,请检查!|.<ALV_CHECK>-ICON = ICON_LED_RED.ENDIF.ENDLOOP.ENDIF." 使用记录重复项TYPES: BEGIN OF TY_COUNT,MATNR1 TYPE MATNR,MATNR2 TYPE MATNR,COUNT TYPE I,END OF TY_COUNT.DATA: LT_COUNT TYPE HASHED TABLE OF TY_COUNTWITH UNIQUE KEY MATNR1 MATNR2.DATA: LS_COUNT TYPE TY_COUNT." 统计每个(MATNR1, MATNR2)组合出现的次数LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<ALV_COUNT>).READ TABLE LT_COUNT WITH TABLE KEYMATNR1 = <ALV_COUNT>-MATNR1MATNR2 = <ALV_COUNT>-MATNR2ASSIGNING FIELD-SYMBOL(<COUNT>).IF SY-SUBRC = 0.<COUNT>-COUNT = <COUNT>-COUNT + 1.ELSE.LS_COUNT-MATNR1 = <ALV_COUNT>-MATNR1.LS_COUNT-MATNR2 = <ALV_COUNT>-MATNR2.LS_COUNT-COUNT = 1.INSERT LS_COUNT INTO TABLE LT_COUNT.ENDIF.ENDLOOP." 标记所有重复项(出现次数大于1的)LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<ALV_MARK>).READ TABLE LT_COUNT WITH TABLE KEYMATNR1 = <ALV_MARK>-MATNR1MATNR2 = <ALV_MARK>-MATNR2INTO LS_COUNT.IF SY-SUBRC = 0 AND LS_COUNT-COUNT > 1.<ALV_MARK>-ZMSG = |{ <ALV_MARK>-ZMSG }{ <ALV_MARK>-MATNR1 }下的子键物料 { <ALV_MARK>-MATNR2 } 重复(出现{ LS_COUNT-COUNT }次)!|.<ALV_MARK>-ICON = ICON_LED_RED.ENDIF.ENDLOOP.ENDFORM.FORM FRM_UPLOAD_FILE .DATA LT_RAW TYPE TRUXS_T_TEXT_DATA .DATA LV_PATH TYPE RLGRAP-FILENAME .DATA LT_LINE TYPE C VALUE 1.DATA LR_DATA TYPE REF TO DATA."使用泛型引用FIELD-SYMBOLS: <LT_EXCEL> TYPE STANDARD TABLE.LV_PATH = P_FILE .GET REFERENCE OF GT_EXCEL INTO LR_DATA.
* 分配字段符号ASSIGN LR_DATA->* TO <LT_EXCEL>.CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'EXPORTINGI_FIELD_SEPERATOR = 'X'I_LINE_HEADER = LT_LINEI_TAB_RAW_DATA = LT_RAWI_FILENAME = LV_PATHTABLESI_TAB_CONVERTED_DATA = <LT_EXCEL>EXCEPTIONSCONVERSION_FAILED = 1OTHERS = 2.IF SY-SUBRC <> 0." 错误处理MESSAGE '文件导入失败' TYPE 'E'.ENDIF." 检查数据是否为空IF <LT_EXCEL> IS INITIAL.MESSAGE '导入文件为空' TYPE 'S'.ENDIF."检查上传后的数据准确性LOOP AT <LT_EXCEL> ASSIGNING FIELD-SYMBOL(<EXCEL>).MOVE-CORRESPONDING <EXCEL> TO GS_ALV.APPEND GS_ALV TO GT_ALV.ENDLOOP.
ENDFORM.
FORM FRM_DISPLAY_DATA .CLEAR: GT_FCAT.MACRO_ADD_FIELDCAT:'ICON' '状态' '' '','ZMSG' '消息' '' '','WERKS' '工厂' '' '','MATNR1' '物料编号' '' '','MATNR2' '物料编号' '' '','ZTEXT' '元器件号' '' ''.GS_LAYO-CWIDTH_OPT = 'X'.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGI_CALLBACK_PROGRAM = SY-REPIDIS_LAYOUT_LVC = GS_LAYOIT_FIELDCAT_LVC = GT_FCATI_DEFAULT = 'X'I_SAVE = 'A'TABLEST_OUTTAB = GT_ALV.IF SY-SUBRC <> 0.
* Implement suitable error handling hereENDIF.
ENDFORM.FORM FRM_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.SET PF-STATUS 'STANDARD' .
ENDFORM.FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMMRS_SELFIELD TYPE SLIS_SELFIELD.
ENDFORM.FORM FRM_REFRESH .DATA LS_STABLE TYPE LVC_S_STBL.LS_STABLE-ROW = 'X'.LS_STABLE-COL = 'X'.CALL METHOD G_ALV_GRID->REFRESH_TABLE_DISPLAYEXPORTINGIS_STABLE = LS_STABLE.
ENDFORM.FORM FRM_CSAP_BOM.* 1、根据导入的数据按照父键物料排序DATA(LT_ALV1) = GT_ALV.SORT LT_ALV1 BY WERKS MATNR1.DELETE ADJACENT DUPLICATES FROM LT_ALV1 COMPARING WERKS MATNR1.DATA LV_DATE TYPE CSAP_MBOM-DATUV.
* 2、从后台表查询调用BAPI需要的数据SELECT MAST~MATNR,MAST~WERKS,MAST~STLAN,MAST~STLAL,STPO~STLTY,STPO~STLNR,STPO~STLKN, "BOM项目节点号STPO~STPOZ , "内部计数器STPO~DATUV, "有效起始日STPO~IDNRK ,"组件STPO~POSNR ,"行项目编号STPO~POSTP, "行项目类别STPO~MENGE "数量FROM MASTLEFT JOIN STPOON STPO~STLNR = MAST~STLNRINTO TABLE @DATA(LT_STPO3)FOR ALL ENTRIES IN @LT_ALV1WHERE MAST~MATNR = @LT_ALV1-MATNR1 "父阶物料AND MAST~WERKS = @LT_ALV1-WERKS.SORT LT_STPO3 BY MATNR IDNRK.
* 3、查看物料与主键的匹配是否正确LOOP AT LT_ALV1 INTO DATA(LS_ALV1).LOOP AT GT_ALV ASSIGNING FIELD-SYMBOL(<ALV>) WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.READ TABLE LT_STPO3 INTO DATA(LS_STPO3) WITH KEY MATNR = <ALV>-MATNR1 IDNRK = <ALV>-MATNR2 BINARY SEARCH.IF SY-SUBRC <> 0.<ALV>-ICON = ICON_LED_RED.<ALV>-ZMSG = <ALV>-MATNR1 && 'BOM不包含该子键:' && <ALV>-MATNR2.ELSE.
* 4、按照元器件长度进行BAPI数据填充REFRESH:LT_TEXT.CALL FUNCTION 'SCMS_STRING_TO_FTEXT'EXPORTINGTEXT = CONV STRING( <ALV>-ZTEXT+80(420) )TABLESFTEXT_TAB = LT_TEXT.CALL FUNCTION 'CONVERSION_EXIT_NUMCV_INPUT'EXPORTINGINPUT = LS_STPO3-POSNRIMPORTINGOUTPUT = 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.CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGINPUT = <ALV>-MATNR2 "组件物料IMPORTINGOUTPUT = LT_STPO_UPDT-COMPONENTEXCEPTIONSLENGTH_ERROR = 1OTHERS = 2.LT_STPO_UPDT-ITEM_CATEG = LS_STPO3-POSTP.LT_STPO_UPDT-ITEM_NO = LS_STPO3-POSNR.LT_STPO_UPDT-COMPONENT = LS_STPO3-IDNRK.LT_STPO_UPDT-COMP_QTY = LS_STPO3-MENGE.LT_STPO_UPDT-BOM_NO = LS_STPO3-STLNR.LT_STPO_UPDT-ITEM_NODE = LS_STPO3-STLKN.LT_STPO_UPDT-ITEM_COUNT = LS_STPO3-STPOZ.LT_STPO_UPDT-ITEM_TEXT1 = <ALV>-ZTEXT+0(40).LT_STPO_UPDT-ITEM_TEXT2 = <ALV>-ZTEXT+40(40).APPEND LT_STPO_UPDT.CLEAR:LT_STPO_UPDT.ENDIF.ENDLOOP.CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'EXPORTINGDATE_INTERNAL = SY-DATUMIMPORTINGDATE_EXTERNAL = LV_DATEEXCEPTIONSDATE_INTERNAL_IS_INVALID = 1OTHERS = 2.CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'EXPORTINGMATERIAL = LS_ALV1-MATNR1 "父阶物料PLANT = LS_ALV1-WERKSBOM_USAGE = '1'ALTERNATIVE = '01'VALID_FROM = LV_DATEI_STKO = LW_STKO_UPDTFL_COMMIT_AND_WAIT = 'X'FL_NEW_ITEM = 'X'IMPORTINGFL_WARNING = L_FL_WARNINGTABLEST_STPO = LT_STPO_UPDTT_LTX_LINE = LT_LONGTEXTEXCEPTIONSERROR = 1OTHERS = 2.IF SY-SUBRC <> 0.
* Implement suitable error handling hereROLLBACK WORK.LOOP AT GT_ALV ASSIGNING <ALV> WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.<ALV>-ICON = ICON_LED_RED.<ALV>-ZMSG = '元器件点位更新失败!'.ENDLOOP.ELSE.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGWAIT = 'X'.LOOP AT GT_ALV ASSIGNING <ALV> WHERE MATNR1 = LS_ALV1-MATNR1 AND ICON <> ICON_LED_RED.<ALV>-ICON = ICON_LED_GREEN.<ALV>-ZMSG = '元器件点位更新成功!'.ENDLOOP.ENDIF.REFRESH: LT_STPO_UPDT,LT_LONGTEXT.ENDLOOP.**读取BOM的bapi
* CALL FUNCTION 'CSAP_MAT_BOM_READ'
* EXPORTING
* MATERIAL = '10001-01080-01' "父阶物料
* PLANT = '1011'
* BOM_USAGE = '1'
* ALTERNATIVE = '01'
* VALID_FROM = '2025.10.18'
* " CHANGE_NO = IS_ZRFC_S_PP005-AENNR
* TABLES
* T_STPO = OT_STPO1
* T_LTX_LINE = OT_LTX_LINE
* EXCEPTIONS
* ERROR = 1
* OTHERS = 2.ENDFORM.
在ALV报表中,因为ALV单元格本身有限制,长文本显示不完全,直接拆解成几个并列的字段就可以查看