1.引用類型z_ref數據對象myref在程序中的聲明方式:
DATAmyrefTYPEz_ref.
CREATEDATAmyrefTYPEz_ref.
2.參照數據字典中的表類型生成內表對象或結構體:
DATAmytableTYPEz_table,”數據字典表類型,聲明內表.
mylineTYPELINEOFz_table.”表類型的行結構,聲明結構體.
3.取系統日期:SY-DATUM,
4.取系統時間:SY-UZEIT.0
5.系統字段定位:SY-FDPOS.字符比較結果為真時,此字段將給出偏移量信息.
6.系統字段SY-FDPOS給出字符的位置信息.(P109)
7.系統字段SY-INDEX記錄循環語句中的循環次數
8.操作內表行結束后系統字段SY-TABIX返回該行索引.對於所有行操作,如果操作成功,系統變量SY-SUBRC返回0,否則返回非0值.
9.系統用戶名:SY-UNAME.
10.SY-HOST?屏幕序號:sy-dynnr.
11.OK代碼:SY-UCOMM或SYST-UCOMM
12.屏幕組ID:SY-DYNGR.
13.常量聲明:CONSTANTconst(len)TYPEtype|LIKEdobj[DECIMALSdec][VALUEval].
14.確定數據對象屬性:DESCRIBEFIELDf[LENGTHl][TYPEt[CONPONENTSn]][OUTPUT-LENGTHo][DECIMALSd][EDITMASKm][HELP-IDh].
15.數據賦值:MOVEsourceTOdestination.或destination=source.
16.設定初始值:CLEARF.
17.檢查字段是否為初始值:fISINITIAL….
18.檢查字段是否被分配:fsISASSIGNED…..
19.檢查過程中的參數是否被實參填充:pIS[SUPPLIED|REQUESTED]….
20.檢查數據對象的值是否屬于某範圍之間:f1BETWEENf2ANDf3…..
21.檢查數據對象f的內容是否遵從某個選擇表的邏輯條件:finseltab….
22.WRITE:/10g,”在10個空格后輸出變量g
/(8)timeusingeditmask‘__:__:__’.”輸出的變量time保持8位的長度.
23.將光標移動到下一行:SKIP.
24.強制結束循環:EXIT,STOP或REJECT.
25.循環的中止:CONTINUE無條件中止當前循環並開始下一輪循環,CHECK條件為真時循環,為假時結束本次循環並開始下一輪循環,EXIT無條件中止並退出整個循環.
26.將字符串左移:SHIFTstring.
27.連接字符串:CONCATENATEs1s2…..snINTOs_dest[SEPARATEDBYsep].如果結果出現被截斷的情況,將SY-SUBRC返回4,否則返回0.符號&用于在字字符串換行時的連接.
28.根據分隔符sep拆分字符串:SPLITs_sourceATsepINTOs1s2……sn.使用內表操作可以避免被截斷的情況:SPLITs_sourceATsepINTOTABLEitab.此語句根據子串數目生成n行的內表.
29.循環輸出內表的每一行數據:LOOPATitabINTOtext.ENDLOOP.
30.替換字段內容:REPLACEstr1WITHstr2INTOs_dest[LENGTHlen].字段SY-SUBRC的返回值為0時表示己成功替換.
31.確定字段長度:[COMPUTE]n=STRLEN(str).
32.刪除字符串中的多余空格:CONDENSE
33.字符轉換,如將ABC轉換為abc:TRANSLATE
34.創建一個可以排序的格式:CONVERTTEXT.
35.用一個字符串覆蓋另一個字符串:OVERLAY
36.WRITETO賦值時將忽略數據對象的類型,而將其視為字符類型數據.
37.字符串比較中的換碼字符:#,用於轉換比較時使用的通配符:*或+.及進行區分大小寫,空格的比較,如#A表示比較大寫的A.
38.定位操作子串:strName[+0][(1)].
39.字段符號,數據引用:動態數據對象.
40.子程序定義:FORMsubroutine_nameUSINGparameters1parameters2….….ENDFORM.
41.子程序調用:PERFORMsubroutine_nameUSINGactual_parameters1p2….(其中USING可換成CHANGING)
42.ULINE.輸出下劃線.
43.錯誤查看:ST22
44.程序打包release:SE01:找到對應的程序,點開后點上面小汽車,再選中上面的后再點小汽車.點check.程序修改后需要重新打包.
45.制作T-CODE:SE93,TCODE應按順序編號:ZMF+流水號,我的程序名
46.創建table:t-code:se11,attributes:Deliveryclass:C.開發類別:ZFI,當自定義Fieldtype時,名稱需為Z+…..格式.->設置技術屬性(TechnicalSetting):Logicalstorageparameters中Dataclass:APPL1,Sizecategory:4à創建functiongroup:SE80,創建好后將創建的TABLE挂接到functiongrouph上去:用se11查出table,點utilites->tablemaintenancegenerator:Authorizationgroups:&NC&,Functiongroup中填剛才創建的功能組名稱->onestep->overviewscreen中必須填未使用的number,此處screennumber與table是一一對應的關系,也可讓點系統上面的按鈕:findscreennumber來自動搜索適合的scr.Number.->create,成功后,找到對應的functiongroup中的screennumber雙擊即可看到生成的代碼.需要修改欄位名稱可在functiongroup中的elementlist或layout中.-->se93創建t-code,startobject選transactionwithparameters(parametertransaction)->defaultvaluesfor->transantion:SM30->DefaultValues->nameofscreenfield:viewname\update,value:tablename\X.
47.field-sign:,field—option:,field-low:表示選擇條件中起始值
48.在where子句中如果只有一個表的話,可以不用指定表名.
49.獲取用戶IP地址及用戶名:
callfunction'TH_USER_INFO'"GetuserIP,hostname
importing
hostaddr=iporg”轉化前的IP地址
terminal=host”電腦名
exceptions
others=1.
"Conv.IPaddrtoformat'xxx.xxx.xxx.xxx'
callfunction'ZGJ_IPADR2STRING'"Conv.IPaddr
exporting
ipadr=iporg”轉化前的IP地址
importing
string=ipdec.”轉化后的最終需要的IP地址
50.刪除內表中數據完全相同的行,只保留一行:deleteadjacentduplicatesfromitab1COMPARING<f1><f2>/COMPARINGALLFIELDS.
51.spro:后臺設定
52.輸出選擇框write:/itab1-flagascheckbox
第四章ABAP基礎
4.1.5程序運行
1.程序內部調用,如下表:
功能報表調用語句事務調用語句
無返回調用SUBMITLEAVETOTRANSACTION
調用並返回SUBMITANDRETURNCALLTRANSACTION
例:
REPORTz_calling_program.
START-OF-PROGRAM.
WRITE‘Thisprogramcallsanotherprogram.’.”此內容在輸出界面看不到
SUBMITz_simple_program.”上面的輸出被此程序覆蓋.
如果改用SUBMITANDRETURN來調用則可以輸出以上內容.
2.結束程序:LEAVEPROGRAM.可在任意點強制結束當前運行的程序.
4.1.6內存管理
SAP程序同一個用戶和系統可進行最多6個SAPGUI主會話.
4.2.1數據定義
TYPES:BEGINOFt_staff,
S_no(3)typen,
Name(20),
ENDOFt_staff.
DATAstaffTYPEt_staff.
上例中定義了一個結構類型t_staff,並根據其聲明了一個結構體對象staff.
數據類型中的扁平結構與縱深結構:
扁平類型:運行時長度固定的類型.
縱深類型:運行時長度可巒的類型.
4.2.2ABAP內置基本數據類型:
數據
類型默認大小有效大小初始值說明示例
C11-65535SPACE文本字符(串)‘name’
N11-65535’00…0’數字文本‘0123’
T66‘000000’時間(HHMMSS)‘123010’
D88‘00000000’日期(YYYYMMDD)‘20080101’
I440整型(整數)99
F880浮點數5E+04
P81-160壓縮數12.91
X11-65535X‘0’十六進制數‘3A’
String1無限定SPACE字符串(長度可巒)‘AString’
XString1無限定SPACE十六進制字符串‘A3FF’
注意:
1.其中C,N,T,D,I,F,P,X為定長類型,即在運行期間長度不能改變.
2.類型T,D,I,F的數據存儲長度是固定的,不能指定參照其生成的數據對象占用的內存字節數.
3.基于類型C,N,P,X生成的數據對象需要在聲明時指定其長度.否則取默認值.
4.如果在聲明一個數據對象時未指明其數據類型,則該數據默認為C類型.
5.類型I的數值範圍:-231到231-1的整數.如果運算時出現非整型結果則進行四舍五入取值.而不是截斷小數.
6.類型P用于聲明小數位固定的壓縮數,其占據內存字節數和數值範圍取決於定義時指定的整個數據的大小和小數點后位數,如果不指定小數位,則將其視為I類型數據.有效大小可以是從1~16字節的任意值,小數點后最多允許14個數字.
7,類型F為浮點數,浮點意思是數字在內存中以字節形式表示,數值範圍:1*10-307到1*10308,因系統將F類型轉換為二進制數,所以可能出現舍入誤差,若用戶要求較高精度且數值較大時,應使用P類型數據.
8.長度可巒的內置類型String,XString是通過引用實際動態的數據對象的固定內存地址來操作.
4.2.3程序內部數據定義
參照自定義類型或內置類型生成數據的語法格式:
TYPES|DATA…TYPEl_type…
參照程序中已經聲明的數據對象生成新數據語法:
TYPES|DATA…LIKEdobj…
3.結構類型和結構體
參照結構類型生成的數據對象稱為結構體.
TYPES|DATA:BEGINOFstructure.
k1[TYPEtype|LIKEdobj]…,
k2[TYPEtype|LIKEdobj]…,
…
kn[TYPEtype|LIKEdobj]…,
ENDOFstructure.
參照生成:
參照結構生成:TYPES|DATAstructureTYPEstr_type|LIKEstr_dobj...
參照數據庫表生成:TYPES|DATAstructureTYPEdbtab.
4.表類型和內表
表類型的對象稱為內表.
4.2.4數據字典中的類型
l數據元素(Dataelements),相當於ABAP中的基本類型和引用類型.
l結構(Structures),由數據元素字段構成,對應ABAP中的結構類型.
l表類型(Tabletypes),對應ABAP中的表類型.
數據字典中的數據類型與ABAP中的中數據類型對應關系:
數據字典類型ABAP類型運行長度說明
ACCPN(6)6會計結算周期
CHARC(n)1~255字符
CLNTC(3)3集團,數據區域代碼
CUKYC(5)5貨幣代碼
CURR(n,m)P((n+1)/2)DECIMALm1~17貨幣金額
DATSD(8)8日期
DECn,mP((n+1)/2)DECIMALmn(1~31)m(1~17)數值計算
FLTPF(8)18浮點數
INT1X(1)(類型b)3單字節整型數
INT2X(2)(類型s)5雙字節整型數
INT4X(4)(類型i)10四字節整型數
LANGC(1)內部1位外部2位語言代碼
LCHRC(n)256~最大值長字符
LRAWX(n)256~最大值長位字符
NUMCnN(n)1~255數值文字
PRECX(2)16精確度
QUANn,mP((n+1)/2)DECIMALm1~17數量
RAWnX(n)1~255位字串
TIMST(6)6時間
VARCnC(n)255~最大值長字符(僅V3.0前可用)
STRINGSTRING1~最大值字符串
RAWSTRINGXSTRING1~最大值位字符串
UNITC(n)2~3單位
4.2.5程序中的數據對象
1.文字對象
當字符文字長度超過編輯器的一行時,可以使用”&”進行連接,避免因換行而產生的多余空格,如:long=‘Thisis‘&
‘alongsentence’.
如果需要輸出“’”,則需要在前面多加一個“’”轉回願意.
2.有名稱的數據對象
常量聲明:
CONSTANT:const(len)TYPE|LIKEdobj[DECIMALSdec]VALUEval.
結構體常量聲明(每個組件必須指定初始值):
CONSTANT:BEGINOFstructure,
str1TYPE|LIKEdobj[DECIMALSdec]VALUEval,
str2TYPE|LIKEdobj[DECIMALSdec]VALUEval,
...,
strnTYPE|LIKEdobj[DECIMALSdec]VALUEval,
ENDOFstructure.
3.系統數據對象(見附表)
4.查明數據對象屬性
DESCRIBEFIELDfLENGTHlen.此語句將字段f的長度寫入變量len.
lLENGTH:確定數據對象長度.
lTYPE:確定數據對象類型.
lOUTPUT-LENGTH:確定實際輸出長度.
lDECIMALS:確定P類型小數位長.
lEDITMASK:確定在數據字典中定義轉換例程.
lHELP-ID:確定在數據字典中定義的F1幫助信息.
4.3基本數據操作
4.3.1數據賦值
lMOVEsourceTOincept.等介於:incept=source.
lCLEARdobj.將數據對象dobj還原為初始值.
l結構體間賦值:struct2=struct1.(組件結構相同).
lMOVE-CORRESPONDINGstruct1TOstruct2.(部分組件結構相同).
4.3.2類型轉換(見附表).
4.3.3數值運算
1.算術運算
運算數學表達式語句關鍵字語句
加法n=x+y.ADDyTOx.
減法n=x–y.SUBTRACTyFROMx.
乘法n=x*y.MULTIPLYxBYy.
除法n=x/y.DIVIDExBYy.
整除n=xDIVy.無
取余n=xMODy.無
冪(乘方)n=x**y.無
兩個結構體的同名字段之間可以整體進行算術運算:
ADD-CORRESPONDINGstruct1TOstruct2.
SUBTRACT-CORRESPONDINGstruct1FROMstruct2.
MULTIPLY-CORRESPONDINGstruct2BYstruct1.
DIVIDE-CORRESPONDINGstruct2BYstruct1.
以上將對兩個結構體中的同名字段進行相應運算(非數值類型數據會引起錯誤).
2.數學函數
任意類型參數的函數列表:
函數名說明
ABS(dobj)返回參數絕對值
SIGN(dobj)返回參數符號:正數返回1,0返回0,負數返回-1.
TRUNC(dobj)返回參數的整數部分
FRAC(dobj)返回參數的小數部分
CEIL(dobj)返回不小於輸入參數的最小整數值
FLOOR(dobj)返回不大於輸入參數的最大整數值
注意:函數名與左括號間不能有空格,括號與參數間必須有空格.
F類型參數的函數列表(其它類型參數將首先被轉換為F類型).
函數名說明
COS,SIN,TAN三角函數
ACOS,ASIN,ATAN反三角函數
COSH,SINH,TANH雙曲函數
EXP底數為e(2.7182818285)的冪函數
LOG底數為e的自然對數
LOG10底數為10的對數
SQRT平方根
4.3.4數據輸出
輸出格式化選項:
選項應用類型說明
LEFT-JUSTIFIED所有類型左對齊
CENTERED所有類型居中
RIGHT-JUSTIFIED所有類型右對齊
UNDERg所有類型輸出直接開始於字段g
NO-GAP所有類型忽略輸出時字段后的一位空格
USINGEDITMASKm所有類型指定數據字典中定義的格式模板m
USINGNOEDITMASK所有類型撤消對格式模板的激活
NO-ZERO所有類型用空格替代所有有前導零
NO-SIGN數值類型不輸出前導符號
DECIMALSd數值類型輸出d定義小數點后的數字位數,如需截斷,則四舍五入
EXPONENTe數值類型對F類型字段在e>定義冪指數
ROUNDr數值類型用10的負r次方乘P類型字段,然后取整
CURRENCYc數值類型按系統表格TCURX中定義的格式將貨幣c格式化
DD/MM/YY|MM/DD/YY時間日期格式調整,”/”為用戶主記錄中定義的分隔符
DD/MM/YYYY,...(同上)時間日期格式調整,”/”為用戶主記錄中定義的分隔符
DDMMYY...(同上)時間日期格式調整,無分隔符
注:用戶主記錄System->Userprofile->Owndata(SU01).
4.3.5邏輯表達式
通用邏輯表達式列表:
運算符意義
EQ或=等於
NE或<>或><不等于
LT或<小于
LE或<=小于等于
GT或>大于
GE或>=大于等于
3.IS操作符
l...fISINITIAL...:檢查字段f是否為初始值.
l...fsISASSIGNED...:檢查字段符號是否被分配.
l...pIS[SUPPLIED|REQUESTED]...:檢查過程中的參數是否被實參填充.
4.BETWEEN操作符
l...f1BETWEENf2ANDf3...:檢查數據對象的值是否屬于特定範圍之間.
5.IN操作符(P110)
l...fINseltab...:檢查一個數據對象的內容是否遵從某個選擇表的邏輯條件.
6.組合邏輯表達式
lAND:與.
lOR:或.
lNOT:非.
注:括號與操作數間至少要有一個空格,如:IF(c>n)AND(c<f).
4.4結構控制
程序代碼分三種結構:
l順序結構:語句逐行執行.
l分支結構:根據不同的條件執行不同語句塊.
l循環結構:反復執行某個語句.
4.4.1分支控制
1.IF/ENDIF結構:
IF<condition1>.
<statementblock>
ELSEIF<condition2>.
<statementblock>
......
ELSE.
<statementblock>
ENDIF.
注:可嵌套.
2.CASE/ENDCASE結構:
CASEf.
WHENf11[ORf12OR...].
<statementblock>
......
[WHENOTHERS.]
<statementblock>
ENDCASE.
其中,f為變量,fij可以是變量或者固定值.
4.4.2循環控制
1.無條件循環
DO[nTIMES].
<statementblock>
ENDDO.
說明:n為循環次數,可以是文字或變量,如果沒有限定n值,則必須用EXIT,STOP或REJECT等語句強制結束循環.DO循環可嵌套,SY-INDEX為當前循環次數.
2.條件循環
WHILE<condition>.
<statementblock>
ENDWHILE.
注:可嵌套,其它同上.
3.循環中止
lCONTINUE:無條件中止當前本輪循環,開始下一輪循環.
lCHECK:條件中止當前本輪循環(條件為假時),開始下一輪循環.
lEXIT:無條件完全中止當前循環,繼續循環結束語句(ENDDO,ENDWHILE等)后面的代碼,如果在嵌套循環中,系統僅退出當前循環.
4.5處理字符數據
4.5.1字符數據
1.連接字符串
CONCATENATEs1s2...snINTOs_dest[SEPARATEDBYsep].
注:所有字串操作將忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).
如果出現截斷情況,將SY-SUBRC設為4,否則返回0.
2.拆分字符串
SPLITs_sourceATsepINTOs1s2...sn.
如果所有子串足夠長且不必截斷任何部分,則將SY-SUBRC設為0,否則返回4,
如果源字符串能夠拆分的子串多過指定的數目,則源子串最后的剩余部分包括其后的分隔符都將寫入最后一個子串,要避免這種情況,需要使用內表進行操作:
SPLITs_sourceATsepINTOTABLEitab.在該形式中,根據子串數目生成n行的內表.例如:
DATA:texttypestring,
itabTYPETABLEOFstring.
text=‘ABAPisaprogramminglanguage’.
SPLITtextATspaceINTOTABLEitab.
LOOPATitabINTOtext.
WRITE/text.
ENDLOOP.
3.查找子串模式
SEARCHcFORstr.在字段c中查找字符串str.如果找到,則將SY-SUBRC返回0,SY-FDPOS返回字段c中該字符串的位置(從左算起的字節偏移量),否則SY-SUBRC返回4,查找模式有以下幾種:
lstr搜索str並忽略尾部空格.
l.str.搜索str,但不忽略尾部空格.
l*str搜索以str結尾的單詞.
lstr*搜索以str開始的單詞.
REPORTz_string_search.
DATAstring(30)TYPEcVALUE'Thisisatestingsentence.'.
WRITE:/'searched','sy-subrc','sy-fdpos'.
SEARCHstringFOR'X'.
WRITE:/'X',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'itt'.
WRITE:/'itt',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'.e.'.
WRITE:/'.e.',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'*e'.
WRITE:/'*e',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR's*'.
WRITE:/'s*',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
輸出結果如下:
searchedsy-subrcsy-fdpos
X40
itt40
.e.40
*e018
s*018
4.替換字段內容.
REPLACEstr1WITHstr2INTOs_dest[LENGTHlen].搜索s_dest中前len個字符中的子串str1,用str2來替換它,如果成功,SY-SUBRC返回0,否則還回非0值.
REPORTz_replace.
DATAnameTYPEstring.
name='Michael-Cheong'.
WHILEsy-subrc=0.
REPLACE'-'WITH''INTOname.
ENDWHILE.
WRITE/name.
輸出結果:MichaelCheong
5.確定字段長度
n=STRLEN(str).函數將str作為字符數據類型處理,不考慮其實際類型,也不進行轉換.計算其首字符到最后一個非空字符的長度,不包括結尾空格.
6.其它操作語句
lSHIT:將字符串整體或子串進行位移.
lCONDENSE:刪除字符串中的多余空格.
lTRANSLATE:字符轉換,如將ABC轉換為abc.
lCONVERTTEXT:創建一個可以排序的格式.
lOVERLAY:用一個字符串覆蓋另一個字符串.
4.5.2字符數據比較(用於判斷兩個字串之間的包含關系):
運算符含義
s1COs2如果s1僅包含s2中的字符,邏輯表達式為真
s1CNs2如果s1還包含s2之外的字符,邏輯表達式為真
s1CAs2如果s1包含任何一個s2中的字符,邏輯表達式為真
s1NAs2如果s1不包含s2的任何字符,邏輯表達式為真
s1CSs2如果s1包含字符串s2,邏輯表達式為真
s1NSs2如果s1不包含字符串s2,邏輯表達式為真
s1CPs2如果s1包含模式s2,邏輯表達式為真
s1NPs2如果s1不包含模式s2,邏輯表達式為真
注:CO,CN,CA,NA比較時區分大小寫,且尾部空格也在比較範圍之內,CS,NS,CP,NP比較時忽略尾部空格且不區分大小寫,比較結束后,如果結果為真,SY-FDPOS將給出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代單個字符.
換碼字符使用:
l指定大小寫(如#A,#b).
l通配符”*”(輸入#*),將其轉回原義.
l通配符”+”(輸入#+),將其轉回原義.
l換碼符本身”#”(輸入##),將其轉回原義.
l字符串結尾空格(輸入#__),指定比較結尾空格.
4.5.3定位操作子串
str[+position][(len)].從字符串str中的position位開始取出長度為len的子串.
可動態指定偏移量及長度的情況(即position及len可為變量):
l用MOVE語句或賦值運算符給字段賦值時.
l用WRITETO語句向字段寫入值時.
l用ASSIGN將字段分配給字段符號時.
l用PERFORM將數據傳送給子程序時.
off=6.
len=2.
date+off(len)=‘01’.
4.6使用內表
types定義的並不是結構體對象,只是結構類型,不能作為工作區,當定義的內表沒有表頭行(工作區)時,必須為其定義一個結構體作為工作區,否則無法使用此內表.如果沒有給內表定義工作區,則在定義內表時必須聲明表頭行(withheaderline).
DATA:BEGINOFline,"workarea(structure)結構類型且結構體對象
numTYPEi,
sqrTYPEi,
ENDOFline,
"無表頭行內表,內表定義都使用data關鍵字.
itabTYPE(LIKE)STANDARDTABLEOFlineWITHKEYtable_line.
DATADIRTABLIKECDIROCCURS10WITHHEADERLINE.定義標準內表
DO5TIMES.
line-num=sy-index.
line-sqr=sy-index**2.
APPENDlineTOitab.
ENDDO.
LOOPATitabINTOline.
WRITE:/line-num,line-sqr.
ENDLOOP.
CLEARitab.
注:
1.TYPES與DATA區別:TYPES是用來定義某種類(型)的,需(用DATA語句)實例化以后才可以使用,而DATA是用來定義數據對象(實例變量)的,對于用DATA直接定義的結構體對象(不參照其它結構類型),其同時也是一個結構類型.
2.TYPE與LIKE區別:TYPE后面跟隨的只能是某種類(型),而LIKE后面可以跟隨類型或實例對象,參照結構體對象生成內表時只能用LIKE,不能用TYPE,因為結構體對象不是類型,只是一種實例對象,參照結構類型生成內表時可以用LIKE也可以用TYPE.其中通過LIKE定義的內表直接擁有參照結構類型的元素結構,而通過TYPE定義的內表只能間接擁有被參照結構類型的元素結構,結構類型不能作為內表的工作區,只有結構體對象才可以.
內表定義語法:
1.標準表:可指定或不指定關鍵字,可重復.邏輯索引,操作數據時數據內存位置不巒,系統只重排數據行的索引值.
DATAitabTYPE|LIKE[STANDARD]TABLEOFstructure[WITHKEYcomp1...compn(DEFAULTKEY)WITHHEADERLINEINITIALSIZEn].
2.排序表:可指定唯一或不唯一的關鍵字,也可不指定,邏輯索引,按關鍵字升序存儲.
DATAitabTYPE|LIKESORTEDTABLEOFstructure[WITHNON-UNIQUE(UNIQUE)KEYcomp1...compn(DEFAULTKEY)WITHHEADERLINEINITIALSIZEn].
3.哈希表:必須指定唯一關鍵字.無索引
DATAitabTYPE|LIKEHASHEDTABLEOFstructureWITHUNIQUEKEYcomp1...compn(DEFAULTKEY)[WITHHEADERLINEINITIALSIZEn].
注:如果n值為0或不指定的話,程序會為內表對象分配8KB大小內存,所以,如果內表比較小,不要把該值設為0,以避免內存浪費.
舊版標準表定義語法:
DATAitabTYPE|LIKE[STANDARD]TABLEOFstructureOCCURSn.或者
DATA:BEGINOFitabOCCURSn,
...,
fi...,
ENDOFitab.
动态创建内表:
REPORTzmaschl_create_data_dynamic.
TYPE-POOLS:slis.
DATA:it_fcatTYPEslis_t_fieldcat_alv,
is_fcatLIKELINEOFit_fcat.
DATA:it_fieldcatTYPElvc_t_fcat,
is_fieldcatLIKELINEOFit_fieldcat.
DATA:new_tableTYPEREFTOdata.
DATA:new_lineTYPEREFTOdata.
FIELD-SYMBOLS:<l_table>TYPEANYTABLE,
<l_line>TYPEANY,
<l_field>TYPEANY.
*Buildfieldcat
CALLFUNCTION'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name='SYST'
CHANGING
ct_fieldcat=it_fcat[].
LOOPATit_fcatINTOis_fcatWHERENOTreptext_ddicISinitial.
MOVE-CORRESPONDINGis_fcatTOis_fieldcat.
is_fieldcat-fieldname=is_fcat-fieldname.
is_fieldcat-ref_field=is_fcat-fieldname.
is_fieldcat-ref_table=is_fcat-ref_tabname.
APPENDis_fieldcatTOit_fieldcat.
ENDLOOP.
*CreateanewTable
CALLMETHODcl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog=it_fieldcat
IMPORTING
ep_table=new_table.
*CreateanewLinewiththesamestructureofthetable.
ASSIGNnew_table->*TO<l_table>.
CREATEDATAnew_lineLIKELINEOF<l_table>.
ASSIGNnew_line->*TO<l_line>.
*Testit...
DO30TIMES.
ASSIGNCOMPONENT'SUBRC'OFSTRUCTURE<l_line>TO<l_field>.
<l_field>=sy-index.
INSERT<l_line>INTOTABLE<l_table>.
ENDDO.
LOOPAT<l_table>ASSIGNING<l_line>.
ASSIGNCOMPONENT'SUBRC'OFSTRUCTURE<l_line>TO<l_field>.
WRITE<l_field>.
ENDLOOP.
4.6.2操作內表行
標準表排序表哈希表
索引訪問允許允許不允許
關鍵字訪問允許允許允許
相同值關鍵字行可重復可重復或不可重復不可重復
推薦訪問方式主要通過索引主要通過關鍵字只能通過關鍵字
注:CLEARitab[].表示操作的是內表對象.而CLEARitab.當itab有表頭行時表示操作表頭行,如無表頭行時表示操作內表對象.
當一個操作語句結束后,SY-TABIX返回該行的索引值,對於所有行操作,如果訪問成功,SY-SUBRC返回0,否則返回非0值.
4.插入行—INSERT
lINSERTstructureINTOitabINDEXidx.無表頭行索引表,itab的行數應大於或等于idx-1.否則失敗
lINSERTitabINDEXidx.有表頭行索引表.
l對于哈希表,系統按關鍵字將新行插入特定位置.
lINSERTstructureINTO|INITIALLINEINTOTABLEitab.此語句對於標準表來說與append效果相同,對於排序表來說,插入的行不可以打亂按照關鍵字排序的順序,否則插入不成功,對於哈希表來說,插入過程中系統按照關鍵字對行進行定位.INITIAL關鍵字是用于向內表中插入結構中各類型的初始值的.
lINSERTLINESOFitab1[FROMn1][TOn2]INTO[TABLE]itab2[INDEXidx].將內表中部分或全部數據行整體插入到另一內表中,指定行數時itab1,itab2必須為索引表,指定TABLE關鍵字時,itab2可以是任意內表.此方式比其它方式快20倍左右.
5.附加行—APPEND(只能操作索引表)
APPEND[structureTO|INITIALLINETO]itab.
APPENDLINESOFitab1[FORMn1][TOn2]TOitab2.
6.聚集附加—COLLECT
COLLECTlineINTOitab.對於需要附加的數據,如果在內表中存在關鍵字內容與其相同的數據行,則此語句將需要附加的數據累加到內表中的這一行上,而不會另外再添加一行,操作成功后,SY-TABIX返回被處理過的行的索引.
注:關鍵字以外的所有字段必須是數字類型
7.讀取行—READ(可用於任何類型內表)
lREADTABLEitab[INTOwa|ASSIGNING<fs>]INDEXidx.通過索引讀取內表中的單行數據.ASSIGNING表表示指派給字段符號.
lREADTABLEitabFROMstructure[INTOwa|ASSIGNING<fs>].讀取與結構相同的工作區中的關鍵字內容全部相同的內表數據.
lREADTABLEitabWITHTABLEKEYfield1=v1...field2=v2[INTOwa|ASSIGNING<fs>].指定所有關鍵字值,並讀取相等時內表行.
lREADTABLEitabWITHKEYfield1=v1...field2=v2[INTOwa|ASSIGNING<fs>].讀取內表中字段fieldn(不一定是表關鍵字段)與值vn相同時的內表行.
8.修改行—MODIFY
lMODIFYitab[FROMwa][INDEXidx][TRANSPORTINGf1f2...].如果內表包含的行數少於idx,則不更改任何行.
lMODIFYTABLEitabFROMwa[TRANSPORTINGf1f2...].根據工作區wa中關鍵字修改內表行,TRANSPORTING表示修改指定字段值.
lMODIFYitabFROMwaTRANSPORTINGf1f2...WHEREcondition.修改符合WHERE子句中條件的內表中的指定字段值.
9.刪除行—DELETE
lDELETEitabINDEXidx.根據索引刪除內表行.
lDELETETABLEitabFROMwa.根據工作區關鍵字刪除行.
lDELETETABLEitabWITHTABLEKEYfield1=v1...field2=v2.根據指定關鍵字值刪除行.
lDELETEitab[FROMn1][TOn2][WHERE<condition>].
10.循環處理--LOOP
LOOPATitab[INTOwa][FROMn1][TOn2][WHEREcondition].
<statementblock>.
ENDLOOP.
4.6.3操作整個內表
1.排序
SORTitab[ASCENDING|DESCENDING][ASTEXT][STABLE]
[BYf1[ASCENDING|DESCENDING][ASTEXT]
......
f1[ASCENDING|DESCENDING][ASTEXT]]
說明:
lASCENDING|DESCENDING:升序或降序.默認升序.
lASTEXT:根據當前語言按字母順序排序字符字段,否則按字符平台相關內部編碼進行排序.
lSTABLE:保持排序前后不需要改變的數據行的相對順序.
2.控制級操作(用于總計,縮進,格式控制等)
ATFIRST|LAST|NEWf|ENDOFf.
<statementblock>
ENDAT.
說明:
lFIRST:當循環為內表的第一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.
lLAST:當循環為內表的最后一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.
lNEWf:字段f前面(即左邊)的全部字段內容之一不同於上一行時,執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
lENDOFf:如果下一行行組中的任何字段內容不同於上一行,執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
注:在控制級操作期間,在工作區中,對於非標準關鍵字段,將全部進行初始化,在執行完控制操作后(即ENDAT語句后)工作區中的數據將全部還原到進入控制級操作語句前(即進入AT前)狀態.
3.初始化內表
lCLEARitab.:帶表頭行時只清空表頭行,不帶表頭行時清空整個內表.
lCLEARitab[].:只清空整個內表對象數據.不清空表頭行.
lREFRESHitab或REFRESHitab[].:只清空整個內表對象數據.不清空表頭行.
lFREEitab.或FREEitab[].:只清空整個內表對象數據.不清空表頭行,同時釋放內存.
l......itabISINITIAL....:檢查內表是否為空.
4.整體復制內表
lMOVEitab1TOitab2.:如果兩表都存在表頭行,則此語句只復制了表頭行.
lMOVEitab1[]TOitab2[].:指定表體復制.
lMOVEitab1[]TOitab2.:表itab2無表頭行時才成立.
litab2=itab1.同上1
litab2[]=itab1[].同上2
litab2=itab1[].同上3
5.比較內表大小
...itab1<operator>itab2...:其中<operator>可以為=,<>,><,>=,<=,>,<等.
4.6.4ExtractDatasets
lFIELD-GROUPfg.行結構分配.
lINSERTf1f2...INTOfg.生成字段組fg的具體字段結構.
lEXTRACTfg.將字段組填充給EXTRACT.
lSORT.排序.
lLOOP.<statementblock>ENDLOOP.循環輸出EXTRACT.
4.7動態數據對象
4.7.1字段符號
lFIELD-SYMBOLS<fs>[TYPEtype|LIKEdobj].聲明字段符號.
lASSIGNfTO<fs>.靜態分配數據對象給字段符號.
lASSIGNf[+i][(j)]TO<fs>.指定偏移量和長度.
lASSIGN(f)TO<fs>.動態分配,先找到字段f的內容,然后將該內容分配給<fs>.
4.7.2數據引用
TYPESt_drefTYPEREFTODATA.
DATAdrefTYPEREFTODATA.
4.8模塊化技術
4.8.2子程序
1.定義:
FORMsubr[[USING[VALUE(p1)]...][TYPEt|LIKEf]...][TYPEANY]
[CHANGING[VALUE(p1)]...][TYPEt|LIKEf]...][TYPEANY].
<subrcodes>
ENDFORM.
注:
lVALUE參數表未示值傳遞,此方式在子程序調用后實參的值不會被改變.
l無VALUE參數時表示引用傳遞,會改變實參的值.
lUSING與CHANGING無任何區別.
l位于兩個子程序間的代碼不屬于任何事件塊.
l參數傳遞時不存在類型轉換,要求必須兼容.
2.調用:
PERFORMsubr[USINGp1...pn][CHANGINGpi...pj].
4.8.3功能模塊(p153)
4.8.5源代碼復用
1.包含程序
包含程序是單純的代碼復用,不是可執行程序,不能單獨運行,必須被其它程序調用,包含程序不能調用自身.
INCLUDEincl.包含程序調用,此語句必須獨占一行.
2.宏:(語句塊中最多只能包含9個占位符&1...&9).
例:
DATA:resultTYPEi,
int1TYPEiVALUE1,
int2TYPEiVALUE2.
DEFINEoperation.
result=&1&2&3.
output&1&2&3result.
END-OF-DEFINITION.
DEFINEoutput.
write:/'Theresultof&1&2&3is',&4.
END-OF-DEFINITION.
operation1+2.
operationint2-int1.
4.9.1靜態錯誤檢查
1.語法檢查:用Check鍵.
2.擴展語法檢查(SLIN):在ABAP初台界面輸出程序名后,選擇Program->Check->ExtendedSyntaxCheck.àStandard.
4.9.2運行時錯誤控制
1.可捕捉的錯誤
CATCHSYSTEM-EXCEPTIONSexc1=rc1...excn=rcn.
...
ENDCATCH.
其中exci表示一個單一可捕捉錯誤或者一個ERROR類,rci則代表一個數字.如果其中錯誤之一在CATCH和ENDCATCH語句之間出現,程序就不會中止,而是直接跳至ENDCATCH后,把系統指定的錯誤代碼rci賦給字段SY-SUBRC.此語句可嵌套.例如:
DATA:result1TYPEpDECIMALS3,
numberTYPEiVALUE11.
CATCHSYSTEM-EXCEPTIONSarithmetic_errors=5.
DO.
number=number-1.
result1=1/number.
WRITE:/number,result1.
ENDDO.
ENDCATCH.
IFsy-subrc=5.
WRITE/'divisionbyzero!'.
ENDIF.
2.不可捕捉的錯誤(通過ST22查看,在SAP系統中保存14天,可通過Keep功能保存更長時間).
第六章數據庫操作
6.2.1表字段
在數據字典中,每創建一個數據庫表后,都將同時生成一個同名的結構化數據類型.
6.2.2外部關鍵字
外部關鍵字內容必須在其對應的約束表(checktable)中存在,否則無法插入.
6.2.3技術設定
1.數據類型(dataclass):
lAPPL0(Masterdata),較少需要被修改的系統數據表,如員工個人信息.
lAPPL1(Transactiondata),需要經常被修改的數據表,如產品庫存量表.
lAPPL2(Organizationandcustomizing),系統定制數據表,在系統安裝后很少需要修改,如國家代碼等.
2.數量級別:
00to6,600
16,600to26,000
226,000to100,000
3100,000to420,000
4420,000to34,000,000
3.緩沖(Buffering)機制
如果在緩沖設定中選擇了Bufferingswitchedon項,則需要設定其緩沖類型(有Full,Single-record和Generic三種).
緩沖機制的意義在於首次查詢時將數據表中的數據放入應用服務器緩沖區,以提高后續查詢效率,要注意最好不要對經常需要的數據庫表設置該機制,對于經常讀取但很少更新或者通常只有在60秒后才可能被其他應用服務器程序修改的數據庫表,開啟緩沖機制可以上百倍地提高效率.
4.Logdatachanges用于設定表中的數據修改時是否在系統日志中記錄.
6.2.4索引
一個數據庫表可以包含一個主索引(PrimaryIndex)和多個附屬索引(SecondaryIndexes).主索引只包含表關鍵字和指向整個數據條目的指針,由系統自動生成並在添加數據庫條目時進行維護.索引中的數據已經排序.
6.3.1SELECT語句
SELECT<result>FROM<source>INTO<target>
[WHERE<condition>][GROUPBY<fields>]
[HAVING<cond>][ORDERBY<fields>].
lHAVING子句用于限定ORDERBY子句中數據條目組的選擇條件
1.選擇單行數據:
lSELECTSINGLE*FROMtabINTOwa_tabWHERE<condition>.選擇單行全部數據.
lSELECTSINGLEfield1...fieldnFROMtabINTO(wa_field1,...,wa_fieldn)WHERE<condition>.選擇單行指定字段數據到指定工作區字段.
lSELECTSINGLE*|field1...fieldnFROMtabINTOCORRESPONDINGFIELDSOFwa_tabWHERE<condition>.將選擇的值放入工作區中對應的字段中.
6.3.3選擇多行數據
1.循環選擇(DISTINCT去掉結果重復的行):
SELECT[DISTINCT]....
<statementblock>
ENDSELET.
系統字段SY-DBCNT給讀取的行計數.
2.選擇至內表:
SELECT...INTO|APPENDING[CORRESPONDINGFIELDSOF]TABLEitab.
其中INTO選項將復蓋itab中的數據,如果不想復蓋只想追加則用APPENDING.
3.指定選擇包大小(一次選擇到內表的行數):
SELECT*FROMtabINTO|APPENDINGTABLEwa_tabPACKAGESIZEn.
<statementblock>
ENDSELET.
6.3.4指定查詢條件
1.比較運算符:=,<,>,<>,<=,>=.
2.範圍限定運算符:WHERE...f[NOT]BETWEENg1ANDg2....
3.字符比較運算符:WHERE...f[NOT]LIKEg[ESCAPEh]...其中g中通配符”_”用於替代單個字符,”%”用于替代任意字符串.ESCAPE選項舉例如下:
SELECT...WHEREcityLIKE‘edit#_%’ESCAPE‘#’.選擇所有以”edit_”開始的城市.
4.檢查列表值:WHERE...f[NOT]IN(g1,...gn)...
5.檢查空值:WHERE...fIS[NOT]NULL...注:這里的NULL值不等同於初始值INITIAL
6.檢查選擇表.
lWHERE...f[NOT]INseltab...其中seltab為選擇表,如選擇屏幕中用戶填充數據.
lSELECT...WHERE(code=‘01’ORcode=‘02’)ANDNOT(country=‘usa’).:AND,OR,NOT可以按照任意順序組合.
lSELECT...WHERE<condition>AND(itab).內表itab僅包含一個類型為C的字段,且最大長度為72.字段中內容不能使用變量.這種方式查詢效率很低.
6.3.5多表結合查詢
1.SELECT語句嵌套
DATA:wa_carridTYPEspfli-carrid,
wa_connidTYPEspfli-connid,
wa_carrnameTYPEscarr-carrname.
SELECTcarridconnid
FROMspfli
INTO(wa_carrid,wa_connid)
WHEREcityfrom='BOSTON'.
SELECTcarrname
FROMscarr
INTOwa_carrname
WHEREcarrid=wa_carrid.
WRITE:/wa_carrname.
ENDSELECT.
ENDSELECT.
2.FORALLENTRIES選項(比上面的嵌套要快)
DATA:BEGINOFwa_carrid,
carridTYPEspfli-carrid,
ENDOFwa_carrid.
DATA:wa_carrid_tabLIKETABLEOFwa_carrid.
DATA:BEGINOFwa_carrname,
carridTYPEscarr-carrid,
carrnameTYPEscarr-carrname,
ENDOFwa_carrname.
SELECTcarrid
FROMspfli
INTOTABLEwa_carrid_tab
WHEREcityfrom='BOSTON'.
SELECTcarridcarrname
FROMscarr
INTOwa_carrname
FORALLENTRIESINwa_carrid_tab”相當於循環輸出內表在WHERE子句中出現的
WHEREcarrid=wa_carrid_tab-carrid.”字段的值
WRITE:/wa_carrname-carrid,wa_carrname-carrname.
ENDSELECT.
注:此子句中不能使用LIKE,BETWEEN,IN,ORDERBY.
3.使用視圖:可先用SE11創建視圖然后查詢,效率更高.
4.結合查詢
SELECT...FROMtable[INNER]JOINjointab1[ASalias1]ON<cond><options>..
[INNER]JOINjointab2[ASalias2]ON<cond><options>...
WHERE<cond>...內連接,條件間只能用AND連接,也可放入WHERE子句.
SELECT...FROMtableLEFT[OUTER]JOINjointab1[ASalias1]ON<cond><options>..左連接,在ON附加項中,只能使用”=”操作符.不能在WHERE子句中對結合數據表中的字段進行條件限定.
5.子查詢(沒有INTO子句,不能結合ON同時出現,可嵌套)
lSELECT...FROMscarINTO
WHEREEXIST(SELECT*FROMspfli
WHEREcarrid=scarr-carrid
ANDcityfrom=‘BOSTON’).
l...WHEREcityIN(SELECTcityfromFROMspfliWHERE...只返回單個字段.
l...WHEREcity=(SELECTcityfromFROMspfliWHERE...單行返回結果.
l...WHEREcity>ALL|ANY|SOME(SELECTcityfromFROMspfliWHERE...多行返回值.
6.3.6組合查詢結果
1.總計功能
SELECTMAX|MIN|SUM|AVG|COUNT([DISTINCT]f1)[ASa1]...其中DISTINCT選項將在統計之前先排除相同的選擇結果.
2.分組總計
SELECTf1[ASa1]...MAX|MIN|SUM|AVG|COUNT([DISTINCT]fm)[ASam]...
INTO(s1,...,sm...)|CORRESPONDINGFIELDSOFitab...
GROUPBYf1...
注:分組總計必須指定查詢字段或使用INTOCORRESPONDINGFIELDSOF附加項,使用后者時需要通過AS后面的別名將總計結果存放在與別名同名的字段中.
3.指定分組條件
SELECTf1[ASa1]...MAX|MIN|SUM|AVG|COUNT([DISTINCT]fm)[ASam]...
INTO(s1,...,sm...)|CORRESPONDINGFIELDSOFitab...
GROUPBYf1...
HAVING<cond>.用於對分組總計選出的數據進行二次篩選.
4.排序(SQLTrace工具查看數據庫索引)
l...ORDERBYPRIMARYKEY.系統將按主關鍵字升序排序.
l...ORDERBYf1[ASCENDING|DESCENDING]...指定字段,默認升序.
6.3.7其它格式說明
lTABLSEdbtab.聲明與數據庫表同名同結構的工作區,是一種結構體對象,不是內表.
ldbname=‘EKBE’.SELECTf1...FROM(dbname)INTO(s1,...)...動態指定數據庫表,注意數據庫表名必須大寫.
lSELECT|UPDATE...FROMdbtabCLIENTSPECIFIEDWHEREmandtBETWEEN‘100’AND‘103’.用CLIENTSPECIFIED選項取消系統自動處理當前集團數據表功能,同時就可以在WHERE子句中指定需要讀取的集團.
lSELECT...FROMdbtabBYPASSINGBUFFER...取消TABLE技術設定中設定的緩沖機制,另,DISTINCT附加項與結合選擇,總計選擇,ISNULL條件,子查詢,以及GROUPBY和ORDERBY同時使用時,也將自動忽略緩沖設定.
lSELECT...FROMdbtabUPTOnROWS...只選取滿足條件的n行數據,如果n為0,則選取所有滿足條件的數據,如果同時使用ORDERBY子句,則系統首先先出所有滿足條件的數據並排序,然后將頭n行作為選擇結果.
lGETRUNTIMEFIELDf.系統返回從程序開始后的毫秒數,其中f為I類型數據.
6.3.8使用光標(多個光標可指向同一個選擇)
DATA:curTYPEcursor.
OPENCURSORcurFORSELECTcarridFROMspfliWHEREcityfrom='BOSTON'.打開光標.
DO.
FETCHNEXTCURSORcurINTO(wa_carrid_tab-carrid).相當於循環讀取OPENCURSOR語句生成的結果集中的下一行數據.
APPENDwa_carrid_tab.
或者FETCHNEXTCURSORcurINTOTABLEwa_carrid_tab.整體讀取放放內表.
IFsy-subrc<>0.如果FETCH語句沒有讀取任何行,sy-subrc返回4,否則返回0.
CLOSECURSORcur.關閉光標.
EXIT.
ENDIF.
ENDDO.
在SELECT語句中,數據從數據庫中以大小為32KB的數據包傳遞至應用服務器,並通過INTO子句傳至ABAP程序.
6.4更新數據
數據庫操作結束后通過SY-SUBRC返回標識代碼,如果操作成功,返回0,另SY-DBCUT還將返回實際操作的數據行數.
6.4.1INSERT語句(數據庫表必須是可維護狀態)
lINSERTINTOdbtab|viewVALUESwa.插入單行,視圖數據必須來自同一個表.
lINSERTINTOdbtab|viewFROMwa.插入單行,視圖數據必須來自同一個表.
lINSERTdbtabFROMTABLEitab.當有一條數據插入失敗,系統不更新任何數據.
lINSERTdbtabFROMTABLEitabACCEPTINGDUPLICATEKEYS.如果出現關鍵字字相同條目,SY-SUBRC返回4,並跳過該條目,並更新其它條目.
6.4.2UPDATE語句
lUPDATEdbtabSETf1=g1...fn=gnWHERE<fix_key>.只能更新非關鍵字.只要更新一行,SY-SUBRC返回0.
lUPDATEdbtabFROMwa.根據工作區中的關鍵字更新對應的條目.
lUPDATEdbtabFROMTABLEitab.根據內表關鍵字批量更新數據.
6.4.3MODIFY語句
lMODIFYdbtabFROMwa.添加或更新單行.
lMODIFYdbtabFROMTABLEitab.添加或更新多行.
6.4.5DELETE語句
lDELETEFROMdbtabWHERE<cond>.只要刪除一行,SY-SUBRC返回0.
lDELETEdbtabFROMwa.
lDELETEdbtab[CLIENTSPECIFIED]FROMTABLEitab.如果有一行不能刪除,系統繼續處理下一行,成功刪除內表中所有行時,SY-SUBRC返回0.如果內表為空,會刪除所有數據,且SY-SUBRC和SY-DBCNT都返回0.
6.5數據一致性
6.5.1SAPLUW與DBLUW
1.LUW概念:在SAP系統中,兩個數據一致狀態中的時間間隔為LUW(LogicalUnitofWork),每一個LUW都需要以一個提交(COMMIT)或者返回(ROLLBACK)作為結束標志.如果以提交操作結束則進行所有更新操作,而返回操作則取消所有數據庫表的更改.
2.數據庫LUW:這是底層數據庫自身提供的保持數據一致性的機制,與SAP系統無關,對於ABAP程序來說,主要的問題在於如何確定數據庫的LUW的觸發時機,一個工作過程總是在下述情況下結束一個數據庫LUW並隱式地進行數據庫提交:
l當一個對話步驟(Dialogstep)結束,即顯示一個新屏幕給用戶時.
l在另一個工作過程繼續程序的執行,這一般出現在RFC(遠程功能模塊)的調用或返回過程中.
相應地,下列情況將使數據庫隱式地進行返回操作:
l當前ABAP程序出現運行錯誤.
l一個ABAP程序因類型A或X的消息而導致中止.
3.SAPLUW:一個SAPLUW可以包含多個對話步驟,即多個數據庫LUW,但一個OPENSQL語句不能被分隔為幾個對話步驟,即通過SAPLUW可以將多個數據庫LUW進行捆綁,並保存整體初始狀態,不進行真正的數據庫修改,當SAPLUW中的最后一個數據庫LUW結束時,再進行整體修改,或者整體取消操作.
SAPLUW提供兩種具體數據庫LUW捆綁機制:
l在定義FUNCTION時將其定義為Updatemodule,同時在調用時用如下方式:CALLFUNCTION...INUPDATETASK.則該模塊不是馬上被執行,而是被放置於應用服務器中的一個特殊的更新工作過程(Updateworkprocess)中,因此可以將多個分布在不同對話過程中的類似模塊捆扎在一起,當SAPLUW結束時,確保所有模塊被同時成功執行或整體放棄,因此可通過該方式封裝分布在不同對話過程中的所有數據庫更新操作.一個SAPLUW顯式提交方式:COMMITWORT[ANDWAIT].該語句結束SAPLUW並觸發更新工作過程,該過程在同一個數據庫LUW中進行更新操作,因而數據庫LUW此時可以替代SAP開始進行一致性控制.這些進行更新工作的FUNCTION可以被設為同步(加ANDWAIT)或異步模式.即是否要等到更新任務完成后才繼續執行后續語句.
lPERFORM...ONCOMMIT[LEVELn].效果與上面相同,此方法更高效,但此時子程序不能傳遞參數.LEVEL表示優先級,n取整數.n越小越先執行.
lROLLBACKWORK.控制SAPLUW整體返回,在實現SAPLUW更新功能的FUNCTION或子程序內部不能使用此語句及COMMIT語句.
TABLESSPFLI.
DATAFLAG.
SPFLI-CARRID='LH'.SPFLI-CONNID='1245'.
SPFLI-CITYFROM=............
INSERTSPFLI.
IFSY-SUBRC<>0.
FLAG='X'.
ENDIF.
SPFLI-CARRID='AA'.SPFLI-CONNID='4574'.
SPFLI-CITYFROM=............
INSERTSPFLI.
IFSY-SUBRC<>0.
FLAG='X'.
ENDIF.
................
IFFLAG='X'.
ROLLBACKWORK.
ELSE.
COMMITWORK.
ENDIF.
6.5.2SAP數據鎖定
用SE11創建一個鎖定對象(lockobject).激活它時會自動同時生成兩個FUNCTION:ENQUEUE_<LOCKOBJECT>及DEQUEUE_<LOCKOBJECT>,調用這兩個功能模塊時可以分別鎖定或解除鎖定對象.被鎖定的對象只有在解除鎖定之后才可以被其它應用讀取或寫入.鎖定模式:
l共享锁定(shared):该模式允许多个用户访问指定表行,但只能读访问.任何时候都不允许写访问。
l排他锁定(exclusive,notcumulative):该模式允许单个用户对指定表行进行读和写访问。其它用户不能访问该行。
l扩展排他锁定(exclusive,cumulative):该模式避免具有读写访问权限的单个用户获得对相同表行集的进一步锁定。当使用递归例程更新时,该模式很有用。
激活锁定对象导致系统生成用于锁定和解锁对象的特殊功能模块。这些功能模块称为:
调用ENQUEUE/DEQUEUE功能模块
ENQUEUE_<lock-object-name>'用于锁定对象DEQUEUE_<lock-object-name>'用于解锁对象
运行时,在试图读或写之前可以锁定该数据库对象。要锁定对象,请在第一屏幕的PAI事件中调用功能模块ENQUEUE_<lock-object-name>。要解锁此对象,请调用DEQUEUE_<lock-object-name>。
ENQUEUE/DEQUEUE参数
ENQUEUE/DEQUEUE功能模块有下列参数集:
?arg和x_arg(ENQUEUE和DEQUEUE)
这两个EXPORTING参数,存在于锁定参数的每个字段arg中。将arg设置为所需的关键字字段值。如果该字段不需要特殊值,则忽略arg参数,或者将其设置为字段的初始值。如果要将字段的初始值作为实际选择值,请将x_arg设置为‘X’。
?_SCOPE(ENQUEUE)
如果事务不调用更新任务功能,则只在对话任务中更新。应该使用相应的DEQUEUE功能直接释放锁定。
如果调用任意的V1更新任务功能,请设置参数_SCOPE以告知系统应该如何释放SAP锁定。可能的值为:
1该值用于创建更新任务中不需要的锁定。在整个对话任务处理中保持使用_SCOPE=1设置的锁定,但该锁定并不能用于任意的更新任务请求。要保证不将锁定保持超过必要的时间,在事务结束时应该直接释放它(通过相应的DEQUEUE功能)。
在ROLLBACKWORK时释放:系统不释放使用_SCOPE=1设置的锁定。在编制反转程序时,请使用DEQUEUE功能。
2该值用于创建下列锁定:
-在更新任务触发之前在对话任务中使用
-一旦已经触发了更新任务,则只在更新任务中使用。
这意味着在COMMITWORK已经触发更新任务之后,如果该任务继续运行,则锁定不再可用于对话任务事务。系统在V1更新任务处理结束之后(或者在下一ROLLBACKWORK)释放锁定。
如果不指定_SCOPE,该值就是缺省值。不需要将DEQUEUE用于使用_SCOPE值创建的锁定。但是,如果_SCOPE=2,并且不调用更新任务功能,则不触发更新任务而且系统不释放锁定。
在ROLLBACKWORK释放:如果在提交前发生反转,则系统释放使用_SCOPE=2设置的锁定。在提交之后,锁定保持到更新任务处理结束。
3使用该值创建以下锁定:
-在触发更新任务之前在对话任务中使用
-在触发更新任务之后,由对话任务和更新任务使用。
也就是说,对话任务程序继续使用该锁定,甚至该更新任务功能正在运行时也是如此。在这种情况下,锁定由对话事务和更新任务功能所“共有”。
在V1更新任务处理之后的某个时刻系统释放锁定。但是,应该直接释放锁定(通过相应的DEQUEUE函数)以确保尽可能早地释放。
在ROLLBACKWORK释放:一旦已经触发更新任务,则使用_SCOPE=3设置的锁定有两个独立的所有者。要删除锁定,必须在对话任务和更新任务两方同时删除此锁定。如果在提交前发生反转,则在更新任务方释放锁定,但是对话任务方仍然保留它。如果在提交后发生反转,则系统在双方都不释放该锁定。在这种情况下,必须使用DEQUEUE功能在对话方直接释放该锁定。更新任务方将自动释放锁定。
如果用户在事务完成前已经退出了该事务(例如通过“/n”)或者程序异常终止,则系统释放所有锁定。V2功能也不能继承对话任务所创建的锁定。
?_WAIT(只ENQUEUE)
此EXPORTING参数告知:如果即将锁定的对象已经由其它用户锁定,ENQUEUE是否应该等待。如果要等待则将_WAIT设置为'X'。在这种情况下,系统试图以指定时间长度的重复间隔锁定该对象。如果这些尝试失败,则ENQUEUE导致FOREIGN_LOCK例外。
如果程序不想等待,则将_WAIT设置为其它任何值。在这种情况下,ENQUEUE导致FOREIGN_LOCK例外,并且将系统字段SY-MSGV1设置为已经拥有该锁定的用户名。
ENQUEUE例外
在调用ENQUEUE功能模块之后,应该检查在程序中该对象是否已经锁定。在功能模块中定义了下列例外:
?FOREIGN_LOCK
其它用户已经锁定了对象。系统字段SY-MSGV1包含该用户名。
?SYSTEM_FAILURE
一般系统错误。
6.5.3用戶權限檢查
(1)事務運行權限
(2)程序運行權限
(3)程序內部權限檢查
首先用T-CODE:SU21創建授權對象.
AUTHORITY-CHECKOBJECT‘object’
ID‘field_name1’FIELDf1
ID‘field_name2’FIELDf2|ID‘field_name’DUMMY
6.6其它數據操作形式
6.6.1文件接口
l創建邏輯文件名及路徑名(解決平台相關性問題):FILE.
l獵取當前平台可識別的文件名:FILE_GET_NAME
(1)處理應用服務器文件
1.打開文件:OPENDATASETdsn<options>.打開成功時sy-subrc返回0,否則返回8.如果未指定路徑,系統將在應用服務器上SAP系統運行目錄中打開文件.
<options>用于指定打開模式:
lFORINPUT:讀取方式,如果文件不存在則忽略此命令.如果文件己打開,操作指針將復位到文件的起始位置.
lFOROUTPUT:寫入方式,如果文件不存在則創建文件,如果文件存在但處于關閉狀態則刪除其內容,如果文件存在且己打開,指針復位.
lFORAPPEND:附加方式,如果文件不存在則創建文件,如果文件存在則打開文件同時將指針定位到文件末尾,SY-SUBRC總是返回0.
lFORTEXTMODE:文本模式,讀取或寫入數據時,數據逐行傳輸,系統假定文件具有行結構,如果要將字符串寫入文件或己知現有文件是基于行結構的格式,則應用使用此模式.
lFORBIANARYMODE:二進制模式,讀取或寫入數據時系統逐字節地傳輸數據,傳輸期間系統不解釋文件內容,在將某文件內容寫入到另一文件時,系統將傳輸源文件的所有字節,在從文件讀取到字段時,傳輸的字節數取決於目標字段的大小.
lFORPOSITIONpos:打開文件並將讀寫數據操作指針定位於位置pos,該位置從文件起始處按字節計算.
lMESSAGEmsg:系統將在變量msg中放置相關操作系統消息.要進行錯誤處理,應與通過該選項和系統字段SY-SUBRC返回值一起接收完整的錯誤消息.
lFILITERfilt:該選項與操作系統相關,對于UNIX或者NT系統,可以通過將系統指令置於filt中執行.如在讀取之前將文件用windows指令解壓縮.
2.關閉文件:CLOSEDATASETdsn.只有在寫入文件前要刪除當前文件內容時,才有必要關閉文件.
3.刪除文件:DELETEDATASETdsn.刪除成功SY-SUBRC返回0,否則返回4.
4.TRANSFERfTOdsn[LENGTHlen].將數據對象f的值寫入文件dsn.字段f可以是基本數據類型,或者不包含作為內表組件的結構體,文件寫入模式由OPENDATASET語句在打開時指定的,如果沒有打開,系統將嘗試用二進制方式打開,或使用上一個OPENDATASET語句的模式,LENGTH指定傳輸數據的長度,如果f的長度大于len則截斷,否則填充空格,如果文件以文本模式打開,則每個TRASFER語句中,系統向文件中傳輸除結尾空格之外的所有字節,並在其后作結束標記.
5.從文件中讀取數據:READDATASETdsnINTOf[LENGTHlen].在讀取前應用OPENDATASET語句指定傳輸模式,讀取成功SY-SUBRC返回0,讀到文件末尾返回4,不能打開時返回8,如文件以二進制模式打開,可用LENGTH指定傳輸長度,如文件以文本模式打開,則每個READDATASET語句中,系統將讀取下一個行結束標記之前的所有數據.
REPORTz_file_test.
PARAMETERSfile(30)TYPEcDEFAULT'\tmp\myfile'.
DATA:wa_sflightTYPEsflight,
sflight_tab_1LIKETABLEOFwa_sflight,
sflight_tab_2LIKETABLEOFwa_sflight.
OPENDATASETfileFOROUTPUTINBINARYMODE.
SELECT*FROMsflightINTOwa_sflight.
TRANSFERwa_sflightTOfile.
APPENDwa_sflightTOsflight_tab_1.
ENDSELECT.
CLOSEDATASETfile.
OPENDATASETfileFORINPUTINBINARYMODE.
DO.
READDATASETfileINTOwa_sflight.
IFsy-subrc<>0.
EXIT.
ENDIF.
APPENDwa_sflightTOsflight_tab_2.
ENDDO.
CLOSEDATASETfile.
IFsflight_tab_1=sflight_tab_2.
MESSAGEi888(sabapdocu)WITH'OK'.
ENDIF.
該程序在應用服務器的\tmp目錄中創建了一個文件myfile存儲程序內表中的數據,SAP應用服務器文件及目錄可以通過事務AL11(SAPDirectories)進行瀏覽.
(2)處理展示服務器文件(用戶端本機)
1.下載文件到本機FUNCTION:DOWNLOAD或WS_DOWNLOAD,其中DOWNLOAD在下載時會顯示用戶對話框.
2.上傳文件到程序FUNCTION:UPLOAD或WS_UPLOAD,其中UPLOAD在文件上傳時會顯示用戶對話框.
3.獲取展示服務器上文件和操作系統信息FUNCTION:WS_QUERY.
6.6.2數據簇操作
(1)ABAP/4內存中的數據簇
1.在ABAP/4内存中存储数据对象
EXPORT<f1>[FROM<g1>]<f2>[FROM<g2>]...TOMEMORYID<key>.
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM<gi>,则将数据对象<fi>存储到自己的名称之下。如果使用该选项,则将数据对象<gi>存储到<fi>下面。
注:ID<key>用于标识内存数据,不得超过32个字符.EXPORT语句总是完全改写ID<key>相同的任何现有数据簇的内容.对于有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常情况下,语句将表名解释为表工作区
2.从内存中读取数据对象
IMPORT<f1>[TO<g1>]<f2>[TO<g2>]...FROMMEMORYID<key>.
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象<fi>写入字段<gi>中。ID<key>用于标识内存数据,不得超过32个字符。
不必读取存储在特定ID<key>下的所有对象。相反,可以从名称<fi>中进行选择。如果内存中不包含指定ID<key>下的对象,则将SY-SUBRC设置为4。但是,如果内存中存在带此ID的数据簇,无论数据对象<fi>是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象<fi>,则目标字段保持不变。
此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。
3.删除内存中的数据簇
FREEMEMORY[ID<key>].如果不附加ID<key>,则此语句删除整个内存,包括此前用EXPORT存储到ABAP/4内存中的所有数据簇。附加ID<key>之后,该语句只删除用此名称命名的数据簇。
(2)數據庫中的數據簇
1.簇數據庫的結構:
建立簇数据库的规则如下所述。必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。
1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。3.下一字段类型为CHAR,长度可变。它包含簇的名称<key>,存储数据簇时,在程序中用EXPORT语句的附加ID指定了该簇。因为后面的字段要对齐,所以系统应最多使用3个未用字节填充在字段RELID的结尾。如果创建自己的簇数据库,应该相应地定义此字段的长度。
4.下一字段必须名称为SRTF2,类型为INT4,长度为4。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有2**31行。字段SRTF2包含存储的数据簇内行的顺序号码,可以是0和2**31-1之间的任何值。存储数据簇时,系统自动填写此字段(参见第7点)。
5.SRTF2的后面可以是任何数目的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段。必须在程序中的EXPORT语句之前将值显式分配到这些字段。通常包含诸如程序名、用户ID等控制信息。
6.行上的倒数第二个字段名称必须为CLUSTR,类型为INT2,并且长度必须为2。它包含后面的字段CLUSTD中的数据长度。存储数据簇时,系统自动填写此字段。
7.行上的最后一个字段必须名称为CLUSTD,类型为VARC。其长度可以任意,但通常为1000个字节左右。存储数据簇时,系统按压缩格式用实际数据填写此字段。如果CLUSTD的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段SRTF2中进行编号(参见上面的第4点)。
既可以按照上述规则创建自己的簇数据库(此时参见文档ABAP/4词典),也可以使用系统定义的簇数据库INDX
(2)在簇数据库中存储数据对象
EXPORT<f1>[FROM<g1>]<f2>[FROM<g2>]...
TODATABASE<dbtab>(<ar_id>)[CLIENT<cli>]ID<key>.
此语句将列表中指定的数据对象存储为簇数据库<dbtab>中的簇。必须用TABLES语句对<dbtab>加以声明。如果不附加FROM<gi>,则将数据对象<fi>存储在自己的名称之下。如果有附件项,则将数据对象<gi>存储到名称<fi>之下。
l<ar_id>是存储数据库的簇的两字符区域ID。
l<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。
l在处理特定客户的簇数据库时可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
lEXPORT语句也将表工作区<dbtab>的用户字段内容传输到数据库表。根据需要,可以预先填写这些字段。
在具有相同名称<key>的相同工作区<ar>和相同客户系统<cli>中,EXPORT语句总是完全改写任何现有数据簇的内容。对于含有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常将表名解释为表工作区
(3)创建数据簇目录表
IMPORTDIRECTORYINTO<dirtab>
FROMDATABASE<dbtab>(<ar>)
[CLIENT<cli>]ID<key>.
此语句在存储于数据库<dbtab>中的数据簇中创建一系列数据对象,并将其放到表<dirtab>中。必须使用TABLES语句声明<dbtab>。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句
<ar>是即将存储数据库的簇的两字符ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。在处理特定客户的簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。如果可以创建某个目录表,则把SY-SUBRC设置为0。否则,设置为4。
(4)从簇数据库中读取数据对象
IMPORT<f1>[TO<g1>]<f2>[TO<g2>]...
FROMDATABASE<dbtab>(<ar>)
[CLIENT<cli>]ID<key>|MAJOR-ID<maid>[MINOR-ID<miid>].
此语句从数据库<dbtab>中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明<dbtab>。如果不附加TO<gi>,则将数据库的数据对象<fi>分配给程序中的同名数据对象。如果不附加此选项,则将数据库的数据对象<fi>写入字段<gi>。
<ar>是即将存储数据库的簇的两字符区域ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。可以用MAJOR-ID<maid>代替附加ID<key>。然后,就选定名称的第一部分与<maid>相符的数据簇。如果指定具有MAJOR-ID的附加MINOR-ID<miid>,则选择名称的第二部分(也就是<maid>长度之后的位置)大于或等于<miid>的数据簇。在处理特定客户簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在输入数据库名之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。
不必读取存储在特殊名称<key>之下的所有对象,但可以使用名称<fi>作出选择。如果数据库不包含具有指定关键字<ar>、<key>和<cli>的对象,则将SY-SUBRC设置为4。但是,如果数据库中存在具有这些关键字的数据簇,那么,无论是否存在数据对象<fi>,SY-SUBRC之值总是为0。如果簇中没有数据对象<fi>,则目标字段保持不变。
运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。
(5)从簇数据库中删除数据簇
DELETEFROMDATABASE<dbtab>(<ar>)[CLIENT<cli>]ID<key>.
此语句删除数据库表<dbtab>中区域为<ar>和名称为<key>的整个数据簇。必须用TABLES语句对<dbtab>进行声明。
列表中雙擊行的交互事件:atline-selection.
53.對話程序運行時觸發事件:load-of-program.
54.leavetolist-processing:離開屏幕處理同時進入報表列表處理(如選擇屏幕).
55.系統內表SCREEN保存了屏幕元素的各種屬性.
例如:將一個屏幕字段由可以將接受輸入狀態改為顯示狀態:
LOOPATSCREEN.Bestregards,
Ifscreen-name=‘mod’.
screen-input=‘0’.
Modifyscreen.
Endif.
Endloop.
56.流邏輯事件:
PROCESSBEFOREOUTPUT(PBO):用戶與屏幕交互前事件.
PROCESSAFTERINPUT(PIO):用戶與屏幕交互后事件.
PROCESSONHELP-REQUEST(POH):查詢幫助信息(或F1鍵)事件.
PROCESSONVALUE-REQUEST(POV):查詢幫助按鈕(或F4鍵)事件.
57.流邏輯語句:
PROCESS
MODULE:
FIELDf:PAI中屏幕字段f的值在此語句后才傳給abap程序.
ON:
VALUES:
CHAIN
ENDCHAIN:
CALL:
LOOP:
58.屏幕調用語句:
1.SETSCREENnext_screen_number:為當前屏幕指定后續屏幕.不會自動返回當前屏幕.
2.CALLSCREENscreen_number及CALLTRANCTIONtcode:挂起當前屏幕序列,進入新屏幕(序列)或事務.在新的屏幕序列中,通過語句LEAVESCREENTOSCREEN0調用的屏幕就能夠返回到挂起的屏幕序列上.(返回到原程序)
3.LEAVESCREEN:如果需要未完成當前屏幕控制流就要轉入后續屏幕,使用此語句.
4.LEAVETOSCREENscreen_number及LEAVETOTRANCTIONtcode:未完成當前屏幕就要轉入后續屏幕.不返回原有程序.
59.CALLSCREENdynnrSTARTINGATx1y1ENDINGATx2y2:將調用的屏幕作為彈出對話框,(x1,y1)及(x2,y2)分別為左上角和右下角的橫縱坐標.
60.中止當前屏幕並返回到調用點:
LEAVETOSCREEN0.
或
SETSCREEN0.
LEAVESCREEN.
61.中止當前屏幕並進入新屏幕:
LEAVETOSCREENdynnr
或
SETSCREENdynnr
LEAVESCREEN.
62.將GUI狀態連接到屏幕:SETPF-STATUSstat.
63.設置屏幕標題:SETTITLEBARstat.
64.類型為E的PAI模塊:類型為E的GUI狀態元素被觸發時將直接調用流邏輯中PAI中的語句:MODULEmodATEXIT-COMMAND.(無條件調用).
65.模塊條件調用:
1.FIELDfMODULEmodONINPUT:當字段f的值不是初始值時才調用mod.
2.FIELDfMODULEmodONREQUEST:只有用戶在字段f中輸入值時(包含空值和原值)才調用mod.
3.組合字段條件調用:
CHAIN.
FIELD:f1,f2,…
MODULEmod1ONCHAIN-INPUT|CHAIN-QEQUEST.
FIELD:g1,g2,…
MODULEmod2ONCHAIN-INPUT|CHAIN-QEQUEST.
…
ENDCHAIN.
當fi之一滿足條件時,mod1被調用,當fi或gi滿足條件時,mod2被調用.
CHAIN.
FIELD:f1,f2.
FIELD:f3MODULEmod1ONINPUT.
ENDCHAIN.
只有f3包含非初始值時才調用mod1.
CHAIN.
FIELD:f1,f2.
FIELD:f3MODULEmod1ONCHAIN-INPUT.
ENDCHAIN.
f1,f2,f3中任一字段包含非初始值時都調用mod1.
注:條件調用也將使值被延遲傳輸.
66.輸入檢查:
單個字段輸入檢查:
PROCESSAFTERINPUT.
FIELDspfli-airpfrom.
MODULEcheck_fr_airport.
MODULEcheck_fr_airportINPUT.
SELECTSINGLE*FROMsairportWHEREid=spfli-airpfrom.
Ifsy-subrcNE0.
MESSAGEe003WITHspfli-airpfrom.
ENDIF.
ENDMODULE.
字段spfli-airpfrom將進行有效性檢查.
多個字段輸入檢查:
PROCESSAFTERINPUT.
CHAIN.
FIELD:spfli-carrid,spfli-connid.
MODULEcheck_flight.
ENDCHAIN.
MODULEcheck_flightINPUT.
SELECTSINGLE*FROMspfli
WHEREcarrid=spfli-carrid
ANDconnid=spfli-connid.
Ifsy-subrcNE0.
MESSAGEe005WITHspfli-carridspfli-connid.
ENDIF.
…
ENDMODULE.
spfli-carrid,spfli-connid二者之一出現錯誤時系統都觸發錯誤信息,需重新輸入
67.F1和F4幫助:
F1幫助:
1.數據字典幫助:
PCOCESSONHELP-REQUEST.
FIELDfWITHdocnum.
自行設計對話模塊,通過代碼設計幫助文檔:
PCOCESSONHELP-REQUEST.
FIELDfMODULEmod.
功能模塊HELP_OBJECT_SHOW可以顯示任意SAPScrip文本,
68.程序定義輸入幫助:
PROCESSONVALUE-REQUEST.
FIELDfWITHmod.
DYNP_VALUE_READ:讀取屏幕字段當前值.
DYNP_VALUE_UPDATE:選擇了幫助列表中的字段后,對該字段進行更新.
F4IF_INT_TABLE_VALUE_REQUEST:定義輸入幫助FUNCTION,將內表的形式的值列表顯示給用戶並返回用戶選擇的值.
69.上下文菜單:
在屏幕元素屬性對話框中填充ON_CTMENU字段,同時創建同名子程序
FORMon_ctmenu_<field>USINGl_menuTYPEREFTOcl_ctmenu.
CALLMETHODl_menu->add_function
EXPORTINGfcode=‘DISY’
Text=‘displaydetails’.
CALLMETHODl_menu->add_function
EXPORTINGfcode=‘CLAR’
Text=‘Clearall’.
ENDFORM.
當在屏幕相應字段上單擊右鍵並選擇相應的菜單時,程序調用PAI事件,同時將此子程序中設定的功能代碼傳遞給OK_CODE字段.而不是屏幕中設定的功能代碼,所以一定要注意此處的功能代碼要與屏幕中的功能代碼設置為一致.
70.下拉列表框:
在屏幕的流邏輯中定義字段的下拉列表(POV事件):
PROCESSONVALUE-REQUEST.
FIELDsexMODULEmod.
然后定義mod:
MODULEmodINPUT.
SELECTcarridcarrnameFROMscarr
INTOCORRESPONDINGFIELDSOFTABLEitab_carrid.
CALLFUNCTION'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield='CARRID'
value_org='S'
TABLES
value_tab=itab_carrid
EXCEPTIONS
parameter_error=1
no_values_found=2
OTHERS=3.
ENDMODULE.
71.表格控件:是SAP的標準控件,是一種平台無關的軟件元素,定義方式如下:
CONTROLSctrlTYPEctrltype.
SY-STEPL:表格控件中當前操作的屏幕行號.
SY-LOOPC:當前表格控件在屏幕中總行數.
72.屏幕中的傳統列表:
調用基本列表輸出所有WRITE語句中的內容,方法是在某個對話模塊中使用下列語句:LEAVETOLIST-PROCESSING[ANDRETURNTOSCREEN<scr>].scr為0時可返回到調用初始點.
要離開列表自理過程,可以按BACK,EXIT或CANCEL或者使用下列語句:
LEAVELIST-PROCESSING.
DATAmyrefTYPEz_ref.
CREATEDATAmyrefTYPEz_ref.
2.參照數據字典中的表類型生成內表對象或結構體:
DATAmytableTYPEz_table,”數據字典表類型,聲明內表.
mylineTYPELINEOFz_table.”表類型的行結構,聲明結構體.
3.取系統日期:SY-DATUM,
4.取系統時間:SY-UZEIT.0
5.系統字段定位:SY-FDPOS.字符比較結果為真時,此字段將給出偏移量信息.
6.系統字段SY-FDPOS給出字符的位置信息.(P109)
7.系統字段SY-INDEX記錄循環語句中的循環次數
8.操作內表行結束后系統字段SY-TABIX返回該行索引.對於所有行操作,如果操作成功,系統變量SY-SUBRC返回0,否則返回非0值.
9.系統用戶名:SY-UNAME.
10.SY-HOST?屏幕序號:sy-dynnr.
11.OK代碼:SY-UCOMM或SYST-UCOMM
12.屏幕組ID:SY-DYNGR.
13.常量聲明:CONSTANTconst(len)TYPEtype|LIKEdobj[DECIMALSdec][VALUEval].
14.確定數據對象屬性:DESCRIBEFIELDf[LENGTHl][TYPEt[CONPONENTSn]][OUTPUT-LENGTHo][DECIMALSd][EDITMASKm][HELP-IDh].
15.數據賦值:MOVEsourceTOdestination.或destination=source.
16.設定初始值:CLEARF.
17.檢查字段是否為初始值:fISINITIAL….
18.檢查字段是否被分配:fsISASSIGNED…..
19.檢查過程中的參數是否被實參填充:pIS[SUPPLIED|REQUESTED]….
20.檢查數據對象的值是否屬于某範圍之間:f1BETWEENf2ANDf3…..
21.檢查數據對象f的內容是否遵從某個選擇表的邏輯條件:finseltab….
22.WRITE:/10g,”在10個空格后輸出變量g
/(8)timeusingeditmask‘__:__:__’.”輸出的變量time保持8位的長度.
23.將光標移動到下一行:SKIP.
24.強制結束循環:EXIT,STOP或REJECT.
25.循環的中止:CONTINUE無條件中止當前循環並開始下一輪循環,CHECK條件為真時循環,為假時結束本次循環並開始下一輪循環,EXIT無條件中止並退出整個循環.
26.將字符串左移:SHIFTstring.
27.連接字符串:CONCATENATEs1s2…..snINTOs_dest[SEPARATEDBYsep].如果結果出現被截斷的情況,將SY-SUBRC返回4,否則返回0.符號&用于在字字符串換行時的連接.
28.根據分隔符sep拆分字符串:SPLITs_sourceATsepINTOs1s2……sn.使用內表操作可以避免被截斷的情況:SPLITs_sourceATsepINTOTABLEitab.此語句根據子串數目生成n行的內表.
29.循環輸出內表的每一行數據:LOOPATitabINTOtext.ENDLOOP.
30.替換字段內容:REPLACEstr1WITHstr2INTOs_dest[LENGTHlen].字段SY-SUBRC的返回值為0時表示己成功替換.
31.確定字段長度:[COMPUTE]n=STRLEN(str).
32.刪除字符串中的多余空格:CONDENSE
33.字符轉換,如將ABC轉換為abc:TRANSLATE
34.創建一個可以排序的格式:CONVERTTEXT.
35.用一個字符串覆蓋另一個字符串:OVERLAY
36.WRITETO賦值時將忽略數據對象的類型,而將其視為字符類型數據.
37.字符串比較中的換碼字符:#,用於轉換比較時使用的通配符:*或+.及進行區分大小寫,空格的比較,如#A表示比較大寫的A.
38.定位操作子串:strName[+0][(1)].
39.字段符號,數據引用:動態數據對象.
40.子程序定義:FORMsubroutine_nameUSINGparameters1parameters2….….ENDFORM.
41.子程序調用:PERFORMsubroutine_nameUSINGactual_parameters1p2….(其中USING可換成CHANGING)
42.ULINE.輸出下劃線.
43.錯誤查看:ST22
44.程序打包release:SE01:找到對應的程序,點開后點上面小汽車,再選中上面的后再點小汽車.點check.程序修改后需要重新打包.
45.制作T-CODE:SE93,TCODE應按順序編號:ZMF+流水號,我的程序名
46.創建table:t-code:se11,attributes:Deliveryclass:C.開發類別:ZFI,當自定義Fieldtype時,名稱需為Z+…..格式.->設置技術屬性(TechnicalSetting):Logicalstorageparameters中Dataclass:APPL1,Sizecategory:4à創建functiongroup:SE80,創建好后將創建的TABLE挂接到functiongrouph上去:用se11查出table,點utilites->tablemaintenancegenerator:Authorizationgroups:&NC&,Functiongroup中填剛才創建的功能組名稱->onestep->overviewscreen中必須填未使用的number,此處screennumber與table是一一對應的關系,也可讓點系統上面的按鈕:findscreennumber來自動搜索適合的scr.Number.->create,成功后,找到對應的functiongroup中的screennumber雙擊即可看到生成的代碼.需要修改欄位名稱可在functiongroup中的elementlist或layout中.-->se93創建t-code,startobject選transactionwithparameters(parametertransaction)->defaultvaluesfor->transantion:SM30->DefaultValues->nameofscreenfield:viewname\update,value:tablename\X.
47.field-sign:,field—option:,field-low:表示選擇條件中起始值
48.在where子句中如果只有一個表的話,可以不用指定表名.
49.獲取用戶IP地址及用戶名:
callfunction'TH_USER_INFO'"GetuserIP,hostname
importing
hostaddr=iporg”轉化前的IP地址
terminal=host”電腦名
exceptions
others=1.
"Conv.IPaddrtoformat'xxx.xxx.xxx.xxx'
callfunction'ZGJ_IPADR2STRING'"Conv.IPaddr
exporting
ipadr=iporg”轉化前的IP地址
importing
string=ipdec.”轉化后的最終需要的IP地址
50.刪除內表中數據完全相同的行,只保留一行:deleteadjacentduplicatesfromitab1COMPARING<f1><f2>/COMPARINGALLFIELDS.
51.spro:后臺設定
52.輸出選擇框write:/itab1-flagascheckbox
第四章ABAP基礎
4.1.5程序運行
1.程序內部調用,如下表:
功能報表調用語句事務調用語句
無返回調用SUBMITLEAVETOTRANSACTION
調用並返回SUBMITANDRETURNCALLTRANSACTION
例:
REPORTz_calling_program.
START-OF-PROGRAM.
WRITE‘Thisprogramcallsanotherprogram.’.”此內容在輸出界面看不到
SUBMITz_simple_program.”上面的輸出被此程序覆蓋.
如果改用SUBMITANDRETURN來調用則可以輸出以上內容.
2.結束程序:LEAVEPROGRAM.可在任意點強制結束當前運行的程序.
4.1.6內存管理
SAP程序同一個用戶和系統可進行最多6個SAPGUI主會話.
4.2.1數據定義
TYPES:BEGINOFt_staff,
S_no(3)typen,
Name(20),
ENDOFt_staff.
DATAstaffTYPEt_staff.
上例中定義了一個結構類型t_staff,並根據其聲明了一個結構體對象staff.
數據類型中的扁平結構與縱深結構:
扁平類型:運行時長度固定的類型.
縱深類型:運行時長度可巒的類型.
4.2.2ABAP內置基本數據類型:
數據
類型默認大小有效大小初始值說明示例
C11-65535SPACE文本字符(串)‘name’
N11-65535’00…0’數字文本‘0123’
T66‘000000’時間(HHMMSS)‘123010’
D88‘00000000’日期(YYYYMMDD)‘20080101’
I440整型(整數)99
F880浮點數5E+04
P81-160壓縮數12.91
X11-65535X‘0’十六進制數‘3A’
String1無限定SPACE字符串(長度可巒)‘AString’
XString1無限定SPACE十六進制字符串‘A3FF’
注意:
1.其中C,N,T,D,I,F,P,X為定長類型,即在運行期間長度不能改變.
2.類型T,D,I,F的數據存儲長度是固定的,不能指定參照其生成的數據對象占用的內存字節數.
3.基于類型C,N,P,X生成的數據對象需要在聲明時指定其長度.否則取默認值.
4.如果在聲明一個數據對象時未指明其數據類型,則該數據默認為C類型.
5.類型I的數值範圍:-231到231-1的整數.如果運算時出現非整型結果則進行四舍五入取值.而不是截斷小數.
6.類型P用于聲明小數位固定的壓縮數,其占據內存字節數和數值範圍取決於定義時指定的整個數據的大小和小數點后位數,如果不指定小數位,則將其視為I類型數據.有效大小可以是從1~16字節的任意值,小數點后最多允許14個數字.
7,類型F為浮點數,浮點意思是數字在內存中以字節形式表示,數值範圍:1*10-307到1*10308,因系統將F類型轉換為二進制數,所以可能出現舍入誤差,若用戶要求較高精度且數值較大時,應使用P類型數據.
8.長度可巒的內置類型String,XString是通過引用實際動態的數據對象的固定內存地址來操作.
4.2.3程序內部數據定義
參照自定義類型或內置類型生成數據的語法格式:
TYPES|DATA…TYPEl_type…
參照程序中已經聲明的數據對象生成新數據語法:
TYPES|DATA…LIKEdobj…
3.結構類型和結構體
參照結構類型生成的數據對象稱為結構體.
TYPES|DATA:BEGINOFstructure.
k1[TYPEtype|LIKEdobj]…,
k2[TYPEtype|LIKEdobj]…,
…
kn[TYPEtype|LIKEdobj]…,
ENDOFstructure.
參照生成:
參照結構生成:TYPES|DATAstructureTYPEstr_type|LIKEstr_dobj...
參照數據庫表生成:TYPES|DATAstructureTYPEdbtab.
4.表類型和內表
表類型的對象稱為內表.
4.2.4數據字典中的類型
l數據元素(Dataelements),相當於ABAP中的基本類型和引用類型.
l結構(Structures),由數據元素字段構成,對應ABAP中的結構類型.
l表類型(Tabletypes),對應ABAP中的表類型.
數據字典中的數據類型與ABAP中的中數據類型對應關系:
數據字典類型ABAP類型運行長度說明
ACCPN(6)6會計結算周期
CHARC(n)1~255字符
CLNTC(3)3集團,數據區域代碼
CUKYC(5)5貨幣代碼
CURR(n,m)P((n+1)/2)DECIMALm1~17貨幣金額
DATSD(8)8日期
DECn,mP((n+1)/2)DECIMALmn(1~31)m(1~17)數值計算
FLTPF(8)18浮點數
INT1X(1)(類型b)3單字節整型數
INT2X(2)(類型s)5雙字節整型數
INT4X(4)(類型i)10四字節整型數
LANGC(1)內部1位外部2位語言代碼
LCHRC(n)256~最大值長字符
LRAWX(n)256~最大值長位字符
NUMCnN(n)1~255數值文字
PRECX(2)16精確度
QUANn,mP((n+1)/2)DECIMALm1~17數量
RAWnX(n)1~255位字串
TIMST(6)6時間
VARCnC(n)255~最大值長字符(僅V3.0前可用)
STRINGSTRING1~最大值字符串
RAWSTRINGXSTRING1~最大值位字符串
UNITC(n)2~3單位
4.2.5程序中的數據對象
1.文字對象
當字符文字長度超過編輯器的一行時,可以使用”&”進行連接,避免因換行而產生的多余空格,如:long=‘Thisis‘&
‘alongsentence’.
如果需要輸出“’”,則需要在前面多加一個“’”轉回願意.
2.有名稱的數據對象
常量聲明:
CONSTANT:const(len)TYPE|LIKEdobj[DECIMALSdec]VALUEval.
結構體常量聲明(每個組件必須指定初始值):
CONSTANT:BEGINOFstructure,
str1TYPE|LIKEdobj[DECIMALSdec]VALUEval,
str2TYPE|LIKEdobj[DECIMALSdec]VALUEval,
...,
strnTYPE|LIKEdobj[DECIMALSdec]VALUEval,
ENDOFstructure.
3.系統數據對象(見附表)
4.查明數據對象屬性
DESCRIBEFIELDfLENGTHlen.此語句將字段f的長度寫入變量len.
lLENGTH:確定數據對象長度.
lTYPE:確定數據對象類型.
lOUTPUT-LENGTH:確定實際輸出長度.
lDECIMALS:確定P類型小數位長.
lEDITMASK:確定在數據字典中定義轉換例程.
lHELP-ID:確定在數據字典中定義的F1幫助信息.
4.3基本數據操作
4.3.1數據賦值
lMOVEsourceTOincept.等介於:incept=source.
lCLEARdobj.將數據對象dobj還原為初始值.
l結構體間賦值:struct2=struct1.(組件結構相同).
lMOVE-CORRESPONDINGstruct1TOstruct2.(部分組件結構相同).
4.3.2類型轉換(見附表).
4.3.3數值運算
1.算術運算
運算數學表達式語句關鍵字語句
加法n=x+y.ADDyTOx.
減法n=x–y.SUBTRACTyFROMx.
乘法n=x*y.MULTIPLYxBYy.
除法n=x/y.DIVIDExBYy.
整除n=xDIVy.無
取余n=xMODy.無
冪(乘方)n=x**y.無
兩個結構體的同名字段之間可以整體進行算術運算:
ADD-CORRESPONDINGstruct1TOstruct2.
SUBTRACT-CORRESPONDINGstruct1FROMstruct2.
MULTIPLY-CORRESPONDINGstruct2BYstruct1.
DIVIDE-CORRESPONDINGstruct2BYstruct1.
以上將對兩個結構體中的同名字段進行相應運算(非數值類型數據會引起錯誤).
2.數學函數
任意類型參數的函數列表:
函數名說明
ABS(dobj)返回參數絕對值
SIGN(dobj)返回參數符號:正數返回1,0返回0,負數返回-1.
TRUNC(dobj)返回參數的整數部分
FRAC(dobj)返回參數的小數部分
CEIL(dobj)返回不小於輸入參數的最小整數值
FLOOR(dobj)返回不大於輸入參數的最大整數值
注意:函數名與左括號間不能有空格,括號與參數間必須有空格.
F類型參數的函數列表(其它類型參數將首先被轉換為F類型).
函數名說明
COS,SIN,TAN三角函數
ACOS,ASIN,ATAN反三角函數
COSH,SINH,TANH雙曲函數
EXP底數為e(2.7182818285)的冪函數
LOG底數為e的自然對數
LOG10底數為10的對數
SQRT平方根
4.3.4數據輸出
輸出格式化選項:
選項應用類型說明
LEFT-JUSTIFIED所有類型左對齊
CENTERED所有類型居中
RIGHT-JUSTIFIED所有類型右對齊
UNDERg所有類型輸出直接開始於字段g
NO-GAP所有類型忽略輸出時字段后的一位空格
USINGEDITMASKm所有類型指定數據字典中定義的格式模板m
USINGNOEDITMASK所有類型撤消對格式模板的激活
NO-ZERO所有類型用空格替代所有有前導零
NO-SIGN數值類型不輸出前導符號
DECIMALSd數值類型輸出d定義小數點后的數字位數,如需截斷,則四舍五入
EXPONENTe數值類型對F類型字段在e>定義冪指數
ROUNDr數值類型用10的負r次方乘P類型字段,然后取整
CURRENCYc數值類型按系統表格TCURX中定義的格式將貨幣c格式化
DD/MM/YY|MM/DD/YY時間日期格式調整,”/”為用戶主記錄中定義的分隔符
DD/MM/YYYY,...(同上)時間日期格式調整,”/”為用戶主記錄中定義的分隔符
DDMMYY...(同上)時間日期格式調整,無分隔符
注:用戶主記錄System->Userprofile->Owndata(SU01).
4.3.5邏輯表達式
通用邏輯表達式列表:
運算符意義
EQ或=等於
NE或<>或><不等于
LT或<小于
LE或<=小于等于
GT或>大于
GE或>=大于等于
3.IS操作符
l...fISINITIAL...:檢查字段f是否為初始值.
l...fsISASSIGNED...:檢查字段符號是否被分配.
l...pIS[SUPPLIED|REQUESTED]...:檢查過程中的參數是否被實參填充.
4.BETWEEN操作符
l...f1BETWEENf2ANDf3...:檢查數據對象的值是否屬于特定範圍之間.
5.IN操作符(P110)
l...fINseltab...:檢查一個數據對象的內容是否遵從某個選擇表的邏輯條件.
6.組合邏輯表達式
lAND:與.
lOR:或.
lNOT:非.
注:括號與操作數間至少要有一個空格,如:IF(c>n)AND(c<f).
4.4結構控制
程序代碼分三種結構:
l順序結構:語句逐行執行.
l分支結構:根據不同的條件執行不同語句塊.
l循環結構:反復執行某個語句.
4.4.1分支控制
1.IF/ENDIF結構:
IF<condition1>.
<statementblock>
ELSEIF<condition2>.
<statementblock>
......
ELSE.
<statementblock>
ENDIF.
注:可嵌套.
2.CASE/ENDCASE結構:
CASEf.
WHENf11[ORf12OR...].
<statementblock>
......
[WHENOTHERS.]
<statementblock>
ENDCASE.
其中,f為變量,fij可以是變量或者固定值.
4.4.2循環控制
1.無條件循環
DO[nTIMES].
<statementblock>
ENDDO.
說明:n為循環次數,可以是文字或變量,如果沒有限定n值,則必須用EXIT,STOP或REJECT等語句強制結束循環.DO循環可嵌套,SY-INDEX為當前循環次數.
2.條件循環
WHILE<condition>.
<statementblock>
ENDWHILE.
注:可嵌套,其它同上.
3.循環中止
lCONTINUE:無條件中止當前本輪循環,開始下一輪循環.
lCHECK:條件中止當前本輪循環(條件為假時),開始下一輪循環.
lEXIT:無條件完全中止當前循環,繼續循環結束語句(ENDDO,ENDWHILE等)后面的代碼,如果在嵌套循環中,系統僅退出當前循環.
4.5處理字符數據
4.5.1字符數據
1.連接字符串
CONCATENATEs1s2...snINTOs_dest[SEPARATEDBYsep].
注:所有字串操作將忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).
如果出現截斷情況,將SY-SUBRC設為4,否則返回0.
2.拆分字符串
SPLITs_sourceATsepINTOs1s2...sn.
如果所有子串足夠長且不必截斷任何部分,則將SY-SUBRC設為0,否則返回4,
如果源字符串能夠拆分的子串多過指定的數目,則源子串最后的剩余部分包括其后的分隔符都將寫入最后一個子串,要避免這種情況,需要使用內表進行操作:
SPLITs_sourceATsepINTOTABLEitab.在該形式中,根據子串數目生成n行的內表.例如:
DATA:texttypestring,
itabTYPETABLEOFstring.
text=‘ABAPisaprogramminglanguage’.
SPLITtextATspaceINTOTABLEitab.
LOOPATitabINTOtext.
WRITE/text.
ENDLOOP.
3.查找子串模式
SEARCHcFORstr.在字段c中查找字符串str.如果找到,則將SY-SUBRC返回0,SY-FDPOS返回字段c中該字符串的位置(從左算起的字節偏移量),否則SY-SUBRC返回4,查找模式有以下幾種:
lstr搜索str並忽略尾部空格.
l.str.搜索str,但不忽略尾部空格.
l*str搜索以str結尾的單詞.
lstr*搜索以str開始的單詞.
REPORTz_string_search.
DATAstring(30)TYPEcVALUE'Thisisatestingsentence.'.
WRITE:/'searched','sy-subrc','sy-fdpos'.
SEARCHstringFOR'X'.
WRITE:/'X',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'itt'.
WRITE:/'itt',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'.e.'.
WRITE:/'.e.',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR'*e'.
WRITE:/'*e',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
SEARCHstringFOR's*'.
WRITE:/'s*',sy-subrcUNDER'sy-subrc',sy-fdposUNDER'sy-fdpos'.
輸出結果如下:
searchedsy-subrcsy-fdpos
X40
itt40
.e.40
*e018
s*018
4.替換字段內容.
REPLACEstr1WITHstr2INTOs_dest[LENGTHlen].搜索s_dest中前len個字符中的子串str1,用str2來替換它,如果成功,SY-SUBRC返回0,否則還回非0值.
REPORTz_replace.
DATAnameTYPEstring.
name='Michael-Cheong'.
WHILEsy-subrc=0.
REPLACE'-'WITH''INTOname.
ENDWHILE.
WRITE/name.
輸出結果:MichaelCheong
5.確定字段長度
n=STRLEN(str).函數將str作為字符數據類型處理,不考慮其實際類型,也不進行轉換.計算其首字符到最后一個非空字符的長度,不包括結尾空格.
6.其它操作語句
lSHIT:將字符串整體或子串進行位移.
lCONDENSE:刪除字符串中的多余空格.
lTRANSLATE:字符轉換,如將ABC轉換為abc.
lCONVERTTEXT:創建一個可以排序的格式.
lOVERLAY:用一個字符串覆蓋另一個字符串.
4.5.2字符數據比較(用於判斷兩個字串之間的包含關系):
運算符含義
s1COs2如果s1僅包含s2中的字符,邏輯表達式為真
s1CNs2如果s1還包含s2之外的字符,邏輯表達式為真
s1CAs2如果s1包含任何一個s2中的字符,邏輯表達式為真
s1NAs2如果s1不包含s2的任何字符,邏輯表達式為真
s1CSs2如果s1包含字符串s2,邏輯表達式為真
s1NSs2如果s1不包含字符串s2,邏輯表達式為真
s1CPs2如果s1包含模式s2,邏輯表達式為真
s1NPs2如果s1不包含模式s2,邏輯表達式為真
注:CO,CN,CA,NA比較時區分大小寫,且尾部空格也在比較範圍之內,CS,NS,CP,NP比較時忽略尾部空格且不區分大小寫,比較結束后,如果結果為真,SY-FDPOS將給出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代單個字符.
換碼字符使用:
l指定大小寫(如#A,#b).
l通配符”*”(輸入#*),將其轉回原義.
l通配符”+”(輸入#+),將其轉回原義.
l換碼符本身”#”(輸入##),將其轉回原義.
l字符串結尾空格(輸入#__),指定比較結尾空格.
4.5.3定位操作子串
str[+position][(len)].從字符串str中的position位開始取出長度為len的子串.
可動態指定偏移量及長度的情況(即position及len可為變量):
l用MOVE語句或賦值運算符給字段賦值時.
l用WRITETO語句向字段寫入值時.
l用ASSIGN將字段分配給字段符號時.
l用PERFORM將數據傳送給子程序時.
off=6.
len=2.
date+off(len)=‘01’.
4.6使用內表
types定義的並不是結構體對象,只是結構類型,不能作為工作區,當定義的內表沒有表頭行(工作區)時,必須為其定義一個結構體作為工作區,否則無法使用此內表.如果沒有給內表定義工作區,則在定義內表時必須聲明表頭行(withheaderline).
DATA:BEGINOFline,"workarea(structure)結構類型且結構體對象
numTYPEi,
sqrTYPEi,
ENDOFline,
"無表頭行內表,內表定義都使用data關鍵字.
itabTYPE(LIKE)STANDARDTABLEOFlineWITHKEYtable_line.
DATADIRTABLIKECDIROCCURS10WITHHEADERLINE.定義標準內表
DO5TIMES.
line-num=sy-index.
line-sqr=sy-index**2.
APPENDlineTOitab.
ENDDO.
LOOPATitabINTOline.
WRITE:/line-num,line-sqr.
ENDLOOP.
CLEARitab.
注:
1.TYPES與DATA區別:TYPES是用來定義某種類(型)的,需(用DATA語句)實例化以后才可以使用,而DATA是用來定義數據對象(實例變量)的,對于用DATA直接定義的結構體對象(不參照其它結構類型),其同時也是一個結構類型.
2.TYPE與LIKE區別:TYPE后面跟隨的只能是某種類(型),而LIKE后面可以跟隨類型或實例對象,參照結構體對象生成內表時只能用LIKE,不能用TYPE,因為結構體對象不是類型,只是一種實例對象,參照結構類型生成內表時可以用LIKE也可以用TYPE.其中通過LIKE定義的內表直接擁有參照結構類型的元素結構,而通過TYPE定義的內表只能間接擁有被參照結構類型的元素結構,結構類型不能作為內表的工作區,只有結構體對象才可以.
內表定義語法:
1.標準表:可指定或不指定關鍵字,可重復.邏輯索引,操作數據時數據內存位置不巒,系統只重排數據行的索引值.
DATAitabTYPE|LIKE[STANDARD]TABLEOFstructure[WITHKEYcomp1...compn(DEFAULTKEY)WITHHEADERLINEINITIALSIZEn].
2.排序表:可指定唯一或不唯一的關鍵字,也可不指定,邏輯索引,按關鍵字升序存儲.
DATAitabTYPE|LIKESORTEDTABLEOFstructure[WITHNON-UNIQUE(UNIQUE)KEYcomp1...compn(DEFAULTKEY)WITHHEADERLINEINITIALSIZEn].
3.哈希表:必須指定唯一關鍵字.無索引
DATAitabTYPE|LIKEHASHEDTABLEOFstructureWITHUNIQUEKEYcomp1...compn(DEFAULTKEY)[WITHHEADERLINEINITIALSIZEn].
注:如果n值為0或不指定的話,程序會為內表對象分配8KB大小內存,所以,如果內表比較小,不要把該值設為0,以避免內存浪費.
舊版標準表定義語法:
DATAitabTYPE|LIKE[STANDARD]TABLEOFstructureOCCURSn.或者
DATA:BEGINOFitabOCCURSn,
...,
fi...,
ENDOFitab.
动态创建内表:
REPORTzmaschl_create_data_dynamic.
TYPE-POOLS:slis.
DATA:it_fcatTYPEslis_t_fieldcat_alv,
is_fcatLIKELINEOFit_fcat.
DATA:it_fieldcatTYPElvc_t_fcat,
is_fieldcatLIKELINEOFit_fieldcat.
DATA:new_tableTYPEREFTOdata.
DATA:new_lineTYPEREFTOdata.
FIELD-SYMBOLS:<l_table>TYPEANYTABLE,
<l_line>TYPEANY,
<l_field>TYPEANY.
*Buildfieldcat
CALLFUNCTION'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name='SYST'
CHANGING
ct_fieldcat=it_fcat[].
LOOPATit_fcatINTOis_fcatWHERENOTreptext_ddicISinitial.
MOVE-CORRESPONDINGis_fcatTOis_fieldcat.
is_fieldcat-fieldname=is_fcat-fieldname.
is_fieldcat-ref_field=is_fcat-fieldname.
is_fieldcat-ref_table=is_fcat-ref_tabname.
APPENDis_fieldcatTOit_fieldcat.
ENDLOOP.
*CreateanewTable
CALLMETHODcl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog=it_fieldcat
IMPORTING
ep_table=new_table.
*CreateanewLinewiththesamestructureofthetable.
ASSIGNnew_table->*TO<l_table>.
CREATEDATAnew_lineLIKELINEOF<l_table>.
ASSIGNnew_line->*TO<l_line>.
*Testit...
DO30TIMES.
ASSIGNCOMPONENT'SUBRC'OFSTRUCTURE<l_line>TO<l_field>.
<l_field>=sy-index.
INSERT<l_line>INTOTABLE<l_table>.
ENDDO.
LOOPAT<l_table>ASSIGNING<l_line>.
ASSIGNCOMPONENT'SUBRC'OFSTRUCTURE<l_line>TO<l_field>.
WRITE<l_field>.
ENDLOOP.
4.6.2操作內表行
標準表排序表哈希表
索引訪問允許允許不允許
關鍵字訪問允許允許允許
相同值關鍵字行可重復可重復或不可重復不可重復
推薦訪問方式主要通過索引主要通過關鍵字只能通過關鍵字
注:CLEARitab[].表示操作的是內表對象.而CLEARitab.當itab有表頭行時表示操作表頭行,如無表頭行時表示操作內表對象.
當一個操作語句結束后,SY-TABIX返回該行的索引值,對於所有行操作,如果訪問成功,SY-SUBRC返回0,否則返回非0值.
4.插入行—INSERT
lINSERTstructureINTOitabINDEXidx.無表頭行索引表,itab的行數應大於或等于idx-1.否則失敗
lINSERTitabINDEXidx.有表頭行索引表.
l對于哈希表,系統按關鍵字將新行插入特定位置.
lINSERTstructureINTO|INITIALLINEINTOTABLEitab.此語句對於標準表來說與append效果相同,對於排序表來說,插入的行不可以打亂按照關鍵字排序的順序,否則插入不成功,對於哈希表來說,插入過程中系統按照關鍵字對行進行定位.INITIAL關鍵字是用于向內表中插入結構中各類型的初始值的.
lINSERTLINESOFitab1[FROMn1][TOn2]INTO[TABLE]itab2[INDEXidx].將內表中部分或全部數據行整體插入到另一內表中,指定行數時itab1,itab2必須為索引表,指定TABLE關鍵字時,itab2可以是任意內表.此方式比其它方式快20倍左右.
5.附加行—APPEND(只能操作索引表)
APPEND[structureTO|INITIALLINETO]itab.
APPENDLINESOFitab1[FORMn1][TOn2]TOitab2.
6.聚集附加—COLLECT
COLLECTlineINTOitab.對於需要附加的數據,如果在內表中存在關鍵字內容與其相同的數據行,則此語句將需要附加的數據累加到內表中的這一行上,而不會另外再添加一行,操作成功后,SY-TABIX返回被處理過的行的索引.
注:關鍵字以外的所有字段必須是數字類型
7.讀取行—READ(可用於任何類型內表)
lREADTABLEitab[INTOwa|ASSIGNING<fs>]INDEXidx.通過索引讀取內表中的單行數據.ASSIGNING表表示指派給字段符號.
lREADTABLEitabFROMstructure[INTOwa|ASSIGNING<fs>].讀取與結構相同的工作區中的關鍵字內容全部相同的內表數據.
lREADTABLEitabWITHTABLEKEYfield1=v1...field2=v2[INTOwa|ASSIGNING<fs>].指定所有關鍵字值,並讀取相等時內表行.
lREADTABLEitabWITHKEYfield1=v1...field2=v2[INTOwa|ASSIGNING<fs>].讀取內表中字段fieldn(不一定是表關鍵字段)與值vn相同時的內表行.
8.修改行—MODIFY
lMODIFYitab[FROMwa][INDEXidx][TRANSPORTINGf1f2...].如果內表包含的行數少於idx,則不更改任何行.
lMODIFYTABLEitabFROMwa[TRANSPORTINGf1f2...].根據工作區wa中關鍵字修改內表行,TRANSPORTING表示修改指定字段值.
lMODIFYitabFROMwaTRANSPORTINGf1f2...WHEREcondition.修改符合WHERE子句中條件的內表中的指定字段值.
9.刪除行—DELETE
lDELETEitabINDEXidx.根據索引刪除內表行.
lDELETETABLEitabFROMwa.根據工作區關鍵字刪除行.
lDELETETABLEitabWITHTABLEKEYfield1=v1...field2=v2.根據指定關鍵字值刪除行.
lDELETEitab[FROMn1][TOn2][WHERE<condition>].
10.循環處理--LOOP
LOOPATitab[INTOwa][FROMn1][TOn2][WHEREcondition].
<statementblock>.
ENDLOOP.
4.6.3操作整個內表
1.排序
SORTitab[ASCENDING|DESCENDING][ASTEXT][STABLE]
[BYf1[ASCENDING|DESCENDING][ASTEXT]
......
f1[ASCENDING|DESCENDING][ASTEXT]]
說明:
lASCENDING|DESCENDING:升序或降序.默認升序.
lASTEXT:根據當前語言按字母順序排序字符字段,否則按字符平台相關內部編碼進行排序.
lSTABLE:保持排序前后不需要改變的數據行的相對順序.
2.控制級操作(用于總計,縮進,格式控制等)
ATFIRST|LAST|NEWf|ENDOFf.
<statementblock>
ENDAT.
說明:
lFIRST:當循環為內表的第一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.
lLAST:當循環為內表的最后一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.
lNEWf:字段f前面(即左邊)的全部字段內容之一不同於上一行時,執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
lENDOFf:如果下一行行組中的任何字段內容不同於上一行,執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
注:在控制級操作期間,在工作區中,對於非標準關鍵字段,將全部進行初始化,在執行完控制操作后(即ENDAT語句后)工作區中的數據將全部還原到進入控制級操作語句前(即進入AT前)狀態.
3.初始化內表
lCLEARitab.:帶表頭行時只清空表頭行,不帶表頭行時清空整個內表.
lCLEARitab[].:只清空整個內表對象數據.不清空表頭行.
lREFRESHitab或REFRESHitab[].:只清空整個內表對象數據.不清空表頭行.
lFREEitab.或FREEitab[].:只清空整個內表對象數據.不清空表頭行,同時釋放內存.
l......itabISINITIAL....:檢查內表是否為空.
4.整體復制內表
lMOVEitab1TOitab2.:如果兩表都存在表頭行,則此語句只復制了表頭行.
lMOVEitab1[]TOitab2[].:指定表體復制.
lMOVEitab1[]TOitab2.:表itab2無表頭行時才成立.
litab2=itab1.同上1
litab2[]=itab1[].同上2
litab2=itab1[].同上3
5.比較內表大小
...itab1<operator>itab2...:其中<operator>可以為=,<>,><,>=,<=,>,<等.
4.6.4ExtractDatasets
lFIELD-GROUPfg.行結構分配.
lINSERTf1f2...INTOfg.生成字段組fg的具體字段結構.
lEXTRACTfg.將字段組填充給EXTRACT.
lSORT.排序.
lLOOP.<statementblock>ENDLOOP.循環輸出EXTRACT.
4.7動態數據對象
4.7.1字段符號
lFIELD-SYMBOLS<fs>[TYPEtype|LIKEdobj].聲明字段符號.
lASSIGNfTO<fs>.靜態分配數據對象給字段符號.
lASSIGNf[+i][(j)]TO<fs>.指定偏移量和長度.
lASSIGN(f)TO<fs>.動態分配,先找到字段f的內容,然后將該內容分配給<fs>.
4.7.2數據引用
TYPESt_drefTYPEREFTODATA.
DATAdrefTYPEREFTODATA.
4.8模塊化技術
4.8.2子程序
1.定義:
FORMsubr[[USING[VALUE(p1)]...][TYPEt|LIKEf]...][TYPEANY]
[CHANGING[VALUE(p1)]...][TYPEt|LIKEf]...][TYPEANY].
<subrcodes>
ENDFORM.
注:
lVALUE參數表未示值傳遞,此方式在子程序調用后實參的值不會被改變.
l無VALUE參數時表示引用傳遞,會改變實參的值.
lUSING與CHANGING無任何區別.
l位于兩個子程序間的代碼不屬于任何事件塊.
l參數傳遞時不存在類型轉換,要求必須兼容.
2.調用:
PERFORMsubr[USINGp1...pn][CHANGINGpi...pj].
4.8.3功能模塊(p153)
4.8.5源代碼復用
1.包含程序
包含程序是單純的代碼復用,不是可執行程序,不能單獨運行,必須被其它程序調用,包含程序不能調用自身.
INCLUDEincl.包含程序調用,此語句必須獨占一行.
2.宏:(語句塊中最多只能包含9個占位符&1...&9).
例:
DATA:resultTYPEi,
int1TYPEiVALUE1,
int2TYPEiVALUE2.
DEFINEoperation.
result=&1&2&3.
output&1&2&3result.
END-OF-DEFINITION.
DEFINEoutput.
write:/'Theresultof&1&2&3is',&4.
END-OF-DEFINITION.
operation1+2.
operationint2-int1.
4.9.1靜態錯誤檢查
1.語法檢查:用Check鍵.
2.擴展語法檢查(SLIN):在ABAP初台界面輸出程序名后,選擇Program->Check->ExtendedSyntaxCheck.àStandard.
4.9.2運行時錯誤控制
1.可捕捉的錯誤
CATCHSYSTEM-EXCEPTIONSexc1=rc1...excn=rcn.
...
ENDCATCH.
其中exci表示一個單一可捕捉錯誤或者一個ERROR類,rci則代表一個數字.如果其中錯誤之一在CATCH和ENDCATCH語句之間出現,程序就不會中止,而是直接跳至ENDCATCH后,把系統指定的錯誤代碼rci賦給字段SY-SUBRC.此語句可嵌套.例如:
DATA:result1TYPEpDECIMALS3,
numberTYPEiVALUE11.
CATCHSYSTEM-EXCEPTIONSarithmetic_errors=5.
DO.
number=number-1.
result1=1/number.
WRITE:/number,result1.
ENDDO.
ENDCATCH.
IFsy-subrc=5.
WRITE/'divisionbyzero!'.
ENDIF.
2.不可捕捉的錯誤(通過ST22查看,在SAP系統中保存14天,可通過Keep功能保存更長時間).
第六章數據庫操作
6.2.1表字段
在數據字典中,每創建一個數據庫表后,都將同時生成一個同名的結構化數據類型.
6.2.2外部關鍵字
外部關鍵字內容必須在其對應的約束表(checktable)中存在,否則無法插入.
6.2.3技術設定
1.數據類型(dataclass):
lAPPL0(Masterdata),較少需要被修改的系統數據表,如員工個人信息.
lAPPL1(Transactiondata),需要經常被修改的數據表,如產品庫存量表.
lAPPL2(Organizationandcustomizing),系統定制數據表,在系統安裝后很少需要修改,如國家代碼等.
2.數量級別:
00to6,600
16,600to26,000
226,000to100,000
3100,000to420,000
4420,000to34,000,000
3.緩沖(Buffering)機制
如果在緩沖設定中選擇了Bufferingswitchedon項,則需要設定其緩沖類型(有Full,Single-record和Generic三種).
緩沖機制的意義在於首次查詢時將數據表中的數據放入應用服務器緩沖區,以提高后續查詢效率,要注意最好不要對經常需要的數據庫表設置該機制,對于經常讀取但很少更新或者通常只有在60秒后才可能被其他應用服務器程序修改的數據庫表,開啟緩沖機制可以上百倍地提高效率.
4.Logdatachanges用于設定表中的數據修改時是否在系統日志中記錄.
6.2.4索引
一個數據庫表可以包含一個主索引(PrimaryIndex)和多個附屬索引(SecondaryIndexes).主索引只包含表關鍵字和指向整個數據條目的指針,由系統自動生成並在添加數據庫條目時進行維護.索引中的數據已經排序.
6.3.1SELECT語句
SELECT<result>FROM<source>INTO<target>
[WHERE<condition>][GROUPBY<fields>]
[HAVING<cond>][ORDERBY<fields>].
lHAVING子句用于限定ORDERBY子句中數據條目組的選擇條件
1.選擇單行數據:
lSELECTSINGLE*FROMtabINTOwa_tabWHERE<condition>.選擇單行全部數據.
lSELECTSINGLEfield1...fieldnFROMtabINTO(wa_field1,...,wa_fieldn)WHERE<condition>.選擇單行指定字段數據到指定工作區字段.
lSELECTSINGLE*|field1...fieldnFROMtabINTOCORRESPONDINGFIELDSOFwa_tabWHERE<condition>.將選擇的值放入工作區中對應的字段中.
6.3.3選擇多行數據
1.循環選擇(DISTINCT去掉結果重復的行):
SELECT[DISTINCT]....
<statementblock>
ENDSELET.
系統字段SY-DBCNT給讀取的行計數.
2.選擇至內表:
SELECT...INTO|APPENDING[CORRESPONDINGFIELDSOF]TABLEitab.
其中INTO選項將復蓋itab中的數據,如果不想復蓋只想追加則用APPENDING.
3.指定選擇包大小(一次選擇到內表的行數):
SELECT*FROMtabINTO|APPENDINGTABLEwa_tabPACKAGESIZEn.
<statementblock>
ENDSELET.
6.3.4指定查詢條件
1.比較運算符:=,<,>,<>,<=,>=.
2.範圍限定運算符:WHERE...f[NOT]BETWEENg1ANDg2....
3.字符比較運算符:WHERE...f[NOT]LIKEg[ESCAPEh]...其中g中通配符”_”用於替代單個字符,”%”用于替代任意字符串.ESCAPE選項舉例如下:
SELECT...WHEREcityLIKE‘edit#_%’ESCAPE‘#’.選擇所有以”edit_”開始的城市.
4.檢查列表值:WHERE...f[NOT]IN(g1,...gn)...
5.檢查空值:WHERE...fIS[NOT]NULL...注:這里的NULL值不等同於初始值INITIAL
6.檢查選擇表.
lWHERE...f[NOT]INseltab...其中seltab為選擇表,如選擇屏幕中用戶填充數據.
lSELECT...WHERE(code=‘01’ORcode=‘02’)ANDNOT(country=‘usa’).:AND,OR,NOT可以按照任意順序組合.
lSELECT...WHERE<condition>AND(itab).內表itab僅包含一個類型為C的字段,且最大長度為72.字段中內容不能使用變量.這種方式查詢效率很低.
6.3.5多表結合查詢
1.SELECT語句嵌套
DATA:wa_carridTYPEspfli-carrid,
wa_connidTYPEspfli-connid,
wa_carrnameTYPEscarr-carrname.
SELECTcarridconnid
FROMspfli
INTO(wa_carrid,wa_connid)
WHEREcityfrom='BOSTON'.
SELECTcarrname
FROMscarr
INTOwa_carrname
WHEREcarrid=wa_carrid.
WRITE:/wa_carrname.
ENDSELECT.
ENDSELECT.
2.FORALLENTRIES選項(比上面的嵌套要快)
DATA:BEGINOFwa_carrid,
carridTYPEspfli-carrid,
ENDOFwa_carrid.
DATA:wa_carrid_tabLIKETABLEOFwa_carrid.
DATA:BEGINOFwa_carrname,
carridTYPEscarr-carrid,
carrnameTYPEscarr-carrname,
ENDOFwa_carrname.
SELECTcarrid
FROMspfli
INTOTABLEwa_carrid_tab
WHEREcityfrom='BOSTON'.
SELECTcarridcarrname
FROMscarr
INTOwa_carrname
FORALLENTRIESINwa_carrid_tab”相當於循環輸出內表在WHERE子句中出現的
WHEREcarrid=wa_carrid_tab-carrid.”字段的值
WRITE:/wa_carrname-carrid,wa_carrname-carrname.
ENDSELECT.
注:此子句中不能使用LIKE,BETWEEN,IN,ORDERBY.
3.使用視圖:可先用SE11創建視圖然后查詢,效率更高.
4.結合查詢
SELECT...FROMtable[INNER]JOINjointab1[ASalias1]ON<cond><options>..
[INNER]JOINjointab2[ASalias2]ON<cond><options>...
WHERE<cond>...內連接,條件間只能用AND連接,也可放入WHERE子句.
SELECT...FROMtableLEFT[OUTER]JOINjointab1[ASalias1]ON<cond><options>..左連接,在ON附加項中,只能使用”=”操作符.不能在WHERE子句中對結合數據表中的字段進行條件限定.
5.子查詢(沒有INTO子句,不能結合ON同時出現,可嵌套)
lSELECT...FROMscarINTO
WHEREEXIST(SELECT*FROMspfli
WHEREcarrid=scarr-carrid
ANDcityfrom=‘BOSTON’).
l...WHEREcityIN(SELECTcityfromFROMspfliWHERE...只返回單個字段.
l...WHEREcity=(SELECTcityfromFROMspfliWHERE...單行返回結果.
l...WHEREcity>ALL|ANY|SOME(SELECTcityfromFROMspfliWHERE...多行返回值.
6.3.6組合查詢結果
1.總計功能
SELECTMAX|MIN|SUM|AVG|COUNT([DISTINCT]f1)[ASa1]...其中DISTINCT選項將在統計之前先排除相同的選擇結果.
2.分組總計
SELECTf1[ASa1]...MAX|MIN|SUM|AVG|COUNT([DISTINCT]fm)[ASam]...
INTO(s1,...,sm...)|CORRESPONDINGFIELDSOFitab...
GROUPBYf1...
注:分組總計必須指定查詢字段或使用INTOCORRESPONDINGFIELDSOF附加項,使用后者時需要通過AS后面的別名將總計結果存放在與別名同名的字段中.
3.指定分組條件
SELECTf1[ASa1]...MAX|MIN|SUM|AVG|COUNT([DISTINCT]fm)[ASam]...
INTO(s1,...,sm...)|CORRESPONDINGFIELDSOFitab...
GROUPBYf1...
HAVING<cond>.用於對分組總計選出的數據進行二次篩選.
4.排序(SQLTrace工具查看數據庫索引)
l...ORDERBYPRIMARYKEY.系統將按主關鍵字升序排序.
l...ORDERBYf1[ASCENDING|DESCENDING]...指定字段,默認升序.
6.3.7其它格式說明
lTABLSEdbtab.聲明與數據庫表同名同結構的工作區,是一種結構體對象,不是內表.
ldbname=‘EKBE’.SELECTf1...FROM(dbname)INTO(s1,...)...動態指定數據庫表,注意數據庫表名必須大寫.
lSELECT|UPDATE...FROMdbtabCLIENTSPECIFIEDWHEREmandtBETWEEN‘100’AND‘103’.用CLIENTSPECIFIED選項取消系統自動處理當前集團數據表功能,同時就可以在WHERE子句中指定需要讀取的集團.
lSELECT...FROMdbtabBYPASSINGBUFFER...取消TABLE技術設定中設定的緩沖機制,另,DISTINCT附加項與結合選擇,總計選擇,ISNULL條件,子查詢,以及GROUPBY和ORDERBY同時使用時,也將自動忽略緩沖設定.
lSELECT...FROMdbtabUPTOnROWS...只選取滿足條件的n行數據,如果n為0,則選取所有滿足條件的數據,如果同時使用ORDERBY子句,則系統首先先出所有滿足條件的數據並排序,然后將頭n行作為選擇結果.
lGETRUNTIMEFIELDf.系統返回從程序開始后的毫秒數,其中f為I類型數據.
6.3.8使用光標(多個光標可指向同一個選擇)
DATA:curTYPEcursor.
OPENCURSORcurFORSELECTcarridFROMspfliWHEREcityfrom='BOSTON'.打開光標.
DO.
FETCHNEXTCURSORcurINTO(wa_carrid_tab-carrid).相當於循環讀取OPENCURSOR語句生成的結果集中的下一行數據.
APPENDwa_carrid_tab.
或者FETCHNEXTCURSORcurINTOTABLEwa_carrid_tab.整體讀取放放內表.
IFsy-subrc<>0.如果FETCH語句沒有讀取任何行,sy-subrc返回4,否則返回0.
CLOSECURSORcur.關閉光標.
EXIT.
ENDIF.
ENDDO.
在SELECT語句中,數據從數據庫中以大小為32KB的數據包傳遞至應用服務器,並通過INTO子句傳至ABAP程序.
6.4更新數據
數據庫操作結束后通過SY-SUBRC返回標識代碼,如果操作成功,返回0,另SY-DBCUT還將返回實際操作的數據行數.
6.4.1INSERT語句(數據庫表必須是可維護狀態)
lINSERTINTOdbtab|viewVALUESwa.插入單行,視圖數據必須來自同一個表.
lINSERTINTOdbtab|viewFROMwa.插入單行,視圖數據必須來自同一個表.
lINSERTdbtabFROMTABLEitab.當有一條數據插入失敗,系統不更新任何數據.
lINSERTdbtabFROMTABLEitabACCEPTINGDUPLICATEKEYS.如果出現關鍵字字相同條目,SY-SUBRC返回4,並跳過該條目,並更新其它條目.
6.4.2UPDATE語句
lUPDATEdbtabSETf1=g1...fn=gnWHERE<fix_key>.只能更新非關鍵字.只要更新一行,SY-SUBRC返回0.
lUPDATEdbtabFROMwa.根據工作區中的關鍵字更新對應的條目.
lUPDATEdbtabFROMTABLEitab.根據內表關鍵字批量更新數據.
6.4.3MODIFY語句
lMODIFYdbtabFROMwa.添加或更新單行.
lMODIFYdbtabFROMTABLEitab.添加或更新多行.
6.4.5DELETE語句
lDELETEFROMdbtabWHERE<cond>.只要刪除一行,SY-SUBRC返回0.
lDELETEdbtabFROMwa.
lDELETEdbtab[CLIENTSPECIFIED]FROMTABLEitab.如果有一行不能刪除,系統繼續處理下一行,成功刪除內表中所有行時,SY-SUBRC返回0.如果內表為空,會刪除所有數據,且SY-SUBRC和SY-DBCNT都返回0.
6.5數據一致性
6.5.1SAPLUW與DBLUW
1.LUW概念:在SAP系統中,兩個數據一致狀態中的時間間隔為LUW(LogicalUnitofWork),每一個LUW都需要以一個提交(COMMIT)或者返回(ROLLBACK)作為結束標志.如果以提交操作結束則進行所有更新操作,而返回操作則取消所有數據庫表的更改.
2.數據庫LUW:這是底層數據庫自身提供的保持數據一致性的機制,與SAP系統無關,對於ABAP程序來說,主要的問題在於如何確定數據庫的LUW的觸發時機,一個工作過程總是在下述情況下結束一個數據庫LUW並隱式地進行數據庫提交:
l當一個對話步驟(Dialogstep)結束,即顯示一個新屏幕給用戶時.
l在另一個工作過程繼續程序的執行,這一般出現在RFC(遠程功能模塊)的調用或返回過程中.
相應地,下列情況將使數據庫隱式地進行返回操作:
l當前ABAP程序出現運行錯誤.
l一個ABAP程序因類型A或X的消息而導致中止.
3.SAPLUW:一個SAPLUW可以包含多個對話步驟,即多個數據庫LUW,但一個OPENSQL語句不能被分隔為幾個對話步驟,即通過SAPLUW可以將多個數據庫LUW進行捆綁,並保存整體初始狀態,不進行真正的數據庫修改,當SAPLUW中的最后一個數據庫LUW結束時,再進行整體修改,或者整體取消操作.
SAPLUW提供兩種具體數據庫LUW捆綁機制:
l在定義FUNCTION時將其定義為Updatemodule,同時在調用時用如下方式:CALLFUNCTION...INUPDATETASK.則該模塊不是馬上被執行,而是被放置於應用服務器中的一個特殊的更新工作過程(Updateworkprocess)中,因此可以將多個分布在不同對話過程中的類似模塊捆扎在一起,當SAPLUW結束時,確保所有模塊被同時成功執行或整體放棄,因此可通過該方式封裝分布在不同對話過程中的所有數據庫更新操作.一個SAPLUW顯式提交方式:COMMITWORT[ANDWAIT].該語句結束SAPLUW並觸發更新工作過程,該過程在同一個數據庫LUW中進行更新操作,因而數據庫LUW此時可以替代SAP開始進行一致性控制.這些進行更新工作的FUNCTION可以被設為同步(加ANDWAIT)或異步模式.即是否要等到更新任務完成后才繼續執行后續語句.
lPERFORM...ONCOMMIT[LEVELn].效果與上面相同,此方法更高效,但此時子程序不能傳遞參數.LEVEL表示優先級,n取整數.n越小越先執行.
lROLLBACKWORK.控制SAPLUW整體返回,在實現SAPLUW更新功能的FUNCTION或子程序內部不能使用此語句及COMMIT語句.
TABLESSPFLI.
DATAFLAG.
SPFLI-CARRID='LH'.SPFLI-CONNID='1245'.
SPFLI-CITYFROM=............
INSERTSPFLI.
IFSY-SUBRC<>0.
FLAG='X'.
ENDIF.
SPFLI-CARRID='AA'.SPFLI-CONNID='4574'.
SPFLI-CITYFROM=............
INSERTSPFLI.
IFSY-SUBRC<>0.
FLAG='X'.
ENDIF.
................
IFFLAG='X'.
ROLLBACKWORK.
ELSE.
COMMITWORK.
ENDIF.
6.5.2SAP數據鎖定
用SE11創建一個鎖定對象(lockobject).激活它時會自動同時生成兩個FUNCTION:ENQUEUE_<LOCKOBJECT>及DEQUEUE_<LOCKOBJECT>,調用這兩個功能模塊時可以分別鎖定或解除鎖定對象.被鎖定的對象只有在解除鎖定之后才可以被其它應用讀取或寫入.鎖定模式:
l共享锁定(shared):该模式允许多个用户访问指定表行,但只能读访问.任何时候都不允许写访问。
l排他锁定(exclusive,notcumulative):该模式允许单个用户对指定表行进行读和写访问。其它用户不能访问该行。
l扩展排他锁定(exclusive,cumulative):该模式避免具有读写访问权限的单个用户获得对相同表行集的进一步锁定。当使用递归例程更新时,该模式很有用。
激活锁定对象导致系统生成用于锁定和解锁对象的特殊功能模块。这些功能模块称为:
调用ENQUEUE/DEQUEUE功能模块
ENQUEUE_<lock-object-name>'用于锁定对象DEQUEUE_<lock-object-name>'用于解锁对象
运行时,在试图读或写之前可以锁定该数据库对象。要锁定对象,请在第一屏幕的PAI事件中调用功能模块ENQUEUE_<lock-object-name>。要解锁此对象,请调用DEQUEUE_<lock-object-name>。
ENQUEUE/DEQUEUE参数
ENQUEUE/DEQUEUE功能模块有下列参数集:
?arg和x_arg(ENQUEUE和DEQUEUE)
这两个EXPORTING参数,存在于锁定参数的每个字段arg中。将arg设置为所需的关键字字段值。如果该字段不需要特殊值,则忽略arg参数,或者将其设置为字段的初始值。如果要将字段的初始值作为实际选择值,请将x_arg设置为‘X’。
?_SCOPE(ENQUEUE)
如果事务不调用更新任务功能,则只在对话任务中更新。应该使用相应的DEQUEUE功能直接释放锁定。
如果调用任意的V1更新任务功能,请设置参数_SCOPE以告知系统应该如何释放SAP锁定。可能的值为:
1该值用于创建更新任务中不需要的锁定。在整个对话任务处理中保持使用_SCOPE=1设置的锁定,但该锁定并不能用于任意的更新任务请求。要保证不将锁定保持超过必要的时间,在事务结束时应该直接释放它(通过相应的DEQUEUE功能)。
在ROLLBACKWORK时释放:系统不释放使用_SCOPE=1设置的锁定。在编制反转程序时,请使用DEQUEUE功能。
2该值用于创建下列锁定:
-在更新任务触发之前在对话任务中使用
-一旦已经触发了更新任务,则只在更新任务中使用。
这意味着在COMMITWORK已经触发更新任务之后,如果该任务继续运行,则锁定不再可用于对话任务事务。系统在V1更新任务处理结束之后(或者在下一ROLLBACKWORK)释放锁定。
如果不指定_SCOPE,该值就是缺省值。不需要将DEQUEUE用于使用_SCOPE值创建的锁定。但是,如果_SCOPE=2,并且不调用更新任务功能,则不触发更新任务而且系统不释放锁定。
在ROLLBACKWORK释放:如果在提交前发生反转,则系统释放使用_SCOPE=2设置的锁定。在提交之后,锁定保持到更新任务处理结束。
3使用该值创建以下锁定:
-在触发更新任务之前在对话任务中使用
-在触发更新任务之后,由对话任务和更新任务使用。
也就是说,对话任务程序继续使用该锁定,甚至该更新任务功能正在运行时也是如此。在这种情况下,锁定由对话事务和更新任务功能所“共有”。
在V1更新任务处理之后的某个时刻系统释放锁定。但是,应该直接释放锁定(通过相应的DEQUEUE函数)以确保尽可能早地释放。
在ROLLBACKWORK释放:一旦已经触发更新任务,则使用_SCOPE=3设置的锁定有两个独立的所有者。要删除锁定,必须在对话任务和更新任务两方同时删除此锁定。如果在提交前发生反转,则在更新任务方释放锁定,但是对话任务方仍然保留它。如果在提交后发生反转,则系统在双方都不释放该锁定。在这种情况下,必须使用DEQUEUE功能在对话方直接释放该锁定。更新任务方将自动释放锁定。
如果用户在事务完成前已经退出了该事务(例如通过“/n”)或者程序异常终止,则系统释放所有锁定。V2功能也不能继承对话任务所创建的锁定。
?_WAIT(只ENQUEUE)
此EXPORTING参数告知:如果即将锁定的对象已经由其它用户锁定,ENQUEUE是否应该等待。如果要等待则将_WAIT设置为'X'。在这种情况下,系统试图以指定时间长度的重复间隔锁定该对象。如果这些尝试失败,则ENQUEUE导致FOREIGN_LOCK例外。
如果程序不想等待,则将_WAIT设置为其它任何值。在这种情况下,ENQUEUE导致FOREIGN_LOCK例外,并且将系统字段SY-MSGV1设置为已经拥有该锁定的用户名。
ENQUEUE例外
在调用ENQUEUE功能模块之后,应该检查在程序中该对象是否已经锁定。在功能模块中定义了下列例外:
?FOREIGN_LOCK
其它用户已经锁定了对象。系统字段SY-MSGV1包含该用户名。
?SYSTEM_FAILURE
一般系统错误。
6.5.3用戶權限檢查
(1)事務運行權限
(2)程序運行權限
(3)程序內部權限檢查
首先用T-CODE:SU21創建授權對象.
AUTHORITY-CHECKOBJECT‘object’
ID‘field_name1’FIELDf1
ID‘field_name2’FIELDf2|ID‘field_name’DUMMY
6.6其它數據操作形式
6.6.1文件接口
l創建邏輯文件名及路徑名(解決平台相關性問題):FILE.
l獵取當前平台可識別的文件名:FILE_GET_NAME
(1)處理應用服務器文件
1.打開文件:OPENDATASETdsn<options>.打開成功時sy-subrc返回0,否則返回8.如果未指定路徑,系統將在應用服務器上SAP系統運行目錄中打開文件.
<options>用于指定打開模式:
lFORINPUT:讀取方式,如果文件不存在則忽略此命令.如果文件己打開,操作指針將復位到文件的起始位置.
lFOROUTPUT:寫入方式,如果文件不存在則創建文件,如果文件存在但處于關閉狀態則刪除其內容,如果文件存在且己打開,指針復位.
lFORAPPEND:附加方式,如果文件不存在則創建文件,如果文件存在則打開文件同時將指針定位到文件末尾,SY-SUBRC總是返回0.
lFORTEXTMODE:文本模式,讀取或寫入數據時,數據逐行傳輸,系統假定文件具有行結構,如果要將字符串寫入文件或己知現有文件是基于行結構的格式,則應用使用此模式.
lFORBIANARYMODE:二進制模式,讀取或寫入數據時系統逐字節地傳輸數據,傳輸期間系統不解釋文件內容,在將某文件內容寫入到另一文件時,系統將傳輸源文件的所有字節,在從文件讀取到字段時,傳輸的字節數取決於目標字段的大小.
lFORPOSITIONpos:打開文件並將讀寫數據操作指針定位於位置pos,該位置從文件起始處按字節計算.
lMESSAGEmsg:系統將在變量msg中放置相關操作系統消息.要進行錯誤處理,應與通過該選項和系統字段SY-SUBRC返回值一起接收完整的錯誤消息.
lFILITERfilt:該選項與操作系統相關,對于UNIX或者NT系統,可以通過將系統指令置於filt中執行.如在讀取之前將文件用windows指令解壓縮.
2.關閉文件:CLOSEDATASETdsn.只有在寫入文件前要刪除當前文件內容時,才有必要關閉文件.
3.刪除文件:DELETEDATASETdsn.刪除成功SY-SUBRC返回0,否則返回4.
4.TRANSFERfTOdsn[LENGTHlen].將數據對象f的值寫入文件dsn.字段f可以是基本數據類型,或者不包含作為內表組件的結構體,文件寫入模式由OPENDATASET語句在打開時指定的,如果沒有打開,系統將嘗試用二進制方式打開,或使用上一個OPENDATASET語句的模式,LENGTH指定傳輸數據的長度,如果f的長度大于len則截斷,否則填充空格,如果文件以文本模式打開,則每個TRASFER語句中,系統向文件中傳輸除結尾空格之外的所有字節,並在其后作結束標記.
5.從文件中讀取數據:READDATASETdsnINTOf[LENGTHlen].在讀取前應用OPENDATASET語句指定傳輸模式,讀取成功SY-SUBRC返回0,讀到文件末尾返回4,不能打開時返回8,如文件以二進制模式打開,可用LENGTH指定傳輸長度,如文件以文本模式打開,則每個READDATASET語句中,系統將讀取下一個行結束標記之前的所有數據.
REPORTz_file_test.
PARAMETERSfile(30)TYPEcDEFAULT'\tmp\myfile'.
DATA:wa_sflightTYPEsflight,
sflight_tab_1LIKETABLEOFwa_sflight,
sflight_tab_2LIKETABLEOFwa_sflight.
OPENDATASETfileFOROUTPUTINBINARYMODE.
SELECT*FROMsflightINTOwa_sflight.
TRANSFERwa_sflightTOfile.
APPENDwa_sflightTOsflight_tab_1.
ENDSELECT.
CLOSEDATASETfile.
OPENDATASETfileFORINPUTINBINARYMODE.
DO.
READDATASETfileINTOwa_sflight.
IFsy-subrc<>0.
EXIT.
ENDIF.
APPENDwa_sflightTOsflight_tab_2.
ENDDO.
CLOSEDATASETfile.
IFsflight_tab_1=sflight_tab_2.
MESSAGEi888(sabapdocu)WITH'OK'.
ENDIF.
該程序在應用服務器的\tmp目錄中創建了一個文件myfile存儲程序內表中的數據,SAP應用服務器文件及目錄可以通過事務AL11(SAPDirectories)進行瀏覽.
(2)處理展示服務器文件(用戶端本機)
1.下載文件到本機FUNCTION:DOWNLOAD或WS_DOWNLOAD,其中DOWNLOAD在下載時會顯示用戶對話框.
2.上傳文件到程序FUNCTION:UPLOAD或WS_UPLOAD,其中UPLOAD在文件上傳時會顯示用戶對話框.
3.獲取展示服務器上文件和操作系統信息FUNCTION:WS_QUERY.
6.6.2數據簇操作
(1)ABAP/4內存中的數據簇
1.在ABAP/4内存中存储数据对象
EXPORT<f1>[FROM<g1>]<f2>[FROM<g2>]...TOMEMORYID<key>.
此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM<gi>,则将数据对象<fi>存储到自己的名称之下。如果使用该选项,则将数据对象<gi>存储到<fi>下面。
注:ID<key>用于标识内存数据,不得超过32个字符.EXPORT语句总是完全改写ID<key>相同的任何现有数据簇的内容.对于有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常情况下,语句将表名解释为表工作区
2.从内存中读取数据对象
IMPORT<f1>[TO<g1>]<f2>[TO<g2>]...FROMMEMORYID<key>.
此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO<gi>,则将内存中的数据对象<fi>赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象<fi>写入字段<gi>中。ID<key>用于标识内存数据,不得超过32个字符。
不必读取存储在特定ID<key>下的所有对象。相反,可以从名称<fi>中进行选择。如果内存中不包含指定ID<key>下的对象,则将SY-SUBRC设置为4。但是,如果内存中存在带此ID的数据簇,无论数据对象<fi>是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象<fi>,则目标字段保持不变。
此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。
3.删除内存中的数据簇
FREEMEMORY[ID<key>].如果不附加ID<key>,则此语句删除整个内存,包括此前用EXPORT存储到ABAP/4内存中的所有数据簇。附加ID<key>之后,该语句只删除用此名称命名的数据簇。
(2)數據庫中的數據簇
1.簇數據庫的結構:
建立簇数据库的规则如下所述。必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。
1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。3.下一字段类型为CHAR,长度可变。它包含簇的名称<key>,存储数据簇时,在程序中用EXPORT语句的附加ID指定了该簇。因为后面的字段要对齐,所以系统应最多使用3个未用字节填充在字段RELID的结尾。如果创建自己的簇数据库,应该相应地定义此字段的长度。
4.下一字段必须名称为SRTF2,类型为INT4,长度为4。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有2**31行。字段SRTF2包含存储的数据簇内行的顺序号码,可以是0和2**31-1之间的任何值。存储数据簇时,系统自动填写此字段(参见第7点)。
5.SRTF2的后面可以是任何数目的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段。必须在程序中的EXPORT语句之前将值显式分配到这些字段。通常包含诸如程序名、用户ID等控制信息。
6.行上的倒数第二个字段名称必须为CLUSTR,类型为INT2,并且长度必须为2。它包含后面的字段CLUSTD中的数据长度。存储数据簇时,系统自动填写此字段。
7.行上的最后一个字段必须名称为CLUSTD,类型为VARC。其长度可以任意,但通常为1000个字节左右。存储数据簇时,系统按压缩格式用实际数据填写此字段。如果CLUSTD的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段SRTF2中进行编号(参见上面的第4点)。
既可以按照上述规则创建自己的簇数据库(此时参见文档ABAP/4词典),也可以使用系统定义的簇数据库INDX
(2)在簇数据库中存储数据对象
EXPORT<f1>[FROM<g1>]<f2>[FROM<g2>]...
TODATABASE<dbtab>(<ar_id>)[CLIENT<cli>]ID<key>.
此语句将列表中指定的数据对象存储为簇数据库<dbtab>中的簇。必须用TABLES语句对<dbtab>加以声明。如果不附加FROM<gi>,则将数据对象<fi>存储在自己的名称之下。如果有附件项,则将数据对象<gi>存储到名称<fi>之下。
l<ar_id>是存储数据库的簇的两字符区域ID。
l<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。
l在处理特定客户的簇数据库时可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
lEXPORT语句也将表工作区<dbtab>的用户字段内容传输到数据库表。根据需要,可以预先填写这些字段。
在具有相同名称<key>的相同工作区<ar>和相同客户系统<cli>中,EXPORT语句总是完全改写任何现有数据簇的内容。对于含有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常将表名解释为表工作区
(3)创建数据簇目录表
IMPORTDIRECTORYINTO<dirtab>
FROMDATABASE<dbtab>(<ar>)
[CLIENT<cli>]ID<key>.
此语句在存储于数据库<dbtab>中的数据簇中创建一系列数据对象,并将其放到表<dirtab>中。必须使用TABLES语句声明<dbtab>。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句
<ar>是即将存储数据库的簇的两字符ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。在处理特定客户的簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。
IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。如果可以创建某个目录表,则把SY-SUBRC设置为0。否则,设置为4。
(4)从簇数据库中读取数据对象
IMPORT<f1>[TO<g1>]<f2>[TO<g2>]...
FROMDATABASE<dbtab>(<ar>)
[CLIENT<cli>]ID<key>|MAJOR-ID<maid>[MINOR-ID<miid>].
此语句从数据库<dbtab>中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明<dbtab>。如果不附加TO<gi>,则将数据库的数据对象<fi>分配给程序中的同名数据对象。如果不附加此选项,则将数据库的数据对象<fi>写入字段<gi>。
<ar>是即将存储数据库的簇的两字符区域ID。<key>标识数据库中的数据,其最大长度取决于<dbtab>中名称字段的长度。可以用MAJOR-ID<maid>代替附加ID<key>。然后,就选定名称的第一部分与<maid>相符的数据簇。如果指定具有MAJOR-ID的附加MINOR-ID<miid>,则选择名称的第二部分(也就是<maid>长度之后的位置)大于或等于<miid>的数据簇。在处理特定客户簇数据库时,可以使用选项CLIENT<cli>关闭自动客户处理,然后自己指定客户。必须在输入数据库名之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区<dbtab>的用户字段内容。
不必读取存储在特殊名称<key>之下的所有对象,但可以使用名称<fi>作出选择。如果数据库不包含具有指定关键字<ar>、<key>和<cli>的对象,则将SY-SUBRC设置为4。但是,如果数据库中存在具有这些关键字的数据簇,那么,无论是否存在数据对象<fi>,SY-SUBRC之值总是为0。如果簇中没有数据对象<fi>,则目标字段保持不变。
运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。
(5)从簇数据库中删除数据簇
DELETEFROMDATABASE<dbtab>(<ar>)[CLIENT<cli>]ID<key>.
此语句删除数据库表<dbtab>中区域为<ar>和名称为<key>的整个数据簇。必须用TABLES语句对<dbtab>进行声明。
列表中雙擊行的交互事件:atline-selection.
53.對話程序運行時觸發事件:load-of-program.
54.leavetolist-processing:離開屏幕處理同時進入報表列表處理(如選擇屏幕).
55.系統內表SCREEN保存了屏幕元素的各種屬性.
例如:將一個屏幕字段由可以將接受輸入狀態改為顯示狀態:
LOOPATSCREEN.Bestregards,
Ifscreen-name=‘mod’.
screen-input=‘0’.
Modifyscreen.
Endif.
Endloop.
56.流邏輯事件:
PROCESSBEFOREOUTPUT(PBO):用戶與屏幕交互前事件.
PROCESSAFTERINPUT(PIO):用戶與屏幕交互后事件.
PROCESSONHELP-REQUEST(POH):查詢幫助信息(或F1鍵)事件.
PROCESSONVALUE-REQUEST(POV):查詢幫助按鈕(或F4鍵)事件.
57.流邏輯語句:
PROCESS
MODULE:
FIELDf:PAI中屏幕字段f的值在此語句后才傳給abap程序.
ON:
VALUES:
CHAIN
ENDCHAIN:
CALL:
LOOP:
58.屏幕調用語句:
1.SETSCREENnext_screen_number:為當前屏幕指定后續屏幕.不會自動返回當前屏幕.
2.CALLSCREENscreen_number及CALLTRANCTIONtcode:挂起當前屏幕序列,進入新屏幕(序列)或事務.在新的屏幕序列中,通過語句LEAVESCREENTOSCREEN0調用的屏幕就能夠返回到挂起的屏幕序列上.(返回到原程序)
3.LEAVESCREEN:如果需要未完成當前屏幕控制流就要轉入后續屏幕,使用此語句.
4.LEAVETOSCREENscreen_number及LEAVETOTRANCTIONtcode:未完成當前屏幕就要轉入后續屏幕.不返回原有程序.
59.CALLSCREENdynnrSTARTINGATx1y1ENDINGATx2y2:將調用的屏幕作為彈出對話框,(x1,y1)及(x2,y2)分別為左上角和右下角的橫縱坐標.
60.中止當前屏幕並返回到調用點:
LEAVETOSCREEN0.
或
SETSCREEN0.
LEAVESCREEN.
61.中止當前屏幕並進入新屏幕:
LEAVETOSCREENdynnr
或
SETSCREENdynnr
LEAVESCREEN.
62.將GUI狀態連接到屏幕:SETPF-STATUSstat.
63.設置屏幕標題:SETTITLEBARstat.
64.類型為E的PAI模塊:類型為E的GUI狀態元素被觸發時將直接調用流邏輯中PAI中的語句:MODULEmodATEXIT-COMMAND.(無條件調用).
65.模塊條件調用:
1.FIELDfMODULEmodONINPUT:當字段f的值不是初始值時才調用mod.
2.FIELDfMODULEmodONREQUEST:只有用戶在字段f中輸入值時(包含空值和原值)才調用mod.
3.組合字段條件調用:
CHAIN.
FIELD:f1,f2,…
MODULEmod1ONCHAIN-INPUT|CHAIN-QEQUEST.
FIELD:g1,g2,…
MODULEmod2ONCHAIN-INPUT|CHAIN-QEQUEST.
…
ENDCHAIN.
當fi之一滿足條件時,mod1被調用,當fi或gi滿足條件時,mod2被調用.
CHAIN.
FIELD:f1,f2.
FIELD:f3MODULEmod1ONINPUT.
ENDCHAIN.
只有f3包含非初始值時才調用mod1.
CHAIN.
FIELD:f1,f2.
FIELD:f3MODULEmod1ONCHAIN-INPUT.
ENDCHAIN.
f1,f2,f3中任一字段包含非初始值時都調用mod1.
注:條件調用也將使值被延遲傳輸.
66.輸入檢查:
單個字段輸入檢查:
PROCESSAFTERINPUT.
FIELDspfli-airpfrom.
MODULEcheck_fr_airport.
MODULEcheck_fr_airportINPUT.
SELECTSINGLE*FROMsairportWHEREid=spfli-airpfrom.
Ifsy-subrcNE0.
MESSAGEe003WITHspfli-airpfrom.
ENDIF.
ENDMODULE.
字段spfli-airpfrom將進行有效性檢查.
多個字段輸入檢查:
PROCESSAFTERINPUT.
CHAIN.
FIELD:spfli-carrid,spfli-connid.
MODULEcheck_flight.
ENDCHAIN.
MODULEcheck_flightINPUT.
SELECTSINGLE*FROMspfli
WHEREcarrid=spfli-carrid
ANDconnid=spfli-connid.
Ifsy-subrcNE0.
MESSAGEe005WITHspfli-carridspfli-connid.
ENDIF.
…
ENDMODULE.
spfli-carrid,spfli-connid二者之一出現錯誤時系統都觸發錯誤信息,需重新輸入
67.F1和F4幫助:
F1幫助:
1.數據字典幫助:
PCOCESSONHELP-REQUEST.
FIELDfWITHdocnum.
自行設計對話模塊,通過代碼設計幫助文檔:
PCOCESSONHELP-REQUEST.
FIELDfMODULEmod.
功能模塊HELP_OBJECT_SHOW可以顯示任意SAPScrip文本,
68.程序定義輸入幫助:
PROCESSONVALUE-REQUEST.
FIELDfWITHmod.
DYNP_VALUE_READ:讀取屏幕字段當前值.
DYNP_VALUE_UPDATE:選擇了幫助列表中的字段后,對該字段進行更新.
F4IF_INT_TABLE_VALUE_REQUEST:定義輸入幫助FUNCTION,將內表的形式的值列表顯示給用戶並返回用戶選擇的值.
69.上下文菜單:
在屏幕元素屬性對話框中填充ON_CTMENU字段,同時創建同名子程序
FORMon_ctmenu_<field>USINGl_menuTYPEREFTOcl_ctmenu.
CALLMETHODl_menu->add_function
EXPORTINGfcode=‘DISY’
Text=‘displaydetails’.
CALLMETHODl_menu->add_function
EXPORTINGfcode=‘CLAR’
Text=‘Clearall’.
ENDFORM.
當在屏幕相應字段上單擊右鍵並選擇相應的菜單時,程序調用PAI事件,同時將此子程序中設定的功能代碼傳遞給OK_CODE字段.而不是屏幕中設定的功能代碼,所以一定要注意此處的功能代碼要與屏幕中的功能代碼設置為一致.
70.下拉列表框:
在屏幕的流邏輯中定義字段的下拉列表(POV事件):
PROCESSONVALUE-REQUEST.
FIELDsexMODULEmod.
然后定義mod:
MODULEmodINPUT.
SELECTcarridcarrnameFROMscarr
INTOCORRESPONDINGFIELDSOFTABLEitab_carrid.
CALLFUNCTION'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield='CARRID'
value_org='S'
TABLES
value_tab=itab_carrid
EXCEPTIONS
parameter_error=1
no_values_found=2
OTHERS=3.
ENDMODULE.
71.表格控件:是SAP的標準控件,是一種平台無關的軟件元素,定義方式如下:
CONTROLSctrlTYPEctrltype.
SY-STEPL:表格控件中當前操作的屏幕行號.
SY-LOOPC:當前表格控件在屏幕中總行數.
72.屏幕中的傳統列表:
調用基本列表輸出所有WRITE語句中的內容,方法是在某個對話模塊中使用下列語句:LEAVETOLIST-PROCESSING[ANDRETURNTOSCREEN<scr>].scr為0時可返回到調用初始點.
要離開列表自理過程,可以按BACK,EXIT或CANCEL或者使用下列語句:
LEAVELIST-PROCESSING.