ABAP基础语法学习笔记_第1页
ABAP基础语法学习笔记_第2页
ABAP基础语法学习笔记_第3页
ABAP基础语法学习笔记_第4页
ABAP基础语法学习笔记_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ABAP基础学习笔记学前说明:ABAP/4每条语句以句号结束;ABAP/4中象=,>,<,+,-,*,/等符号左右都需要有至少一个空格,否则报错;整行注释用’*’号,星号要放当前行的第一个才有效,注释本行后面部分用’”’号;一、基本数据类型:TypeLengthRangeInitialValueDescriptionC11-65535ByteSpace字符串数据,如’Program’D88Byte‘00000000’日期数据,格式为YYYYMMDDF88Byte0浮点数I4-2^31至2^31-10整数N11-65535Byte‘00…0’数值所组成的字符串P81-16Byte0Packed数,用在小数点数T66Byte‘000000’时间数据,格式为HHMMSSX11-65535ByteX’00’16进位数例:C:字符(串),长度为1,最大有65535BYTES,初始值为:space,例:‘M’;D:日期,格式为YYYYMMDD,最大是’9999/12/31’,例:’1999/12/03’.F:浮点数,长度为8,例如:4.285714285714286E-01I:整数范围:-2^31~2^31-1N:数值组成的字符串:011,‘302’.P:packed数,用于小数点数值,例如:12.00542;T:时间,格式为HHMMSS,例如:’14:03:00’,’21:30:39’.X:16进制数,例如‘1A03’.二、变量的声明:变量宣告包含name,length,type,structure等,语法如下:DATA<F>[<length>]<type>[<value>][<decimals>]其中:[]里的内容表示可选项。<f>:变量名称,最长30个字符,不可含有+,.,:() 等字符;<length><type>:长度及变量类型;<value>:初值<decimals>:小数位数例如:DATA:C1TYPEC, INT1TYPEIVALUE1, TEMPTYPEPDECIMAL2.DATA后面的冒号表示后面声明多个变量,如果只有一个变量也可以写成:DATAC1TYPEC.TYPE也是用来声明变量的,与DATA差不多,不过TYPE不能直接给变量赋值。例如:TYPES:INT1TYPELIKE的使用:TYPESTEMPLIKESY-TCODE.(即声明变量TEMP的类型与SY-TCODE的类型一样,当你不知道后面变量是什么类型时好用)STRUCTUREDATA:BEGINOFMAN, NAME(20)TYPEC, PHONE(11)TYPEN, ENDOFMAN.结构在后面说到的内表里有说到。常量的声明:CONSTANTS临时变量的声明:STATICS例:CONSTANTSP1TYPEPDECIMALS5VALUE‘3.14159’.三、系统专用变量说明:系统内部专门创建了SYST这个STRUCTURE,里面的字段存放系统变量,常用的系统变量有:SPACE:空格。SY-SUBRC:系统执行某指令后,表示执行成功与否的变量,’0’表示成功SY-UNAME:当前使用者登入SAP的USERNAME;SY-DATUM:当前系统日期;SY-UZEIT:当前系统时间;SY-TCODE:当前执行程序的Transactioncode(事务代码)SY-INDEX:当前LOOP循环过的次数SY-TABIX:当前处理的是internaltable(内表)的第几笔SY-TMAXL:Internaltable的总笔数SY-SROWS:屏幕总行数;SY-SCOLS:屏幕总列数;SY-MANDT:CLIENTNUMBERSY-VLINE:画竖线SY-ULINE:画横线SY-UCOMM屏幕指针状态USREFUS当前用户表格还有其他系统变量,可以输入事务代码:SE11查询系统表SYST四:WRITE用于在屏幕输出内容(相当于JAVA里的system.out.print())。例如:WRITE:‘USERNAMEIS:’,SY-UNAME.指定输出位置的语句格式为:WRITE:[AT][/][<pos>][(<len>)]资料项[<par>]其中:/:表示在下一行输出<pos>:指定输出的列号(跟输出多少个空格有点像);(<len>):指定输出位数(长度)<par>:指定显示格式参数,参数有:LEFT-JUSTIFIED资料靠左对齐CENTERED数据靠中间对齐RIGHT-JUSTIFIED资料靠右对齐UNDER<g>正对在资料项<g>的下面显示NO-GAP紧接着显示,不留空格USINGEDITMASK<m>:使用给定格式显示,如12:03:20USINGNOEDITMASK:不使用内嵌子元NO-ZERO:数字前面0的部分不显示NO-SIGN:不显示正负号DECIMALS<d>:显示<d>位小数EXPOENT<e>:F(浮点数)指数的值ROUND<r>:四舍五入至小数点后<r>位CURRENCY<c>:币别显示DD/MM/YY:日期显示格式MM/DD/YY:YY/MM/DD:YY/DD/MMMM/DD/YYYY:DD/MM/YYYYYYYY/MM/DD:YYYY/DD/MM:例如1:WRITE:/10(6)‘ABCDEFGHIJK’.输出结果为:ABCDEF例如2:DATA:XTYPEIVALUE’11:20:30’,Y(5)TYPECVALUE‘ABCDE’.WRITE:/XUSINGEDITMASK‘__:__:__’.WRITE:/XUSINGEDITMASK‘$___,___’.WRITE:/YNO-GAP.输出结果为:1$112,030ABCDEF显示图示:语法:WRITE:<symbol-name>ASSYMBOL.WRITE:<icon-name>ASICON.例如:INCLUDE<SYMBOL>.INCLUDE<ICON>.WRITE:/‘Phonesymbol:’,SYM_PHONEASSYMBOL.WRITE:/‘AlarmIcon:’,ICON_VOICE_OUTPUTASICON.要查看系统所提供有那些符号及图标,可选择’模式’下的’write’确定后,接下来选择要查看的群组,如SYMBOL或ICON.跳过指定空白行进行输出:SKIP5.(跳过五行空白)SKIPTOLINE5.(跳到第五行)WRITE:‘AAAAAA’.结果自己去试试就知道了。五:INTERNALTALBE(内表)的声明及使用ABAP/4中的InternalTable是一种DataStructure,类似于其它语言中的STRUCTURE,它可以由几个不同类型的字段(field)组成,用来表示具有不同属性的某一事物,单独一笔资料表示某个事物,多笔数据表示具有相同属性的多个事物.例如:为了存取或记录某班的同学数据,我们创建如下的internaltable:DATA:BEGINOFSTUDENTOCCURS20,STD_IDTYPEN,NAME(10)TYPEC,AGETYPEI,BIRTHTYPED,SCORETYPEPDECIMALS2,ENDOFSTUDENT.此时我们已经创建了名叫STUDENT的internaltable,并且为它预先申请了能够存放20笔数据的Buffer(当然,如果存取数据不止20笔,程序执行时,会自动申请系统Buffer)Internaltable的定义有以下几种格式:格式一.DATA:BEGINOF<internaltable>OCCURS<n>,<field1>TYPE<type1>,[<field2>TYPE<type2>,<field3>TYPE<type3>,…]ENDOF<internaltable>.格式二.TYPES:BEGINOF<workarea>,<field1>TYPE<type1>,[<field2>TYPE<type2>,<field3>TYPE<type3>,…]ENDOF<workarea>.TYPES<internaltable>TYPE<workarea>OCCURS<n>.格式三.DATA:BEGINOF<workarea>.INCLUDESTRUCTURE<tablename>.DATA:ENDOF<workarea>.DATA:<internaltable>LIKE<workarea>OCCURS<n>.APPENDLINE格式:APPEND[<workarea>TO]<internaltable>.举例一.(使用workarea)DATA:BEGINOFLINE,COL1TYPEI,COL2TYPEI,ENDOFLINE.DATAITABLIKELINEOCCURS10.DO2TIMES.LINE-COL1=SY-INDEX.LINE-COL2=SY-INDEX**2.APPENDLINETOITAB.ENDDO.LOOPATITABINTOLINE.WRITE:/LINE-COL1,LINE-COL2.ENDLOOP.执行结果为:14举例二.(不使用workarea)DATA:BEGINOFITABOCCURS10,COL1TYPEI,COL2TYPEI,ENDOFITAB.DO2TIMES.ITAB-COL1=SY-INDEX.ITAB-COL2=SY-INDEX**2.APPENDITAB.ENDDO.LOOPATITAB.WRITE:/ITAB-COL1,ITAB-COL2.ENDLOOP.执行结果与举例一相同.举例三.(加入另一个Internaltable的元素)格式:APPENDLINESOF<itab1>[FROM<n1>][TO<n2>]TO<itab2>.将<itab1>的元素加入至<itab2>中,可选取自<n1>至<n2>的范围.APPENDLINESOFITABTOJTAB.COLLECTLINECOLLECT指令也是将元素加入Internaltable中,与APPEND的区别是:COLLECT指令在非数值字段相同的情况下,将数值字段汇总.格式:COLLECT[<workarea>INTO]<itab>DATA:BEGINOFITABOCCURS3,COL1(3)TYPEC,COL2TYPEI,ENDOFITAB.ITAB-COL1=‘ABC’.ITAB-COL2=10.COLLECTITAB.ITAB-COL1=‘XYZ’.ITAB-COL2=20.COLLECTITAB.ITAB-COL1=‘ABC’.ITAB-COL2=80.COLLECTITAB.此时,internaltable中放的是2笔数据,分别为:ITAB-COL1ITAB-COL2‘ABC’90‘XYZ’20INSERTLINE将元素插入在指定的internaltable位置之前.格式:INSERT[<wa>INTO][INITIALLINEINTO]<itab>[INDEX<idx>]或者:INSERTLINESOF<itab1>[FROM<n1>TO<n2>]INTO<itab2>INDEX<idx>其中:<wa>即workarea,工作区中的元素.[INITIALLINEINTO]:插入一笔初始化的记录.<itab>:internaltable[INDEX<idx>]:internaltable的记录号.(新加入的元素放在此记录前面)读取internaltable格式一:LOOPAT<itab>[INTO<wa>][FROM<n1>TO<n2>][WHERE<conditions>]<statement>ENDLOOP.格式二:READTABLE<itab>[INTO<wa>][INDEX<idx>/WITHKEY<conditions>]举例.(格式二)DATA:BEGINOFITABOCCURS10,COL1TYPEI,COL2TYPEI,ENDOFITAB.DO10TIMES.ITAB-COL1=SY-INDEX.ITAB-COL2=SY-INDEX*2.APPENDITAB.ENDDO.READTABLEITABINDEX3.(或者:READTABLEITABWITHKEYCOL1=3.)WRITE:/‘ITAB-COL1=‘,ITAB-COL1,‘ITAB-COL2=‘,ITAB-COL2.执行结果同样是:ITAB-COL1=3ITAB-COL2=6.修改internaltable中的值格式:MODIFY<itab>[FROM<wa>][INDEX<idx>][TRANSPORTING<f1><f2>…][WHERE<conditions>]举例一.READTABLEITABINDEX3.LINE-COL1=29.MODIFYITABFROMLINETRANSPORTINGCOL1.将第三笔记录的COL1字段的值修改为29.举例二.T_SALARY–salary=50.MODIFYT_SALARYTRANSPORTINGsalaryWHEREbirthday=‘1999/12/06’.DELETEinternaltable中的字段格式:DELETE<itab>INDEX<idx>.或:DELETE<itab>[FROM<n1>TO<n2>][WHERE<conditions>]Internaltable排序SORT<itab>[<orderway>][BY<f1><f2>…]其中:<orderway>有DESCENDING和ASCENDING,Default为ASCENDING.<f1>:为指定排序的字段.加总SUM.总和计算存放与workarea中,但只能在LOOP中使用.例:LOOPATITABINTOLINE.SUM.ENDLOOP.WRITE:/LINE-COL1,LINE-COL2.初始化internaltableREFRESH<itab>.清空<itab>中的值.CLEAR<itab>.清空<itab>的HeaderLine.FREE<itab>.释放记忆体空间.赋值之MOVE的使用语法:MOVE<F1>TO<F2>将F1的值存至变数F2中,也可写成F2=F1使用Offset语法:MOVE<F1>[+<O1>]TO<F2>[+<O2>]Example:DATA:F1(10)VALUE‘ABCDEFGHIJ’.F2(5).F2=F1+3(5).“自第4个位置开始取出5个字符F2的内容会变成DEFGH语法:MOVE–CORRESPONDING<Strings1>TO<String2>.将Strings1中的field组件的数据复制至String2中,仅复制相同名称的组件Example:DATA:BEGINOFADDRESS,FIRSTNAME(10)VALUE‘LULU’,LASTNAME(10)VALUE‘CHOU’,TEL(12)VALUE‘4660570’,ENDOFADDRESS.DATA:BEGINOFNAME,FIRSTNAME(10),LASTNAME(10),E_MAIL(30),ENDOFNAME.MOVE-CORRESPONDINGADDRESSTONAME.NAME-FIRSTNAME变成‘LULU’,NAME-LASTNAME变成‘CHOU’,而NAME-E_MAIL则不变在变量的使用上,可以使用类似CallByValue的方法语法:WRITE(<f>)TO<g>Example:DATA:NAME(20)VALUE‘SOURCE’,SOURCE(10)VALUE‘LILY’,TARGET(10).WRITE(NAME)TOTARGET.WRITE/TARGET.屏幕可印出LILY注意,NAME一定要用小括号括起,否则打印的是SOURCE(这种用法有实际运用价值吗…)算术运算符及运算符号:**乘幂*乘/除+加-减DIV整数除法MOD余数除法数值函数ABS(N):传回数值N的绝对值SIGN(N):1ifN>0ifN=0-1ifN<0CEIL(N):传回大于数值N的最小整数Example:WRITECEIL(-5.65)印出–5.00WRITECELL(4.54)印出5.00FLOOR(N):传回小于数值N的最大整数Example:WRITEFLOOR(-5.65)印出–6.00WRITEFLOOR(4.54)印出4.00TRUNC(N):传回数值N的整数部分Example:WRITETRUNC(5.65)印出5.00FRAC(N):传回数值N的小数部分Example:WRITEFRAC(5.65)印出0.65COS(A),SIN(A),TAN(A):传回三角函数cosA,sinA,tanA的值,A为弪度量8.EXP(N):传回e^N值LOG(N):传回logeN值LOG10(N):传回logN值10.SQRT(N):传回N的平方根值日期与时间运算1.日期数据的运算日期数据可以直接运算,如加法与减法的运算Example:DATA:MdataTYPED.Mdate=SY-DATUM.“如传回19971015Mdate+6(2)=‘01’“Mdate变成19971001Mdate=Mdate-1“Mdate变成199709312.时间数据的运算时间格式为‘hhmmss’,如‘212030’表’21:20:30’Example:DATA:HOURSTYPEI,MINUTESTYPEI,T2TYPETVALUE‘200000’,T1TYPETVALUE‘183000’.HOURS=(T2-T1)/3600.“计算有几小时MINUTES=(T2–T1)/60.“计算几分钟字符串数据处理1.字符串移位语法:SHIFT<c>[BY<n>PLACES][<modes>]<modes>:(1).空白,字符串往左移一位(2).LEFT,字符串往左移n位(3).RIGHT,字符串往右移n位(4).CIRCULAR:字符串以环状方式移位Example:DATASTRING(10)VALUE‘ABCDEFGHIJ’.SHIFTSTRING.“得到BCDEFGHI’SHIFTSTRINGBY2PLACESRIGHT.“得到ABCDEFGH2.取代字符串内容语法:REPLACE<string1>WITH<string2>INTO<c>将字符串<c>中的<string1>以<string2>来取代Example:DATA:STRING(10)VALUE‘ABCDEFGHI’,STR1(3)VALUE‘DEF’,STR2(3)VALUE‘123’.REPLACESTR1WITHSTR2INTOSTRING.WRITE/STRING.“得到ABC123GHI3.大小写的转换语法:TRANSLATE<c>TOUPPERCASE.“转成大写TRANSLATE<c>TOLOWERCASE.“转成小写4.在字符串中寻找部分字符串语法:SEARCH<c>FOR<str>Example:DATASTRING(10)VALUE‘ABCDEFGHIJ’.会回存至两个变数,SY-SUBRC和SY-FDPOS,若找到则SY-SUBRC为0SY-FDPOS存开始位迭,若找不到则SY-SUBRC为4,SY-FDPOS为05.字符串长度STRLEN(<c>)Example:INT=STRLEN(‘XYZABC’).“得到6INT=STRLEN(‘ABC’).“得到36.取部分字符串<f>[+<o>][<l>]Example:DATAT(10)VALUE‘ABCDEFGHIJ’.WRITE/T+2(4).“得到CDEF比较符号1.=或EQ:等于2.<>或><或NE:不等于3.<或LT:小于<=或LE:小于等于>或GT:大于>=或GE:大于等于AND:且OR:或NOT:非语法之条件判断--IF语法:IF<Condition1>.<Statement1>ELSEIF<Condition2>.<Statement2>ELSEIF<Condition3>.<Stetement3>…..ELSE.<elseStatement>ENDIF.(1).在每个判断叙述之后要加上.Example:IF3>8.WRITE/‘3islessthan8’.ENDIF.条件选择--CASECASE<变量f>.WHEN<Value1>.<Statement1>WHEN<Value2>.<Statement2>….WHENOTHERS.<othersStatement>ENDCASE.Example:S=‘A’.CASES.WHEN‘X’.WRITE/‘StringisX’.WHENOTHERS.WRITE/‘StringisnotX’.ENDCASE.循环DO[nTIMES][VARYING<f>FROM<start>TO<end>.<loopblock>ENDDO.Example:DO2TIMES.WRITE/‘X’.ENDDO.执行结果:XX

DOVARYINGIFROM1TO10.S=S+I.ENDDO.WRITE:/,’1+2+3+…+10=’,S执行结果:1+2+3+…+10=55(没试成功,直接报语法错误)2.条件循环语法:WHILE<Condition>.<StatementBlock>ENDWHILEExample:I=1.S=0.WHILEI<=10.S=S+I.I=I+1.ENDWHILE.WRITE:/‘1+2+3+…+10=’,S.执行结果为:1+2+3+…+10=55循环控制CONTINUE跳至循环的下一次(即不执行本次循环)Example:DO3TIMES.IFSY-INDEX=2.CONTINUE.WRITE/SY-INDEX.ENDDO.执行结果:13CHECK<Condition>CHECK之后条件成立才继续往下执行循环Example:DO5TIMES.CHECKSY-INDEXBETWEEN2AND4.WRITE/SY-INDEX.ENDDO.执行结果:234EXIT跳出循环Example:DO10TIMES.IFSY-INDEX=4.EXIT.ENDIFWRITE/SY-INDEX.ENDDO.执行结果:123六、屏幕输入命令在ABAP/4中要从屏幕输入变量,使用的命令是PARAMETERS及SELECTION-OPTIONS:1.PARAMETER:输入一个变量2.SELECTION-OPTIONS:使用条件筛选画面来输入数据一.PARAMETERS指令基本的输入命令,类似如BASIC的INPUT命令,但无法使用F格式(浮点数)语法:PARAMETERS<p>[DEFAULT<f>][LOWERCASE][OBLIGATORY][ASCHECKBOX][RADIOBUTTONGROUP<rad>]Example:PARAMETERS:NAME(8),AGETYPEI,BIRTHTYPED.执行结果:可以看出,PARAMETERS后面默认是文本框的格式在日期的输入格式上为MM/DD/YY,MM/DD/YYYY,MMDDYY或MMDDYYYY,如输入020165表1965年02月01日,与02/01/65的输入是一样的,日期输入范围为公元1950年至2049年DEFAULT设定输入的默认值Example:PARAMETERS:COMPANY(20)DEFAULT‘DELTA’, BIRTHTYPEDDEFAULT‘19650201’.2.LOWERCASEABAP/4预设是将字符串输入值自动转换为大写,加上此参数会将输入的数据转成小写,3.OBLIGATORY强制要求输入,屏幕上会出现一个勾,使用者必须要输入才可.PARAMETERS:

A

OBLIGATORY.

PARAMETERS:

B

OBLIGATORY.4.ASCHECKBOX输入CHECKBOX的格式Example:PARAMETERS:TAXASCHECKBOXDEFAULT‘X’,NTDASCHECKBOX.执行结果:5.RADIOBUTTONGROUP<rad>输入RADIOBUTTONGROUP的方式Example:PARAMETERS:BOYRADIOBUTTONGROUPSEXDEFAULT‘X’,GIRLRADIOBUTTONGROUPSEX.执行结果:注:单选框复选框里面‘X’表示选中,其他则都表示不选中二.SELECT-OPTIONSSELECT-OPTIONS所输入的值实际上是放在internaltable中的,该Internaltable有四个字段,分别是:SIGN,OPTION,LOW,HIGH..条件筛选检查条件输入画面指令,输入条件后可配合SELECT指令自TABLE读取符合条件的数据,直接执行或放入InternalTable中,条件有四个参数:

Select-options定义的内表重要:

Select-options内表具有表头行该内表有4个字段1.

Sign符号标示取值:I(included被包含),E(excluded不被包含).2.

Option操作

取值:BT(between在范围之间),EQ(equal等于)3.

Low最小值

取值:用户输入的最小值4.

High最大值

取值:用户输入的最大值语法:SELECT-OPTIONS<check-option>FOR<table-field>Example:TABLESSPFLI.SELECT-OPTIONSAIRLINEFORSPFLI-CONNID.将条件的输入值存放入AIRLINE,筛选选择为SPFLI中的CONNID字段执行结果:可直接输入起始范围或按下选择画面,输入完后按下左上角的执行键.select-options运行原理1.

程序运行后,select-options创建的内表中没有数据2.

屏幕弹出后,用户输入数据3.

此时,系统将字段范围保存到该内表中4.

用户确定屏幕后,系统将内表中的信息翻译成对应的nativeSQL5.

数据库将符合用户输入范围的数据返回给用户改变输入格式:DEFAULT<begin>TO<end>设定开始结束范围输入默认值Example:SELECTION-OPTIONAIRLINEFORSPFLI-CONNIDDEFAULT‘2042’TO‘4555’.DEFAULT‘2042’TO‘4555’设定不要NOINTERVALS设定不要区间范围输入画面LOWERCASE输入转换成大写OBLIGATORY强制要求输入配合SELECT使用:条件输入完后要将符合条件的数据筛选出来,可配合使用SELECT指令使用WHERE<条件式>SPFLI是系统里自带的例表,SPFLI-CONNID表示表里的某个字段Example:SELECT-OPTIONSAIRLINEFORSPFLI-CONNID.SELECT*FROMSPFLIWHERECONNIDINAIRLINE.WRITE:/CONNID,FROMCITY,TOCITY.ENDSELECT.2.使用CHECK参数Example:SELECT-OPTIONSAIRLINEFORSPFLI-CONNID.SELECT*FROMSPFLI.CHECKAIRLINE.WRITE:/CONNID,FROMCITY,TOCITY.ENDSELECT.3.使用IF…IN叙述Example:SELECT-OPTIONSAIRLINEFORSPFLI-CONNID.SELECT*FROMSPFLI.IFSPFLI-CONNIDINAIRLINE.WRITE:/CONNID,FROMCITY,TOCITY.ENDIFENDSELECT.ABAP里面语句基本上是开闭原则,即:SELECT。。。。ENDSELECT。但也不全是。选择屏幕:1.产生空白列语法:SELECTION-SCREENSKIP[<n>]Example:SELECTION-SCREENSKIP2.产生两列空白列2.产生底线语法:SELECTION-SCREENULINE/<pos>(length)Example:SELECTION-SCREENULINE/10(30).自第10格开始产生长度30的底线3.显示备注说明语法:SELECTION-SCREENCOMMENT/<pos>(length)<name>Example:REMARK=‘Plsenteryourname’.SELECTION-SCREENCOMMENT/10(30)REMARK.4.同一行中输入数个数据项语法:SELECTION-SCREENBEGINOFLINE.……SELECTION-SCREENENDOFLINE.Example:SELECTION-SCREENBEGINOFLINE.SELECTION-SCREENPOSITION20.PARAMETERSNAME(10).SELECTION-SCREENPOSITION40.PARAMETERSBIRTHTYPED.SELECTION-SCREENENDOFLINE.在20格输入NAME内容,40格输入BIRTH的内容结果如下:5.绘出BLOCKPANEL语法:SELECTION-SCREENBEGINOFBLOCK<block>[WITHFRAME[TITLE<title>].…….SELECTION-SCREENENDOFBLOCK<block>.Example:SELECTION-SCREENBEGINOFBLOCKRADIOWITHFRAME.PARAMETERR1RADIOBUTTONGROUPGR1.PARAMETERR2RADIOBUTTONGROUPGR1.PARAMETERR3RADIOBUTTONGROUPGR1.SELECTION-SCREENENDOFBLOCKRADIO.数据库SQL我们在编写ABAP4程序的时候,经常需要从TABLE中根据某些条件读取数据,.读取数据最常用的方法就是通过SQL语法实现的.ABAP/4中可以利用SQL语法创建或读取TABLE,SQL语法分为DDL(DATADEFINELANGUAGE)语言和DML(DATAMULTIPULATIONLANGUAGE)语言,DDL语言是指数据定义语言,例如CREATE等,DML语言是数据操作语言,例如SELECT,INSERT等语句.SQL语句有OPENSQL语句和NATIVESQL语句.OPENSQL语句不是标准SQL语句,是ABAP/4语言,利用OPENSQL语句能在Databases和Command之间产生一个BUFFER,所以它有一个语言转换的过程.而NATIVESQL语句则是标准的SQL语句,它直接针对Databases操作.OPENSQLOPENSQL语句包含有:SELECT,INSERT,UPDATE,MODIFY,DELETE,OPENCURSOR,FETCH,CLOSECURSOR,COMMITWORK,ROLLBACKWORK等.1.SELECT语句语法格式:SELECT<result>[INTO<target>][FROM<source>][WHERE<condition>][GROUPBY<fields>][ORDERBY<sortorder>]其中:<result>指定要抓取(查询)的字段<target>将读取的记录存放在workarea中<source>指定从那个TABLE中读取数据<condition>抓取(查询)的条件<fields>指定按那些字段分组<sortorder>排序的字段及方式相关的系统变量:SY-SUBRC=0表示读取数据成功<>0表示未找到符合条件的记录SY-DBLNT:被处理过的记录的笔数.相关的命令:EXIT.退出循环.CHECK<logisticstatement>.如果逻辑表达式成立,则继续执行,否则,开始下一次循环..利用循环方式读取所有记录SELECT….ENDSELECT.是循环方式读取记录的.例如:TABLESMARD.SELECT[DISTINCT]*FROMMARDWHEREMATNR=‘3520421700’.<Statements>.ENDSELECT.(从MARD中抓取所有料号=3520421700的数据)◆读取一笔数据TABLESMARD.SELECTSINGLE*FROMMARDWHEREMATNR=‘3520421700’.(从MARA中抓取一笔料号=3520421700的资料)将读取的记录放在workarea中,并且加入Internaltable中.格式有:...INTO<workarea>...INTOCORRESPONDINGFIELDSOF<workarea>...INTO(f1,...,fn)变量组....INTOTABLE<internaltable>...INTOCORRESPONDINGFIELDSOFTABLE<internaltable>...APPENDINGTABLE<internaltable>...APPENDINGCORRESPONDINGFIELDSOFTABLE<internaltable>举例一:TABLESMARD.DATA:BEGINOFITABOCCURS10,MATNRLIKEMARD-MATNR,WERKSLIKEMARD-WERKS,LGORTLIKEMARD-LGORT,LABSTLIKEMARD-LABST,ENDOFITAB.SELECTMATNRWERKSLGORTLABSTINTOCORRESPONDINGFIELDSOFITABFROMMARDWHEREMATNR=‘3520421700’.APPENDITAB.CLEARITAB.ENDSELECT.(将读取的结果放在InternaltableITAB中)举例二.TABLESMARD.SELECTMATNRMTARTMAKTXINTO(t_matnr,t_mtart,maktx)FROMMARDWHEREMATNR=‘3520421700’.<Statements>.ENDSELECT.(从MARD中抓取料号=3520421700的料号、类型和描述,放在变量t_matnr,t_mtart,maktx中)。◆按指定的字段排序TABLESSBOOK.SELECT*FROMSBOOKWHERECARRID=‘LH’ANDCONNID=‘0400’ANDFLDATE=‘19950228’ORDERBYBOOKID[ASCENDING/DESCENDING].WRITE:/SBOOK-BOOKID,SBOOK-CUSTOMID,SBOOK-CUSTTYPE,SBOOK-SMOKER,SBOOK-LUGGWEIGHT,SBOOK-WUNIT,SBOOK-INVOICE.ENDSELECT.(利用参数ORDERBY所指定的字段排序)抓取数据的条件叙述BETWEEN<g1>AND<g2>例如:WHEREYEARBETWEEN1995AND2000.LIKE<g>例如:WHERENAMELIKE‘MIKE%’.(‘%’是通配符号)IN(<g1>…<gn>)是<g1>…<gn>里面的任意一个值即可.例如:WHEREPLANTIN(‘CHUNGLI’,‘TAOYUAN’,’LIUTU’).(表示PLANT只要是’CHUNGLI’或’TAOYUAN’或’LIUTU’都可以).2.INSERT语句从workarea加入到InternalTable中格式:INSERTINTO<database>VALUES<workarea>例如:DATA:BEGINOFWA,CODE(6)TYPEC,NAME(30)TYPEC,ENDOFWA.DATA:VENLIKEWAOCCURS10.…WA-CODE=‘530120’.WA-NAME=‘XINGDAELECTRONICSCO.,LTD’.INSERTINTOVENVALUESWA.如果workarea的名称就是internaltable的名称,可以直接写成:INSERT<internaltable>例如:DATA:BEGINOFWAOCCURS10,CODE(6)TYPEC,NAME(30)TYPEC,ENDOFWA.…WA-CODE=‘530120’.WA-NAME=‘XINGDAELECTRONICSCO.,LTD’.INSERTWA.从另外一个Internaltable中INSERT数据格式:INSERT<itab1>FROMTABLE<itab2>[ACCEPTINGDUPLICATEKEY]将<itab2>中非NULL的数据加入<itab1>中,加上[ACCEPTINGDUPLICATEKEY]能限制相同PRIMARYKEY不重复加入.MODIFY语法MODIFY<internaltable>[FROM<workarea>].根据PrimaryKey寻找数据文件中符合的记录,若找到则更新数据,若找不到则新增记录语法:MODIFY<database>FROM<wa>Example:WA-NO=’34051920’.WA-COMPANY=’DELTA’.MODIFYSPFLIFROMWA.4.UPDATE语法1.使用PrimaryKey语法:UPDATE<database>FROM<wa>Example:TABLESSPFLI.DATAWALIKESPFLI.WA-NO=’34051920’.WA-COMPANY=’DELTA’.UPDATESPFLIFROMWA.如SPFLI的PrimaryKey是NO,则会找到NO=’34051920’的记录,将其COMPANY字段异动为DELTA2.使用条件式语法:UPDATE<database>SET<f1>=<values>…WHERE<condition>根据条件式异动符合条件式的记录Example:UPDATESPFLISETNO=’34051920’COMPANY=‘DELTA’WHERETEL=’4526107’.5.DELETE语法DELETE<internaltable>[FROM<workarea>].或:DELETE<internaltable>[WHERE<conditions>]DATABASECURSORDatabaseCursor是一个数据库暂存区,将经SELECT指令读取的记录存放至此暂存区,再由此暂存区放至WorkArea中,可减少数据库读取的次数.1.开启DatabaseCursor语法:OPENCURSOR<c>FORSELECT…WHERE<condition>Example:TABLESSPFLI.DATA:WALIKESPFLI,C1TYPECURSOR.OPENCURSORC1FORSELECT*FROMSPFLIWHEREAREA=’TAIWAN’.2.读取DatabaseCursor的数据存入WorkArea语法:FETCHNEXTCURSOR<c>INTO<wa>Example:FETCHNEXTCURSORC1INTOWA.读取下一笔Cursor位置的数据存入WA,如果已无数据可读,SY-SUBRC<>0.关闭DatabaseCursor语法:CLOSECURSOR<c>Example:CLOSECURSORC1.7.COMMITWORK&ROLLBACKWORK要确定数据成功写入数据库,可使用COMMITWORK指令,如:COMMITWORK.相反的,如果反悔要复原,可使用ROLLBACKWORK,可复原在上个COMMITWORK指令之后的数据,如:ROLLBACKWORK.§使用NATIVESQL指令语法格式:EXECSQL[PERFORMING<form>].<statements>ENDEXEC.举例一.EXECSQL.CREATETABLEAVERI_CLNT(CLIENTCHAR(3)NOTNULL,ARG1CHAR(3)NOTNULL,ARG2CHAR(3)NOTNULL,FUNCTIONCHAR(10)NOTNULL,PRIMARYKEY(CLIENT,ARG1,ARG2))ENDEXEC.举例二.DATA:F1(3),F2(3),F3(3).F3='1'EXECSQL.SELECTCLIENT,ARG1INTO:F1,:F2FROMAVERI_CLNTWHEREARG2=:F3ENDEXECPERFORMING<formname>的使用:如果NATIVESQL的SELECT命令执行结果是抓到多笔记录,我们想要逐笔记录处理时,就用PERFORMING参数,这个FORM能被逐次调用.如果想中止调用,就用EXITFORMSQL结束调用.例如:DATA:F1(3),F2(3),F3(3).F3='010'EXECSQLPERFORMINGWRITE_AVERI_CLNT.SELECTCLIENT,ARG1INTO:F1,:F2FROMAVERI_CLNTWHEREARG2=:F3ENDEXEC.FORMWRITE_AVERI_CLNT.WRITE:/F1,F2.ENDFORM.注意:NATIVESQL把TABLE中的MANDT(client)字段当作一般字段使用,所以在抓取数据时必须指定特定的Client;NATIVESQL中的SELECT语句没有CHECK权限的功能;在登入SAPR/3系统时,我们已经自动与Database连接,所以在执行NATIVESQL时并不需要CONNECT语句;一条NATIVESQL语句可以以分号;结束,一般情况下是以句号.结束.某些数据库系统对TABLE名字和FIELD名字有大小写区别,要正确书写.在NATIVESQL中,双引号”不表示注释.ABAP/4PROGRAMMODULEABAP/4中的Module类似于其它语言中的子程序,通常是先定义后调用.主程序传给Module所需要的参数,然后Module返回主程序所需要的值.当然,ABAP/4中也有’传值’和’传址’两种参数传递方式.Macroblock(宏)宏(Macroblock)包括宏定义语句和宏调用语句.宏定义的格式:DEFINE<macro>.<macrostatements>.END-OF-DEFINITION.宏调用的格式:<macro>[<p1><p2>…].其中:[<p1><p2>…].表示所使用的参数,参数之间要有一个空格.举例:DATA:resultTYPEI.DEFINEMULTI.result=&1*&2.WRITE:/‘&1*&2’,=result.END-OF-DEFINITION.…MULTI37.输出结果为:21.宏可以调用其它宏,但不可以调用自身.DATA:RESULTTYPEI,N1TYPEIVALUE5,N2TYPEIVALUE6.DEFINEOPERATION.RESULT=&1&2&3.OUTPUT&1&2&3RESULT.END-OF-DEFINITION.DEFINEOUTPUT.WRITE:/’Theresultof&1&2&3is’,&4.END-OF-DEFINITION.OPERATION4+3.OPERATION2**7.OPERATIONN2-N1.输出结果为:Theresultof4+3is7Theresultof2**7is128TheresultofN2-N1is1Include使用格式:INCLUDE<yixxxxxx>.作用:将某个写好的INCLUDE程序(代码)加到原程序中,在程序编译(combine)的时候,系统会自动全部展开并且编译.注意:INCLUDE程序不能传送数据.如果需要传送数据使用SUBROUTINES(FORM)或FUNCTIONMODULES.INCLUDE的调用格式.INCLUDE<INCL>.例如:REPORTzchn4062.INCLUDEyiauth00..Global变量宣告应用语法:DATA:BEGINOFCOMMONPART[<name>],<data宣告>ENDOFCOMMONPART[<name>]此常使用在Include的档案中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论