将Excel导入SAP数据库表
2016-05-30 15:43
525 查看
如何将Excel导入Sap系统,在sap可执行程序中可以通过调用函数ALSM_EXCEL_TO_INTERNAL_TABLE实现。
实现简单效果如下:
选择文件:
点击选择后,文件地址会写入地址栏:
最后点击执行:
具体代码部分如下:
我们需要自建一个透明表,注意上面定义类型时,我们参考的组件就是自建透明表组件,如下就是我们定义好的透明表:
注意一点:自建表时,客户端字段一定要有,其次主键要勾选“键”(如图示)。
这部分代码实现的就是当我们点击下图中红圈中的图标时:
弹出选择对话框(如图所示)
这里通过类方法实现(具体看FORM OPEN_DIALOG中的代码):
类接口CL_GUI_FRONTEND_SERVICES调用方法FILE_OPEN_DIALOG。
这样,一个简单的导入程序就完成了。
这里需要说明,使用ALSM_EXCEL_TO_INTERNAL_TABLE函数导入数据,一个excel文件最大行数只可为9999,如果超出是无法全部读入内表中的,会丢失其余行。
最后,当选择维护选项的时候,我们想要能够展示出数据库表的内容,并且能实现增删查改。这里我们就通过维护视图功能实现。
代码中的子例程 FORM FRM_CALL_VIEW ,调用函数即可,但是单纯的调用系统函数还不能完成,还需要我们创建数据表的维护对话框等。
在我们创建完透明表后:
点击实用程序–>表维护生成器:
这里一次维护权限组、函数组。然后维护屏幕编号,可按系统自选。
最后点击左上角一张纸的图标,即可。
这样,我们执行程序选择维护,点击执行时,就会弹出对应窗口。
实现简单效果如下:
选择文件:
点击选择后,文件地址会写入地址栏:
最后点击执行:
具体代码部分如下:
*&---------------------------------------------------------------------* *& Report **** *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ****. TABLES: ZTABLE001. "假设我们要上传的内容有两个字段:序号,内容。然后定义类型,包含两个组件即序号和内容" TYPES:BEGIN OF TY_ZT, NUM TYPE ZTABLE001-NUM,"序号" TXT TYPE ZTABLE001-TXT,"内容" END OF TY_ZT. "定义参照TY_ZT类型的内表和工作区,用于暂存取到的Excel内容" DATA:I_TABLE TYPE TABLE OF TY_ZT, W_TABLE TYPE TY_ZT.
我们需要自建一个透明表,注意上面定义类型时,我们参考的组件就是自建透明表组件,如下就是我们定义好的透明表:
注意一点:自建表时,客户端字段一定要有,其次主键要勾选“键”(如图示)。
"定义内表,用于insert或modify透明表内容" DATA:GT_TABLE TYPE TABLE OF ZTABLE001,"直接参照透明表" GW_TABLE TYPE ZTABLE001. "选择屏幕" SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(9) STR1."维护" PARAMETERS P_1 RADIOBUTTON GROUP G1 DEFAULT 'X'."单选" SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(9) STR2 ."导入" PARAMETERS P_2 RADIOBUTTON GROUP G1."单选" SELECTION-SCREEN COMMENT 16(2) STR3. PARAMETERS P_FILE(80)."地址栏" SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK B1. INITIALIZATION. STR1 = '维护'. STR2 = '导入'. "导入文件地址栏就是一个parameter ,这里通过一个radiobutton单选按钮,选择 维护或导入两种功能。选择屏幕写好之后,接下来要用到的就只有 P_FILE 这个参数已经调用相应的函数。"
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM OPEN_DIALOG."调用选择文件函数"
这部分代码实现的就是当我们点击下图中红圈中的图标时:
弹出选择对话框(如图所示)
这里通过类方法实现(具体看FORM OPEN_DIALOG中的代码):
类接口CL_GUI_FRONTEND_SERVICES调用方法FILE_OPEN_DIALOG。
AT SELECTION-SCREEN."用于屏幕输入检验" IF P_2 = 'X'. IF P_FILE IS INITIAL. MESSAGE '文件地址不可为空!' TYPE 'S' DISPLAY LIKE 'E'. STOP. ENDIF. ENDIF. START-OF-SELECTION. IF P_1 = 'X'. PERFORM FRM_CALL_VIEW. ELSEIF P_2 = 'X'. PERFORM UPLOAD. ENDIF. END-OF-SELECTION. FORM FRM_CALL_VIEW."维护视图" DATA:P_TABNAM LIKE DD02V-TABNAME."Char(30)" P_TABNAM = 'ZTABLE001'. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' "调用维护视图" EXPORTING ACTION = 'S' VIEW_NAME = P_TABNAM "表名" EXCEPTIONS CLIENT_REFERENCE = 1 FOREIGN_LOCK = 2 INVALID_ACTION = 3 NO_CLIENTINDEPENDENT_AUTH = 4 NO_DATABASE_FUNCTION = 5 NO_EDITOR_FUNCTION = 6 NO_SHOW_AUTH = 7 NO_TVDIR_ENTRY = 8 NO_UPD_AUTH = 9 ONLY_SHOW_ALLOWED = 10 SYSTEM_FAILURE = 11 UNKNOWN_FIELD_IN_DBA_SELLIST = 12 VIEW_NOT_FOUND = 13 MAINTENANCE_PROHIBITED = 14 OTHERS = 15 . IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM OPEN_DIALOG."选择文件会话。" DATA:LT_FILE_TABLE TYPE FILETABLE. DATA:LW_FILE_TABLE TYPE FILE_TABLE. DATA:L_RC TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = '选择文件' DEFAULT_FILENAME = '*.XLSX' "默认excel文件" INITIAL_DIRECTORY = 'D:\ ' "默认打开D盘,也可以默认空" MULTISELECTION = '' "文件单选" CHANGING FILE_TABLE = LT_FILE_TABLE RC = L_RC EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 others = 5 . CHECK L_RC EQ 1."因为文件单选,所以这里判断一下选择的数量为1" READ TABLE LT_FILE_TABLE INDEX 1 INTO P_FILE. "将选择的文件地址写入到地址栏" ENDFORM. FORM UPLOAD."最后也是最关键的一步" "定义表格结构内表。" DATA: I_EXCEL TYPE TABLE OF ALSMEX_TABLINE,"表格结构。" W_EXCEL TYPE ALSMEX_TABLINE. "ALSMEX_TABLINE是具有Excel数据的表行,有三个组件,row col value 。" DATA:GET_FILE TYPE RLGRAP-FILENAME."这里参照系统中的结构字段。" MOVE P_FILE TO GET_FILE."将地址栏的值赋值给GET_FILE" "调用此函数,将Excel中的内容以类似坐标的形式存储到I_excel内表中。" CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = GET_FILE I_BEGIN_COL = 1 I_BEGIN_ROW = 1 I_END_COL = 8 I_END_ROW = 65535 TABLES INTERN = I_EXCEL EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3 . DELETE I_EXCEL WHERE ROW = 1."删除第一行抬头。如果excel文件中不存在抬头的话,可不写此句。" IF I_EXCEL IS INITIAL. CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE' EXPORTING * DEFAULTOPTION = 'Y' DIAGNOSETEXT1 = '数据错误' * DIAGNOSETEXT2 = ' ' * DIAGNOSETEXT3 = ' ' TEXTLINE1 = 'Excel表格中没有内容!' TITEL = '提示' . RETURN. ENDIF. CLEAR:I_TABLE. FIELD-SYMBOLS:<FS>."这里涉及到SAP内部字段的使用,详情请参见微博相关介绍。" SORT I_EXCEL BY ROW COL. DATA:NUM_COL TYPE I. LOOP AT I_EXCEL INTO W_EXCEL. NUM_COL = W_EXCEL-COL. ASSIGN COMPONENT NUM_COL OF STRUCTURE W_TABLE TO <FS>. <FS> = W_EXCEL-VALUE. AT END OF ROW. APPEND W_TABLE TO I_TABLE. CLEAR:W_TABLE. ENDAT. CLEAR:W_EXCEL. ENDLOOP. LOOP AT I_TABLE INTO W_TABLE. GW_TABLE-MANDT = SY-MANDT."客户端号,创建透明表必须包含的字段。" GW_TABLE-NUM = W_TABLE-NUM. GW_TABLE-TXT = W_TABLE-TXT. APPEND GW_TABLE TO GT_TABLE. CLEAR:GW_TABLE. CLEAR:W_TABLE. ENDLOOP. "将数据库中内容更新" MODIFY ZTABLE001 FROM TABLE GT_TABLE."这里使用modify,兼顾增加和修改,若主键存在则为修改,否则增加" IF SY-SUBRC = 0. COMMIT WORK AND WAIT."成功提交,或者最后程序结束系统也会自动提交" DATA:NUM_TAB(6) TYPE C. DESCRIBE TABLE GT_TABLE LINES NUM_TAB. CONDENSE NUM_TAB NO-GAPS. DATA:STR_LINE1 TYPE STRING . CONCATENATE '成功导入数据' NUM_TAB '行' INTO STR_LINE1 . "读出excel中的数据条数,用于消息提示" CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE' EXPORTING DIAGNOSETEXT1 = '成功' TEXTLINE1 = STR_LINE1 TITEL = '提示' . ELSE. ROLLBACK WORK."否则失败" ENDIF. ENDFORM.
这样,一个简单的导入程序就完成了。
这里需要说明,使用ALSM_EXCEL_TO_INTERNAL_TABLE函数导入数据,一个excel文件最大行数只可为9999,如果超出是无法全部读入内表中的,会丢失其余行。
最后,当选择维护选项的时候,我们想要能够展示出数据库表的内容,并且能实现增删查改。这里我们就通过维护视图功能实现。
代码中的子例程 FORM FRM_CALL_VIEW ,调用函数即可,但是单纯的调用系统函数还不能完成,还需要我们创建数据表的维护对话框等。
在我们创建完透明表后:
点击实用程序–>表维护生成器:
这里一次维护权限组、函数组。然后维护屏幕编号,可按系统自选。
最后点击左上角一张纸的图标,即可。
这样,我们执行程序选择维护,点击执行时,就会弹出对应窗口。
相关文章推荐
- mysql load data 导出、导入 csv
- 使用Python生成Excel格式的图片
- Excel 曝出 Power Query 安全漏洞,1.2 亿用户易受远程 DDE 攻击
- Mootools 1.2教程 函数
- VBA将excel数据表生成JSON文件
- excel vba 限制工作表的滚动区域代码
- excel vba 高亮显示当前行代码
- autoit InputBox 函数
- 文件遍历排序函数
- db2 导入导出单个表的操作详解
- 关于C#中排序函数的总结
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数