11.5 ABAP File Interface
Physical and Logic file Name,使用默认定义Tcode:RZ11,DIR_HOME默认文件路径;
Tcode:FILE,定义Non-client-specific logical file names;
使用Function: FILE_GET_NAME,获取logic file name;
使用Function: FILE_LOGFILE_ALIAS_PBO, FILE_LOGFILE_ALIAS_PAI, and FILE_LOGFILE_ALIAS_F4,输入输出框,以及F4帮助;
类CL_ABAP_FILE_UTILITIES,提供应用服务器文件信息;
以下Statements组成ABAP文件接口:
1.OPEN DATASET
语法:
OPEN DATASET dset FOR access IN mode [position] [os_additions] [error_handling].
access: INPUT | OUTPUT | APPENDING | UPDATE
input打开文件读取,output打开文件写入,appending打开文件追加,不存在就创建,update打开文件修改;
mode:
{BINARY MODE}
| {TEXT MODE encoding [linefeed] }
| {LEGACY BINARY MODE
[{BIG|LITTLE} ENDIAN] [CODE PAGE cp]}
| {LEGACY TEXT MODE
[{BIG|LITTLE} ENDIAN] [CODE PAGE cp] [linefeed]} ... .
模式,二进制或文本模式;
encoding:编码;
ENCODING { DEFAULT
| {UTF-8 [SKIPPING|WITH BYTE-ORDER MARK]}
| NON-UNICODE } ... .
linefeed:行尾标记;
1. WITH NATIVE LINEFEED,根据操作系统,行尾标记;
2. WITH SMART LINEFEED,
3. WITH UNIX LINEFEED,"LF"作为行尾标记;
4. WITH WINDOWS LINEFEED ,"CRLF"作为行尾标记;
[position]:
AT POSITION pos ... .
[os_additions]:
[TYPE attr]
[FILTER opcom] ... .
If attr contains the value "NT", the end-of-line is marked by "CRLF".
If attr contains the value "UNIX", the end-of-line is marked by "LF".
[error_handling]:
[MESSAGE msg]
[IGNORING CONVERSION ERRORS]
[REPLACEMENT CHARACTER rc]
MESSAGE:信息;
IGNORING CONVERSION ERRORS:忽略转换错误;
REPLACEMENT CHARACTER:替换字符;
示例:
FORM f_file_interface_1. DATA:lv_file TYPE string VALUE `test.dat`. DATA:lv_result TYPE string. DATA:lv_mess TYPE string. "打开dataset,写模式 OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED. TRANSFER `1234567890` TO lv_file. "关闭dataset CLOSE DATASET lv_file. "更新模式 OPEN DATASET lv_file FOR UPDATE IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED AT POSITION 2. TRANSFER `ABCD` TO lv_file. CLOSE DATASET lv_file. "读模式 OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT WITH SMART LINEFEED MESSAGE lv_mess. WHILE sy-subrc = 0. READ DATASET lv_file INTO lv_result. WRITE:/ lv_result. ENDWHILE. CLOSE DATASET lv_file. ENDFORM.
2.TRANSFER
语法:
TRANSFER dobj TO dset [LENGTH len] [NO END OF LINE].
len小于等于0不传输任何字符字节;
以文本方式打开,写入默认添加行尾标记;
len大于dobj字符字节,添加空白或十六进制0;
示例:
FORM f_file_interface2. DATA:lv_file TYPE string VALUE `test.dat`. DATA:lt_sflight TYPE TABLE OF sflight. DATA:ls_sflight LIKE LINE OF lt_sflight. FIELD-SYMBOLS:<fs_hex> TYPE x. DATA:lv_x TYPE x LENGTH 1024. "写入二进制 OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE. SELECT SINGLE * FROM sflight INTO ls_sflight. ASSIGN ls_sflight TO <fs_hex> CASTING. TRANSFER <fs_hex> TO lv_file. "TRANSFER <fs_hex> TO lv_file LENGTH 100 NO END OF LINE. CLOSE DATASET lv_file. "读取二进制 OPEN DATASET lv_file FOR INPUT IN BINARY MODE. WHILE sy-subrc = 0. READ DATASET lv_file INTO lv_x. WRITE:/ lv_x. ENDWHILE. CLOSE DATASET lv_file. ENDFORM.
3.READ DATASET
语法:
READ DATASET dset INTO dobj [MAXIMUM LENGTH mlen] [[ACTUAL] LENGTH alen].
示例:
FORM f_file_interface3. DATA:lv_file TYPE string VALUE `test.dat`. FIELD-SYMBOLS:<fs_hex> TYPE sflight. DATA:lv_hex TYPE x LENGTH 1024. DATA:lv_maxlen TYPE I. DESCRIBE FIELD <fs_hex> LENGTH lv_maxlen IN BYTE MODE. ASSIGN lv_hex TO <fs_hex> CASTING. "读取二进制 OPEN DATASET lv_file FOR INPUT IN BINARY MODE. DO. READ DATASET lv_file INTO lv_hex MAXIMUM LENGTH lv_maxlen. IF sy-subrc = 0. WRITE:/ lv_maxlen,<fs_hex>-carrid,<fs_hex>-connid,<fs_hex>-fldate. ELSE. EXIT. ENDIF. ENDDO. CLOSE DATASET lv_file. ENDFORM.
4.GET DATASET
语法:
GET DATASET dset [POSITION pos] [ATTRIBUTES attr].
pos当前位置
attr,Type Group:DSET,结构体dset_attributes,包含两项:fixed and changeable;
fixed结构:
indicator |
Structure whose components mode, access_type, encoding, filter, and linefeed in attr contain the value "X" if the identically named components of the structure fixed are significant for the current file. |
mode |
Storage mode. "T":text files; "LT":legacy text files; "B":binary files; "LB":legacy binary files. |
access_type |
Access mode. "I":reading; "O":writing; "A":appending; "U": editing. |
encoding |
Character format. "NON-UNICODE", "UTF-8". |
filter |
filter |
linefeed |
linefeed |
changeable结构:
Component |
Meaning |
indicator |
Structure whose components repl_char, conv_errors, code_page, endian, and linefeed_mode contain the value "X" in attr if the identically named components of the structure changeable are significant for the current file. |
repl_char |
相当于REPLACEMENT CHARACTER |
conv_errors |
相当于IGNORING CONVERSION ERRORS |
code_page |
相当于CODE PAGE |
endian |
"B":BIG ENDIAN; "L" :LITTLE ENDIAN; |
linefeed_mode |
"N":WITH NATIVE LINEFEED; "S":WITH SMART LINEFEED; "U": WITH UNIX LINEFEED; "W":WITH WINDOWS LINEFEED; |
示例:
FORM f_file_interface4. DATA:lv_file TYPE string VALUE `test.dat`. DATA:lv_attr TYPE dset_attributes. DATA:lv_pos TYPE I. "读取二进制 OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8 WITH NATIVE LINEFEED. GET DATASET lv_file POSITION lv_pos ATTRIBUTES lv_attr. WRITE:/ lv_attr-fixed-mode, lv_attr-fixed-access_type, lv_attr-fixed-encoding, lv_attr-fixed-linefeed. CLOSE DATASET lv_file. ENDFORM.
5.SET DATASET
语法:
SET DATASET dset [POSITION {pos|{END OF FILE}}] [ATTRIBUTES attr].
设置dset参数。
6.TRUNCATE DATASET
语法:
TRUNCATE DATASET dset AT {CURRENT POSITION}|{POSITION pos}.
在指定位置截断文件;
7.CLOSE DATASET
语法:
CLOSE DATASET dset.
关闭dataset;
8.DELETE DATASET
语法:
CLOSE DATASET dset.
删除dataset;
11.6 Data Consistency
数据一致性,SAP通过LUWS保持数据一致性。1.Database LUWS通过,Database Locks保证数据一致性;2. SAP LUWS通过SAP locks保证数据一致性。
Database LUWS,可以显示或隐式Commit,Rollbace work;
SAP LUWS:
1. CALL FUNCTION ... IN UPDATE TASK,本地同步或异步function;
语法:
CALL FUNCTION update_function IN UPDATE TASK
[EXPORTING p1 = a1 p2 = a2
...]
[TABLES t1 = itab1 t2 = itab2
...].
2. CALL FUNCTION ... IN BACKGROUND TASK|UNIT,远程异步function;
3. PERFORM ... ON COMMIT,注册子程序在不同进程执行;
语法:
PERFORM subr ON { {COMMIT [LEVEL idx]} | ROLLBACK }.
控制SAP LUWS:每一个internal session都有一个SAP LUW;
1.COMMIT WORK
2.ROLLBACK WORK
3.SET UPDATE TASK LOCAL
语法:
SET UPDATE TASK LOCAL.
打开本地更新。
Database Locks:共享锁(Shared lock),允许创建其他共享锁,不能创建独占锁。独占锁(Exclusive lock),不允许创建其他锁。
这些OPEN SQL:SELECT SINGLE FOR UPDATE, INSERT, UPDATE, MODIFY, and DELETE创建独占锁。
隔离等级(isolation level):Uncommitted read (or dirty read)脏读,读取时不加共享锁,可能读取到未更新数据;Committed read,读取时加上共享锁,然后马上释放,保证读取到已更新数据;
所有数据库锁都将在下一次数据库提交或回滚之前释放。
SAP Locks:使用Tcode: SM12,可以查看SAP*锁表。
参考Locks function:ENQUEUE_EDEMOFLHT,DEQUEUE_EDEMOFLHT。
Function重要参数:
Parameter |
Meaning |
MODE_dbtab |
锁类型, "S" :共享锁;"E":独占锁; "X" :拓展独占锁,只可以请求一次; "O":乐观锁,开始类似共享锁,但可以转换为独占锁; |
key_fields |
键值栏位,可以定义某个键对应值锁住,如果没有指定值,锁住所有行 |
_SCOPE |
SAP LUW锁定时间. "1":处理同一程序锁; "2" :锁传递给更新程序;"3":处理同一程序锁或更新程序的锁; |
Authorizations
SAP权限检查。
权限Activity表:TACT;
用户定义Activity表:TACTZ;
维护权限字段Tcode:SU20;
维护权限对象Tcode:SU21;
生成权限对象及用户关系Tcode:PFCG;
显示权限对象及用户关系Tcode:SU03;
权限文件Tcode:SU02,PFCG;
用户主档Tcode:SU01;
权限检查:AUTHORITY-CHECK;
语法:
AUTHORITY-CHECK OBJECT auth_obj [FOR
USER user]
ID id1 {FIELD val1}|DUMMY
[ID id2 {FIELD val2}|DUMMY]
[ID id10 {FIELD val10}|DUMMY].