某些时候我们需要把一些文件传输到SAP application service上,这时候需要用到特殊的语法。
首先需要在AL11上找到需要存放的目录。
对于已经存在的目录, AL11通过下面代码逐个获取它们的路径, 例如: DIR_HOME, DIR_GEN
CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'DIR_XXX'
ID 'VALUE' FIELD searchpoints-dirname.
对于人手维护的目录, 它们保存在表user_dir里面, 这个表还是maintenance allowed
AL11的user_dir创建
Step 1: 点configure
Step 2: 点Save保存, Create这个键没什么用, 有兴趣的可以看看代码
Step 3: 查看结果
注:存在在AL11有纪录, 但实际上不存在的目录 ,
Step 1: DIR_ZEROLI2在服务器上其实是不存在的, 当我们双击它, 会有error message抛出
Step 2: 当我们用open dataset语句去这个目录建一个文件时, 是不会成功的。
在服务器上建文件夹
方法1: SM69 or SM49
Step 1: 在SM69建一条命令, 支持dos或unix命令, 先保存再执行, 这里当然是建文件夹的命令, /c代表command
Step 2: 查看AL11结果
方法2: CALL 'SYSTEM'
用C的函数system来调用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) = 'e:\zerotest'.
CALL 'SYSTEM' ID 'COMMAND' FIELD COMMAND1
ID 'TAB' FIELD TABL-*SYS*.
BREAK-POINT ID z_zero_test.
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.
LOOP AT gt_rec INTO gw_rec.
WRITE:/ gw_rec-kunnr, gw_rec-name1, gw_rec-sortl,gw_rec-ort01,
gw_rec-pstlz, gw_rec-land1, gw_rec-spras.
ENDLOOP.
Step 3: 源文件
Step 4: 读取效果
Step 5: C机的截图
对ABAPer而言,所做的动作无非,增加,读取,删除。
新增文件:注:此时需要区分文件是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 .
CG3Y 下载文件
CG3Z 上传文件