您的位置:首页 > 数据库

将Excel导入SAP数据库表

2016-05-30 15:43 525 查看
如何将Excel导入Sap系统,在sap可执行程序中可以通过调用函数ALSM_EXCEL_TO_INTERNAL_TABLE实现

实现简单效果如下:



选择文件:



点击选择后,文件地址会写入地址栏:



最后点击执行:



具体代码部分如下:

*&---------------------------------------------------------------------*
*& 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 ,调用函数即可,但是单纯的调用系统函数还不能完成,还需要我们创建数据表的维护对话框等。

在我们创建完透明表后:



点击实用程序–>表维护生成器:



这里一次维护权限组、函数组。然后维护屏幕编号,可按系统自选。

最后点击左上角一张纸的图标,即可。

这样,我们执行程序选择维护,点击执行时,就会弹出对应窗口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sap abap excel 导入 函数