当前位置: 首页 > news >正文

【ABAP函数】+CSAP_MAT_BOM_MAINTAIN更改BOM长文本

SAPPP模块中,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单元格本身有限制,长文本显示不完全,直接拆解成几个并列的字段就可以查看

http://www.dtcms.com/a/515767.html

相关文章:

  • 小学英语资源合集
  • 裴蜀定理(Bézout‘s identity)
  • 在昇腾NPU上跑Llama 2模型:一次完整的性能测试与实战通关指南
  • 用wordpress建站一个人可以吗wordpress主题 表白
  • 鸿蒙6.0技术解析:五大行业迎来的智能化革命
  • Java的单例设计模式-饿汉式
  • 帝国建设网站phpcms做网站感想
  • 我的应用 Full GC 频繁,怎么优化?
  • clickhouse副本只有一个节点有数据原因
  • 【MySQL】从零开始了解数据库开发 --- mysql事务机制(二)
  • 国外手表网站湖南省专业建设公司网站
  • php使用腾讯云服务
  • 都安网站建设深圳专业seo优化公司
  • 小尺寸13*13cmRFSOC47DR数模混合信号处理卡
  • 基于PHP开发的医疗安全上报平台——医院不良事件管理系统,规范10大类50多种不良事件的上报、处理和追踪流程
  • Linux 中新建用户
  • bond模式以及配置清单
  • 汽车HIL测试供应商
  • 东方玉色静奢新生|欧神诺中国玉2025秋季新品重磅发布!
  • 织梦dede建站教程视频网站开发入门教程
  • 银川 网站建设郑州做网站 熊掌号
  • 工程实践心得记录-pytorch要安装在哪里
  • 19_AI智能体开发架构搭建之基于Qdrant构建知识库最佳实践指南
  • 零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析
  • 拉格朗日对偶法—入门版
  • Docker连接超时的解决方法
  • 显示网站建设精美页面天津外贸公司网站制作
  • JDK 8 到 JDK 24 主要特性对比
  • 数据结构初阶:包装类
  • 4.5数组排序算法