REPORT Z_30715_BDC.
*定义表内容
TYPES:
BEGIN OF GTY_MATERIAL ,
MATNR TYPE C LENGTH 18, "物料代码
MAKTX TYPE C LENGTH 80, "物料描述
BRGEW TYPE C LENGTH 20, "毛总重
NTGEW TYPE C LENGTH 20, "净重量
GEWEI TYPE C LENGTH 3, "单位
END OF GTY_MATERIAL.
*定义下载的模板
DATA: BEGIN OF GT_TEMPLATE OCCURS 0 ,
TAB1 TYPE C LENGTH 10 VALUE '物料代码',
TAB2 TYPE C LENGTH 10 VALUE '物料描述',
TAB3 TYPE C LENGTH 10 VALUE '毛重量',
TAB4 TYPE C LENGTH 10 VALUE '净重量',
TAB5 TYPE C LENGTH 10 VALUE '重量单位',
END OF GT_TEMPLATE.
DATA: GT_MATERIAL TYPE TABLE OF GTY_MATERIAL,
GS_MATERIAL TYPE GTY_MATERIAL.
DATA BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
DATA MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE."提示消息
DATA LV_MESSAGE TYPE C LENGTH 200.
DATA GV_SESSION TYPE APQI-GROUPID VALUE 'ZMM02_J02'."用session获取数据时定义的 SM35 名称
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
*应用工具栏添加下载模板按钮
SELECTION-SCREEN FUNCTION KEY 1. "1~5 数字 可以增加5个按钮
TABLES SSCRFIELDS.
"按钮
*选择屏幕 定义文件选择框
PARAMETERS P_FILES TYPE RLGRAP-FILENAME.
INITIALIZATION .
TYPE-POOLS ICON.
SSCRFIELDS-FUNCTXT_01 = '@48@下载模板'. "下载模板按钮名称
AT SELECTION-SCREEN. "处理与selection screen相关的一些输入输出。
PERFORM SELECT_SCREEN_API. "定义 下载模板按钮 功能
*为选择框添加选择界面
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILES.
PERFORM GET_FILENAME. " 获取路径名称
START-OF-SELECTION.
* 取数
* 1.从excel上传
* 2. 手工插入数据
* CLEAR GS_MATERIAL.
* GS_MATERIAL-MATNR = '4274' .
* GS_MATERIAL-MAKTX = 'testbdc' .
* APPEND GS_MATERIAL TO GT_MATERIAL.
*
* CLEAR GS_MATERIAL.
* GS_MATERIAL-MATNR = '4275' .
* GS_MATERIAL-MAKTX = 'testbdcaaa' .
* APPEND GS_MATERIAL TO GT_MATERIAL.
*
* CLEAR GS_MATERIAL.
* GS_MATERIAL-MATNR = '4276' .
* GS_MATERIAL-MAKTX = 'testbdcbbbb' .
* APPEND GS_MATERIAL TO GT_MATERIAL.
PERFORM GET_DATA. "获取数据
END-OF-SELECTION.
* 转换及调用
" 第1种方法
" PERFORM APPEND_BDCDATA.
" 2种方法,利用session
PERFORM APPEND_BDCDATA_BATCH.
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM APPEND_BDCDATA .
LOOP AT GT_MATERIAL INTO GS_MATERIAL .
CLEAR: BDCDATA, BDCDATA[], "循环执行时 清空原有数据
MESSTAB, MESSTAB[]. "清空提示消息
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
*1. CLEAR BDCDATA.
* BDCDATA-PROGRAM = ''.
* BDCDATA-DYNPRO = ''.
* BDCDATA-DYNBEGIN = ''.
* BDCDATA-FNAM = 'BDC_CURSOR'.
* BDCDATA-FVAL = 'RMMG1-MATNR'.
"2 代码格式优化
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_MATERIAL-MATNR.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=BU'.
PERFORM APPEND_FIELDS USING 'MAKT-MAKTX' GS_MATERIAL-MAKTX .
PERFORM APPEND_FIELDS USING 'MARA-MEINS' 'EA'.
PERFORM APPEND_FIELDS USING 'MARA-MATKL' '23000000'.
PERFORM APPEND_FIELDS USING 'MARA-SPART' '00'.
PERFORM APPEND_FIELDS USING 'MARA-GEWEI' 'KG'.
PERFORM APPEND_FIELDS USING 'MARA-NTGEW' '200'.
CALL TRANSACTION 'MM01' USING BDCDATA "使用内表 bdcdata 调用事务代码 mm02
UPDATE 'S' " 更新模式:S 同步 A 异步
MODE 'A' "显示模式 A 前台 N 后台 E 只显示错误
MESSAGES INTO MESSTAB."消息提示
IF SY-SUBRC = 0.
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '801'. "物料修改成功
IF SY-SUBRC = 0.
WRITE: / '物料', GS_MATERIAL-MATNR, '修改成功'.
ELSE.
READ TABLE MESSTAB WITH KEY MSGID = 'M3'
MSGNR = '801'. "数据未修改的时候 物料修改成功
IF SY-SUBRC = 0.
WRITE: / '物料修改失败'.
WRITE: / '物料', GS_MATERIAL-MATNR, '失败原因:'.
LOOP AT MESSTAB WHERE MSGTYP = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = MESSTAB-MSGID
MSGNR = MESSTAB-MSGNR
MSGV1 = MESSTAB-MSGV1
MSGV2 = MESSTAB-MSGV2
MSGV3 = MESSTAB-MSGV3
MSGV4 = MESSTAB-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
WRITE: / 'E', LV_MESSAGE.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM APPEND_FIELDS USING VALUE(P_PROGRAM) VALUE(P_DYNPRO) .
CLEAR BDCDATA.
BDCDATA-FNAM = P_PROGRAM.
BDCDATA-FVAL = P_DYNPRO.
APPEND BDCDATA.
ENDFORM.
FORM APPEND_SCREEN USING VALUE(P_PROGRAM) VALUE(P_DYNPRO) .
CLEAR BDCDATA.
BDCDATA-PROGRAM = P_PROGRAM.
BDCDATA-DYNPRO = P_DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GET_DATA .
* 1.获取本地文件路径
* 2.从文件中获取数据
"文件类型转换 FILENAME是String类型
DATA LV_FILES TYPE STRING.
CHECK P_FILES IS NOT INITIAL.
TRANSLATE P_FILES TO UPPER CASE.
FIND '.TXT' IN P_FILES.
IF SY-SUBRC = 0.
LV_FILES = P_FILES.
* txt文件的上传
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = LV_FILES
* FILETYPE = 'ASC'
HAS_FIELD_SEPARATOR = 'X' "根据空格分隔
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
DATA_TAB = GT_MATERIAL
* CHANGING
* ISSCANPERFORMED = ' '
* EXCEPTIONS
* FILE_OPEN_ERROR = 1
* FILE_READ_ERROR = 2
* NO_BATCH = 3
* GUI_REFUSE_FILETRANSFER = 4
* INVALID_TYPE = 5
* NO_AUTHORITY = 6
* UNKNOWN_ERROR = 7
* BAD_DATA_FORMAT = 8
* HEADER_NOT_ALLOWED = 9
* SEPARATOR_NOT_ALLOWED = 10
* HEADER_TOO_LONG = 11
* UNKNOWN_DP_ERROR = 12
* ACCESS_DENIED = 13
* DP_OUT_OF_MEMORY = 14
* DISK_FULL = 15
* DP_TIMEOUT = 16
* OTHERS = 17
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ELSE.
FIND '.XLSX' IN P_FILES.
IF SY-SUBRC = 0.
DATA LA_RAW TYPE TRUXS_T_TEXT_DATA.
*excel 文件上传
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
I_FIELD_SEPERATOR = 'X'
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = LA_RAW
I_FILENAME = P_FILES
TABLES
I_TAB_CONVERTED_DATA = GT_MATERIAL
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GET_FILENAME .
REFRESH GT_TEMPLATE.
APPEND GT_TEMPLATE.
* 1.获取文件路径
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' ' "默认文件名称
* DEF_PATH = ' ' "默认文件路径
MASK = ',excel.xls,*.xls,excel.xlsx,*.xlsx,text.txt,*.txt. '
MODE = 'o ' "s 保存 o 打开
TITLE = '打开文件 ' "窗口的显示名称
IMPORTING
FILENAME = P_FILES
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECT_SCREEN_API
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SELECT_SCREEN_API .
CASE SSCRFIELDS-UCOMM .
WHEN 'FC01'.
PERFORM DOWNLOAD_TEMPLATE. "下载模板
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM DOWNLOAD_TEMPLATE .
* 1.获取文件路径
REFRESH GT_TEMPLATE.
APPEND GT_TEMPLATE.
DATA LV_FILE TYPE STRING.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
MASK = '.EXCEL,*.XLSX. '
MODE = 'S'
* TITLE = ' '
IMPORTING
FILENAME = LV_FILE
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CHECK LV_FILE IS NOT INITIAL."避免上面function报错导致下面function不执行 加个判断
* 2.将内表下载到指定文件路径的文件中
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = LV_FILE
* FILETYPE = 'ASC'
* APPEND = ' '
WRITE_FIELD_SEPARATOR = 'X'
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = GT_TEMPLATE
* FIELDNAMES = "每列的描述的内表
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA_BATCH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM APPEND_BDCDATA_BATCH .
*开启session
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
* CLIENT = SY-MANDT
* DEST = FILLER8
GROUP = GV_SESSION
* HOLDDATE = FILLER8
KEEP = 'X'
USER = SY-UNAME
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* IMPORTING
* QID =
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
EXIT.
ENDIF.
* DATA:s TYPE string.
LOOP AT GT_MATERIAL INTO GS_MATERIAL .
CLEAR: BDCDATA, BDCDATA[], "循环执行时 清空原有数据
MESSTAB, MESSTAB[]. "清空提示消息
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0060'.
*1. CLEAR BDCDATA.
* BDCDATA-PROGRAM = ''.
* BDCDATA-DYNPRO = ''.
* BDCDATA-DYNBEGIN = ''.
* BDCDATA-FNAM = 'BDC_CURSOR'.
* BDCDATA-FVAL = 'RMMG1-MATNR'.
" 前导零
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = GS_MATERIAL-MATNR
IMPORTING
OUTPUT = GS_MATERIAL-MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
"2 代码格式优化
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'RMMG1-MATNR'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'RMMG1-MATNR' GS_MATERIAL-MATNR.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '0070'.
PERFORM APPEND_FIELDS USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=ENTR'.
PERFORM APPEND_FIELDS USING 'MSICHTAUSW-KZSEL(01)' 'X'.
PERFORM APPEND_SCREEN USING 'SAPLMGMM' '4004'.
PERFORM APPEND_FIELDS USING 'BDC_OKCODE' '=BU'.
PERFORM APPEND_FIELDS USING 'MAKT-MAKTX' GS_MATERIAL-MAKTX .
PERFORM APPEND_FIELDS USING 'MARA-MEINS' 'EA'.
PERFORM APPEND_FIELDS USING 'MARA-MATKL' '23000000'.
PERFORM APPEND_FIELDS USING 'MARA-SPART' '00'.
PERFORM APPEND_FIELDS USING 'MARA-GEWEI' 'KG'.
PERFORM APPEND_FIELDS USING 'MARA-NTGEW' '200'.
CALL TRANSACTION 'MM02'
USING BDCDATA "使用内表 bdcdata 调用事务代码 mm02
UPDATE 'S' " 更新模式:S 同步 A 异步
MODE 'A' "显示模式 A 前台 N 后台 E 只显示错误
MESSAGES INTO MESSTAB. "消息提示
*向session中插入事务
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'MM02'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
DYNPROTAB = BDCDATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
*关闭事务
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ELSE.
WRITE:/ 'SESSION创建成功'.
ENDIF.
ENDFORM.