*&---------------------------------------------------------------------*
*& Report ZDZBDC_MM2
*&---------------------------------------------------------------------*
REPORT ZDZBDC_MM2 NO STANDARD PAGE HEADING.
DATA: DATASET(132) TYPE C VALUE 'ZDZBDC_MM1',
G_MESSAGE(100) TYPE C,
FILENAME TYPE STRING,
G_REPID LIKE SY-REPID.
DATA: BEGIN OF BDCDATA OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDCDATA.
DATA: BEGIN OF MSGTAB OCCURS 0.
INCLUDE STRUCTURE BDCMSGCOLL.
DATA: END OF MSGTAB.
DATA: BEGIN OF MY_DATA,
MATNR(018), "物料号
MTART(004), "物料类型
MAKTX(040), "物料描述
MATKL(009), "物料组
END OF MY_DATA.
DATA: IT_DATA LIKE MY_DATA OCCURS 0.
SELECTION-SCREEN: BEGIN OF BLOCK SCR1 WITH FRAME TITLE TEXT-001.
PARAMETERS FN LIKE RLGRAP-FILENAME MEMORY ID MO1. "RLGRAP-FILENAME类型 为 CHAR 128
PARAMETERS: P_UPDATE(1) TYPE C DEFAULT 'S', " "A" Asynchronous update. "S" Synchronous processing. "L" Local update. Other As for "A".
P_MODE(1) DEFAULT 'E'. ""A" Processing with display of screens "E" Display of screens only if an error occurs
""P" Processing without display of the screens. "N" Processing without display of screens. Others Like "A".
SELECTION-SCREEN: END OF BLOCK SCR1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FN.
DATA: I_RC TYPE I,
I_FILETABLE TYPE FILETABLE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = '选择数据文件'
FILE_FILTER = '文本文件 (*.txt)|*.TXT|全部文件 (*.*)|*.*|'
MULTISELECTION = SPACE
CHANGING
FILE_TABLE = I_FILETABLE
RC = I_RC
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC = 0 AND I_RC = 1.
READ TABLE I_FILETABLE INTO FN INDEX 1.
FILENAME = FN.
ENDIF.
INITIALIZATION.
G_REPID = SY-REPID.
START-OF-SELECTION.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = FILENAME "文件名 必须为 STRING 类型
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X' "可以去掉前面的加入TAB 分隔符,如果不去掉刚会出现#,并且会挤掉后面字段的二位
TABLES
DATA_TAB = IT_DATA. "内表
LOOP AT IT_DATA INTO MY_DATA.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'RMMG1-MATNR'
MY_DATA-MATNR. "物料号
PERFORM BDC_FIELD USING 'RMMG1-MBRSH' "行业类型
'M'.
PERFORM BDC_FIELD USING 'RMMG1-MTART'
MY_DATA-MTART. "物料类型
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)' "此为选的基本视图一,选中的为X
'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(02)' "此为选的基本视图二,选中的为X
'X'.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=BU'.
PERFORM BDC_FIELD USING 'MAKT-MAKTX' "物料描述
MY_DATA-MAKTX.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MARA-MATKL'.
PERFORM BDC_FIELD USING 'MARA-MEINS'
'PCS'. "计量单位
PERFORM BDC_FIELD USING 'MARA-MATKL'
MY_DATA-MATKL. "物料组
PERFORM BDC_FIELD USING 'MARA-MTPOS_MARA' "普通项目类别组
''.
CALL TRANSACTION 'MM01' USING BDCDATA MODE P_MODE UPDATE P_UPDATE MESSAGES INTO MSGTAB.
REFRESH: BDCDATA. "此处不能用CLEAR: BDCDATA,但可以用 CLEAR: BDCDATA[].因为BDCDATA 是带表头的内表 BEGIN OF BDCDATA OCCURS 0.
ENDLOOP.
LOOP AT MSGTAB. "输出BDC的执行消息
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = MSGTAB-MSGID "Message ID
MSGNR = MSGTAB-MSGNR
MSGV1 = MSGTAB-MSGV1 "此为物料号
MSGV2 = MSGTAB-MSGV2
MSGV3 = MSGTAB-MSGV3
MSGV4 = MSGTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = G_MESSAGE.
WRITE :/ MSGTAB-MSGTYP, G_MESSAGE.
ENDLOOP.
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR: BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.
FORM BDC_FIELD USING FNAM FVAL.
CLEAR: BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDFORM.
*& Report ZDZBDC_MM2
*&---------------------------------------------------------------------*
REPORT ZDZBDC_MM2 NO STANDARD PAGE HEADING.
DATA: DATASET(132) TYPE C VALUE 'ZDZBDC_MM1',
G_MESSAGE(100) TYPE C,
FILENAME TYPE STRING,
G_REPID LIKE SY-REPID.
DATA: BEGIN OF BDCDATA OCCURS 0.
INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDCDATA.
DATA: BEGIN OF MSGTAB OCCURS 0.
INCLUDE STRUCTURE BDCMSGCOLL.
DATA: END OF MSGTAB.
DATA: BEGIN OF MY_DATA,
MATNR(018), "物料号
MTART(004), "物料类型
MAKTX(040), "物料描述
MATKL(009), "物料组
END OF MY_DATA.
DATA: IT_DATA LIKE MY_DATA OCCURS 0.
SELECTION-SCREEN: BEGIN OF BLOCK SCR1 WITH FRAME TITLE TEXT-001.
PARAMETERS FN LIKE RLGRAP-FILENAME MEMORY ID MO1. "RLGRAP-FILENAME类型 为 CHAR 128
PARAMETERS: P_UPDATE(1) TYPE C DEFAULT 'S', " "A" Asynchronous update. "S" Synchronous processing. "L" Local update. Other As for "A".
P_MODE(1) DEFAULT 'E'. ""A" Processing with display of screens "E" Display of screens only if an error occurs
""P" Processing without display of the screens. "N" Processing without display of screens. Others Like "A".
SELECTION-SCREEN: END OF BLOCK SCR1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FN.
DATA: I_RC TYPE I,
I_FILETABLE TYPE FILETABLE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = '选择数据文件'
FILE_FILTER = '文本文件 (*.txt)|*.TXT|全部文件 (*.*)|*.*|'
MULTISELECTION = SPACE
CHANGING
FILE_TABLE = I_FILETABLE
RC = I_RC
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC = 0 AND I_RC = 1.
READ TABLE I_FILETABLE INTO FN INDEX 1.
FILENAME = FN.
ENDIF.
INITIALIZATION.
G_REPID = SY-REPID.
START-OF-SELECTION.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = FILENAME "文件名 必须为 STRING 类型
FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X' "可以去掉前面的加入TAB 分隔符,如果不去掉刚会出现#,并且会挤掉后面字段的二位
TABLES
DATA_TAB = IT_DATA. "内表
LOOP AT IT_DATA INTO MY_DATA.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0060'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'RMMG1-MATNR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'RMMG1-MATNR'
MY_DATA-MATNR. "物料号
PERFORM BDC_FIELD USING 'RMMG1-MBRSH' "行业类型
'M'.
PERFORM BDC_FIELD USING 'RMMG1-MTART'
MY_DATA-MTART. "物料类型
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '0070'.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MSICHTAUSW-DYTXT(02)'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=ENTR'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(01)' "此为选的基本视图一,选中的为X
'X'.
PERFORM BDC_FIELD USING 'MSICHTAUSW-KZSEL(02)' "此为选的基本视图二,选中的为X
'X'.
PERFORM BDC_DYNPRO USING 'SAPLMGMM' '4004'.
PERFORM BDC_FIELD USING 'BDC_OKCODE'
'=BU'.
PERFORM BDC_FIELD USING 'MAKT-MAKTX' "物料描述
MY_DATA-MAKTX.
PERFORM BDC_FIELD USING 'BDC_CURSOR'
'MARA-MATKL'.
PERFORM BDC_FIELD USING 'MARA-MEINS'
'PCS'. "计量单位
PERFORM BDC_FIELD USING 'MARA-MATKL'
MY_DATA-MATKL. "物料组
PERFORM BDC_FIELD USING 'MARA-MTPOS_MARA' "普通项目类别组
''.
CALL TRANSACTION 'MM01' USING BDCDATA MODE P_MODE UPDATE P_UPDATE MESSAGES INTO MSGTAB.
REFRESH: BDCDATA. "此处不能用CLEAR: BDCDATA,但可以用 CLEAR: BDCDATA[].因为BDCDATA 是带表头的内表 BEGIN OF BDCDATA OCCURS 0.
ENDLOOP.
LOOP AT MSGTAB. "输出BDC的执行消息
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = MSGTAB-MSGID "Message ID
MSGNR = MSGTAB-MSGNR
MSGV1 = MSGTAB-MSGV1 "此为物料号
MSGV2 = MSGTAB-MSGV2
MSGV3 = MSGTAB-MSGV3
MSGV4 = MSGTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = G_MESSAGE.
WRITE :/ MSGTAB-MSGTYP, G_MESSAGE.
ENDLOOP.
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR: BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.
FORM BDC_FIELD USING FNAM FVAL.
CLEAR: BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDFORM.