最近准备学习open dataset, 之前项目也遇到了一个共享目录的权限问题, 所以我决定先学习一下AL11和共享目录的问题,
这里先说AL11吧.
AL11里面有很多目录, 有些是安装了SAP后就已经存在了, 有些是人为地加上去的.
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的目录是否存在的问题
在AL11有纪录, 但实际上不存在的目录
Step 1: DIR_ZEROLI2在服务器上其实是不存在的, 当我们双击它, 会有error message抛出
Step 2: 当我们用open dataset语句去这个目录建一个文件时, 是不会成功的, 代码如下:
DATA: lv_file TYPE string VALUE 'E:\zerotest2\ZZERO.TXT'. TYPES: BEGIN OF ty_luke, key1 TYPE zluke-key1, year1 TYPE zluke-year1, month1 TYPE zluke-month1, test TYPE zluke-test, END OF ty_luke. DATA: lw_luke_temp TYPE ty_luke. OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = 0. CLEAR: lw_luke_temp. lw_luke_temp-key1 = '1'. lw_luke_temp-year1 = '1999'. lw_luke_temp-month1 = '01'. lw_luke_temp-test = 'Zerot'. TRANSFER lw_luke_temp TO lv_file. IF sy-subrc = 0. BREAK-POINT ID z_zero_test. ENDIF. CLOSE DATASET lv_file. ENDIF.
在AL11没有纪录, 但实际上存在的目录
Step 1: 测试系统的服务器是windows系统, 所以c:\windows是存在的, 我们用代码建一个文件
DATA: lv_file TYPE string VALUE 'C:\windows\zrobin.TXT'. TYPES: BEGIN OF ty_luke, key1 TYPE zluke-key1, year1 TYPE zluke-year1, month1 TYPE zluke-month1, test TYPE zluke-test, END OF ty_luke. DATA: lw_luke_temp TYPE ty_luke. OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc = 0. CLEAR: lw_luke_temp. lw_luke_temp-key1 = '1'. lw_luke_temp-year1 = '1999'. lw_luke_temp-month1 = '01'. lw_luke_temp-test = 'Zerot'. TRANSFER lw_luke_temp TO lv_file. IF sy-subrc = 0. BREAK-POINT ID z_zero_test. ENDIF. CLOSE DATASET lv_file. ENDIF.
Step 2: 我们把c:\windows挂上AL11, 查看我们的结果
在服务器上建文件夹
方法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机的截图
Step 6: 去掉A机共享文件夹的Everyone权限
Step 7: C机无法访问zerotest
Step 8: 同时程序也没法访问共享文件
其实我更想测试的是: 是否可以通过限制启动SAP的这个用户的访问文件夹权限就能限制open dataset读取共享文件的权限, 但工作组模式没法做到这点测试, 因为工作组模式只能限制本地的账号和everyone的访问权限...
所以我也在2003开启了域控制器来测试, 因为域的共享模式可以很好地控制每台机子的权限, 域中所有的用户都属于域, 而不属于某台计算机, 但当我配好一切后, 却发现SAP无法登陆, 估计是某个端口被占用了... 有机会我再找三台独立的物理机子来测试看看吧, 一台作为域控制器, 一台SAP服务器, 一台GUI客户机...