通过该功能模块,您可以:
检查用户执行命令的权限
执行命令
为了确定应该在哪个系统上执行命令,功能模块默认使用当前主机系统和用户的当前操作系统类型。由于功能模块支持RFC,因此可以使用RFC接口(远程函数调用接口)在不同的SAP应用程序服务器中运行功能模块。然后,在另一个SAP服务器的主机系统中相应地执行外部命令。
SXPG_CALL_SYSTEM在执行调用之前检查在调用中指定的命令。如果存在与系统字段“SY-OPSYS”中操作系统类型相同的命令,则使用此定义执行该命令。它检查与系统字段sy-opsys中具有相同操作系统类型的命令定义。语法组是一种SAP构造,用于对命令和文件名使用相同语法的操作系统进行分组。如果某个命令的操作系统类型与确定的语法组匹配,则使用该命令的定义。
如果没有为语法组找到匹配的定义,函数模块将搜索操作系统类型为ANYOS(在所有支持的操作系统中可执行)的定义。如果找到这个定义,就使用它。
否则,将触发异常COMMAND_NOT_FOUND。
- 对SAP service的上传和读取文件
T-code: AL11
AL11的user_dir创建
Step 1: 点configure
step 2,填写相关信息,并且保存
注:存在在AL11有纪录, 但实际上不存在的目录 ,DIR_ZEROLI2在服务器上其实是不存在的, 当我们双击它, 会有error message抛出,
当我们用open dataset语句去这个目录建一个文件时, 是不会成功的。
在服务器上建文件夹
- 方法1:用事务码创建 SM69 or SM49
Step 1: 在SM69建一条命令, 支持dos或unix命令, 先保存再执行, 这里当然是建文件夹的命令, /c代表command
创建完成后保存,就可以在t-code al11查看结果。
- 方法2:在代码里创建
用函数调用system command.
DATA: command1(64) TYPE c.
DATA: BEGIN OF tabl OCCURS 0,
line(200),
END OF tabl.
DATA: lt_string TYPE STANDARD TABLE OF string,
lv_strin TYPE string.
COMMAND1(9) = 'mkdir -p '.
COMMAND1+9(55) = 'z_*********'.
CALL 'SYSTEM' ID 'COMMAND' FIELD COMMAND1
ID 'TAB' FIELD TABL-*SYS*.
BREAK-POINT ID z_*********.
Open dataset访问共享文件的权限(Windows)
工作组的共享文件
Step 1: 测试环境: A机Laoxiang: XP系统(共享文件夹所在机); B机Lupkid: Win7系统(SAP gui所在机); C机Vmecc: Win2003(装在B机的VMware, 同时C机也是SAP服务器).
保证AB相互ping通, AC相互ping通
Step 2: 测试代码:
TYPE-POOLS: z07tp.
DATA: gw_rec TYPE z07tp_rec,
gt_rec TYPE STANDARD TABLE OF z07tp_rec.
CONSTANTS: cn_fname(8) TYPE c VALUE 'CUST07AD'.
CONSTANTS: cn_path(20) TYPE c VALUE '\\Laoxiang\zerotest\'.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS: pr_file(40) TYPE c.
SELECTION-SCREEN END OF BLOCK blk1.
INITIALIZATION.
pr_file = cn_fname.
START-OF-SELECTION.
CONCATENATE cn_path pr_file INTO pr_file.
OPEN DATASET pr_file IN TEXT MODE FOR INPUT ENCODING DEFAULT.
IF sy-subrc <> 0.
WRITE:/ text-002.
EXIT.
ENDIF.
DO.
READ DATASET pr_file INTO gw_rec.
IF sy-subrc <> 0.
EXIT.
ENDIF.
APPEND gw_rec TO gt_rec.
ENDDO.
END-OF-SELECTION.
CLOSE DATASET pr_file.
SFTP文件传输在程序中调使用函数SXPG_COMMAND_LIST_GET来执行外部操作命令,示例代码如下(代码中是弹出选择框让用户选择使用哪个外部命令)
*&---------------------------------------------------------------------*
*& Report ZTESTJI003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ztestji003.
DATA: BEGIN OF command_list OCCURS 0.
INCLUDE STRUCTURE sxpgcolist.
DATA: END OF command_list .
DATA: BEGIN OF exec_protocol OCCURS 0.
INCLUDE STRUCTURE btcxpm.
DATA: END OF exec_protocol.
DATA: status LIKE btcxp3-exitstat,
commandname LIKE sxpgcolist-name VALUE '*',
sel_no LIKE sy-tabix.
* GET LIST OF EXTERNAL COMMANDS
CALL FUNCTION 'SXPG_COMMAND_LIST_GET'
EXPORTING
commandname = commandname
operatingsystem = sy-opsys
TABLES
command_list = command_list
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING
endpos_col = 100
endpos_row = 20
startpos_col = 2
startpos_row = 2
titletext = 'choose a COMMAND TO execute '
IMPORTING
choise = sel_no
TABLES
valuetab = command_list
EXCEPTIONS
break_off = 1
OTHERS = 2.
IF sy-subrc EQ 0.
READ TABLE command_list INDEX sel_no.
* CHECK AUTHORIZATION
CALL FUNCTION 'SXPG_COMMAND_CHECK'
EXPORTING
commandname = command_list-name
operatingsystem = sy-opsys
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
x_error = 6
too_many_parameters = 7
parameter_expected = 8
illegal_command = 9
communication_failure = 10
system_failure = 11
OTHERS = 12.
CASE sy-subrc.
WHEN 0.
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
commandname = command_list-name
TABLES
exec_protocol = exec_protocol
EXCEPTIONS
no_permission = 1
command_not_found = 2
parameters_too_long = 3
security_risk = 4
wrong_check_call_interface = 5
program_start_error = 6
program_termination_error = 7
x_error = 8
parameter_expected = 9
too_many_parameters = 10
illegal_command = 11
wrong_asynchronous_parameters = 12
cant_enq_tbtco_entry = 13
jobcount_generation_error = 14
OTHERS = 15.
IF sy-subrc EQ 0.
WRITE:/ command_list-name, 'ran successfully'.
ELSE.
WRITE:/ 'error WITH command', command_list-name.
ENDIF.
WHEN 1.
WRITE:/'you are NOT authorized TO run', command_list-name.
WHEN OTHERS.
WRITE:/'error with FUNCTION with command', command_list-name.
ENDCASE.
ENDIF.
"popup_with_table_display
ENDIF. "sxpg_command_list_get
新增文件:注:此时需要区分文件是ASC文件还是BIN文件,以及是不是 UTF-8的unicode编码。
OPEN DATASET dname FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
OPEN DATASET filename FOR OUTPUT IN BINARY MODE.
对TEXT文件来说需要区分UTF-8,同时这里的filename需要注意大小写。
OPEN DATASET LV_PATH FOR OUTPUT IN BINARY MODE. " 以二进制形式创建
IF SY-SUBRC <> 0.
RET_CD = ''.
ERR_MSG = '附件创建失败'.
CLOSE DATASET LV_PATH.
RETURN.
ENDIF.
TRANSFER LV_DATA TO LV_PATH. " 写入内容
CLOSE DATASET LV_PATH.
对二进制文件来说,我先将其转换为RAWSTRING类型,然后transfer,再用loop做的时候我没做好。具体做法其实就是多用了一个function:
bytecount = xstrlen( lv_file ).
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = bytecount
* FIRST_LINE = 0
* LAST_LINE = 0
IMPORTING
BUFFER = lv_data
tables
binary_tab = t_rawdata.
这里SCMS_CONV的function group和cl_bcs_convert这个class的功能基本差不多。
对TEXT文本:(直接在loop循环中处理即可)
OPEN DATASET dname FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
LOOP AT it_ascii .
TRANSFER it_ascii TO dname.
TRANSFER cl_abap_char_utilities=>cr_lf TO dname.
ENDLOOP.
CLOSE DATASET dname.**
读取文件:
OPEN DATASET filename FOR INPUT IN BINARY MODE.
READ DATASET filename INTO lv_data.
CLOSE DATASET filename.
删除文件:
OPEN DATASET LV_PATH FOR OUTPUT IN BINARY MODE. " 尝试打开文件
IF SY-SUBRC <> 0. " 不为0时说明文件不存在,直接返回
CLOSE DATASET LV_PATH.
RETURN.
ENDIF.
DELETE DATASET LV_PATH. " 以二进制形式创建
IF SY-SUBRC <> 0.
RET_CD = ''.
ERR_MSG = '附件删除失败'.
CLOSE DATASET LV_PATH.
RETURN.
ENDIF.
*****************************关闭文件流****************************
CLOSE DATASET LV_PATH.
除此之外还有:
打开文件追加 :
OPEN DATASET <dsn> FOR APPENDING IN TEXT MODE ENCODING DEFAULT .
FTP(File transfer protocol)是一种标准的网络协议,可以用于在互联网上传递文件。SAP系统中提供了一些标准函数,放在函数组SFTP中, FTP服务器与SAP之间文件传输,这种方式有很多的实施案例。假设SAP中的数据要放到FTP服务器,可以通过点对点的方式,将数据形成文件放在应用服务器的某一路径下,然后使用标准的FTP函数进行文件传输;也可以通过PI进行数据集成,PI有专门的FTP adapter。也可以通过执行SAP的标准程序RSFTP005,自动创建两个名为SAPFTP何SAPFTPA的TCP/IP的RFC连接。
这些是FTP相关的一些报表:
RSFTP001 - SAPFTP 版本检查
RSFTP002 - 执行 FTP 命令
RSFTP003 - 测试
RSFTP004 - FTP 复制
RSFTP005 - SAPFTP 检查
RSFTP006 - FTP 命令清单
RSFTP007 - Test FB:FTP_SERVER_TO_r3 / FTP_R3_TO_SERVER 读取FTP数据到R3 / R3数据写入FTP。
RSFTP008 - Test FB:FTP_CLIENT_TO_R3 / FTP_R3_TO_CLIENT 读取FTP数据到…
从FTP复制文件共有两种方式,一种是直接复制文件,另一种方式是先从FTP读取文件数据到内表,拷贝再写入指定位置文件,不过该功能仅支持文本格式文件(.TXT,.DAT),一般不予推荐。
相关函数:
1)FTP_CONNECT:通过账号连接FTP。
2)FTP_COMMAND:执行FTP操作命令(注意,程序中所有命令必须为小写)。
1cd:指定本地文件夹路径;
cd:指定FTP文件夹路径;
put :上传文件;
get :下载文件;
3)FTP_SERVER_TO_R3:将FTP上的指定文本文件数据读取到内表。
4)FTP_DISCONNECT:关闭FTP连接。
REPORT ZR_EXAMPLE_07 .
DATA: KEY TYPE I VALUE 26101957,
TRFCDEST LIKE RFCDES-RFCDEST,
THANDLE TYPE I.
INCLUDE:<ICON>.
*定义输入界面
SELECTION-SCREEN:BEGIN OF BLOCK FTPLOGIN WITH FRAME TITLE TEXT-001.
PARAMETERS: P_USER(45) LOWER CASE OBLIGATORY MEMORY ID USR,
P_PWD(45) MODIF ID PWD LOWER CASE OBLIGATORY MEMORY ID PWD,
P_HOST(15) MEMORY ID HOS OBLIGATORY,
FTP_PATH(30) MEMORY ID FPOS OBLIGATORY.
SELECTION-SCREEN:END OF BLOCK FTPLOGIN.
SELECTION-SCREEN:BEGIN OF BLOCK UPLOAD WITH FRAME TITLE TEXT-002.
PARAMETERS: P_UPPATH(45),
P_FILE(20) .
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: PUSHBUTTON 1(20) PUBU USER-COMMAND UPLOAD.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN:END OF BLOCK UPLOAD.
SELECTION-SCREEN:BEGIN OF BLOCK DOWNLOAD WITH FRAME TITLE TEXT-003.
PARAMETERS: DL_PATH(45),
DL_FILE(20) .
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN: PUSHBUTTON 1(20) GEBU USER-COMMAND DOWNLOAD.
SELECTION-SCREEN: PUSHBUTTON 24(30) SHBU USER-COMMAND ITAB_DL.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN:END OF BLOCK DOWNLOAD.
AT SELECTION-SCREEN OUTPUT.
* 对密码输入栏进行加密处理
PERFORM MASK_PWD.
* 给各按钮加入文本及图标
WRITE ICON_OUTGOING_OBJECT AS ICON TO PUBU.
CONCATENATE PUBU 'Upload FTP' INTO PUBU SEPARATED BY SPACE.
WRITE ICON_INCOMING_OBJECT AS ICON TO GEBU.
CONCATENATE GEBU 'FTP download' INTO GEBU SEPARATED BY SPACE.
WRITE ICON_WRITE_FILE AS ICON TO SHBU.
CONCATENATE SHBU 'Internal table download' INTO SHBU SEPARATED BY
SPACE.
AT SELECTION-SCREEN.
PERFORM FTPCONNECT.
IF SY-SUBRC <> 0.
MESSAGE I001(00) WITH 'Can''t connect to FTP!'.
EXIT.
ENDIF.
MESSAGE S001(00) WITH 'FTP connect OK!'.
CASE SY-UCOMM.
WHEN 'ONLI'.
PERFORM FTPDISCONNECT.
EXIT.
ENDCASE.
*执行FTP功能
PERFORM FTP_EXECUTE.
*关闭FTP连接
PERFORM FTPDISCONNECT.
*-----------------------------------------------------------------------------*
* 改变密码输入框显示属性,实现密码保护 *
*-----------------------------------------------------------------------------*
FORM MASK_PWD.
LOOP AT SCREEN .
IF SCREEN-NAME = 'P_PWD'.
SCREEN-INVISIBLE = '1'.
MODIFY SCREEN .
CONTINUE.
ENDIF.
ENDLOOP.
ENDFORM. "
*-----------------------------------------------------------------------------*
* 通过IP、用户名、密码连接FTP服务器 *
*-----------------------------------------------------------------------------*
FORM FTPCONNECT.
DATA: THOSTS(45),TUSERS(45),TPWORD(45).
THOSTS = P_HOST.
TUSERS = P_USER.
TPWORD = P_PWD.
* 对密码数值进行加密解析处理
CALL 'AB_RFC_X_SCRAMBLE_STRING' " System Function
ID 'SOURCE' FIELD TPWORD
ID 'KEY' FIELD KEY
ID 'SCR' FIELD 'X'
ID 'DESTINATION' FIELD TPWORD
ID 'DSTLEN' FIELD 64.
* 定义RFC连接目标,前后台执行时不同
IF SY-BATCH = 'X'.
TRFCDEST = 'SAPFTPA'.
ELSE.
TRFCDEST = 'SAPFTP'.
ENDIF.
*该函数可以定义有网关时账户密码,一般公司内部访问时无此设置
CALL FUNCTION 'FTP_CONNECT'
EXPORTING
USER = TUSERS
PASSWORD = TPWORD
HOST = THOSTS
RFC_DESTINATION = TRFCDEST
IMPORTING
HANDLE = THANDLE
EXCEPTIONS
NOT_CONNECTED = 1
OTHERS = 2.
ENDFORM. " FTPCONNECT
*&---------------------------------------------------------------------
*& 设置结束时关闭SAP
*&---------------------------------------------------------------------
FORM FTPDISCONNECT.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
HANDLE = THANDLE.
ENDFORM. " FTPDISCONNECT
*&---------------------------------------------------------------------*
*& 通过SAP执行命令上传或下载FTP文件
*&---------------------------------------------------------------------*
FORM FTP_EXECUTE.
DATA:TSUBRC LIKE SY-SUBRC.
DATA:BEGIN OF COM OCCURS 0,
CMD(100) TYPE C,
END OF COM.
DATA:BEGIN OF RES OCCURS 0,
LINE(100) TYPE C,
END OF RES.
*指定FTP文件夹路径
IF NOT FTP_PATH IS INITIAL.
CONCATENATE 'cd' FTP_PATH INTO COM-CMD SEPARATED BY ' '.
APPEND COM.
ENDIF.
CASE SY-UCOMM.
WHEN 'UPLOAD'.
*指定上传文件夹路径及上传文件命令
CONCATENATE 'lcd' P_UPPATH INTO COM-CMD SEPARATED BY ' '.
APPEND COM.
CONCATENATE 'put' P_FILE INTO COM-CMD SEPARATED BY ' '.
APPEND COM.
WHEN 'DOWNLOAD'.
*指定下载文件夹路径及下载文件命令
CONCATENATE 'lcd' DL_PATH INTO COM-CMD SEPARATED BY ' '.
APPEND COM.
CONCATENATE 'get' DL_FILE INTO COM-CMD SEPARATED BY ' '.
APPEND COM.
ENDCASE.
LOOP AT COM FROM 1.
IF COM-CMD <> ''.
*执行FTP指令
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
HANDLE = THANDLE
COMCOMMAND = COM-CMD
TABLES
DATA = RES
EXCEPTIONS
TCPIP_ERROR = 1
COMMAND_ERROR = 2
DATA_ERROR = 3
OTHERS = 4.
*当执行失败时回执数据并退出
IF SY-SUBRC <> 0.
CASE SY-UCOMM.
WHEN 'UPLOAD'.
MESSAGE E001(00) WITH 'FTP UPLOAD FAIL!'.
WHEN 'DOWNLOAD'.
MESSAGE E001(00) WITH 'FTP DOWNLOAD FAIL!'.
ENDCASE.
EXIT.
ELSE.
*根据不同按钮的功能码判断程序执行逻辑及回执信息,当选择从内表下载功能时转入子程序
CASE SY-UCOMM.
WHEN 'UPLOAD'.
MESSAGE S001(00) WITH 'FTP UPLOAD SUCCESS!'.
WHEN 'DOWNLOAD'.
MESSAGE S001(00) WITH 'FTP DOWNLOAD SUCCESS!'.
WHEN 'ITAB_DL'.
PERFORM DL_ITAB USING THANDLE DL_PATH DL_FILE.
ENDCASE.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR:COM,RES,TSUBRC.
REFRESH:COM,RES.
ENDFORM. " FTPPUTFILE
*---------------------------------------------------------------------*
* 将FTP文本类型文件数据读取到内表 *
*---------------------------------------------------------------------*
FORM DL_ITAB USING THANDLE TYPE I
VALUE(FILEPATH) TYPE C
FILENAME TYPE C.
DATA: BEGIN OF BLOB OCCURS 0,
LINE(255) TYPE C,
END OF BLOB.
*连接字符串定义本地文件具体路径
CONCATENATE FILEPATH FILENAME INTO FILEPATH.
*将FTP文本类型文件数据读取到内表
*若所读FTP文件为非文本文件(*.txt,*.dat)时将出现错误
CALL FUNCTION 'FTP_SERVER_TO_R3'
EXPORTING
HANDLE = THANDLE
FNAME = FILENAME
TABLES
BLOBBLOB = BLOB.
*读取文件失败时退出程序并回执错误
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH 'Read FTP File FAIL!'.
EXIT.
ENDIF.
*将内表数据下载到本地文件
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FILEPATH
FILETYPE = 'DAT'
TABLES
DATA_TAB = BLOB
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5.
*将数据写入本地文件失败时回执错误
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH 'FTP Download By Internal table FAIL!'.
ELSE.
MESSAGE S001(00) WITH 'FTP Download By Internal table SUCCESS!'.
ENDIF.
ENDFORM.
CG3Y CG3Z
普通的上传下载功能
事务码: CG3Y
例如要把上面的文件下载到本地
三、上传文件
事务码 CG3Z
按照操作完成即可。