SAPABAP语法整理.docx

上传人:b****3 文档编号:10243845 上传时间:2023-05-24 格式:DOCX 页数:45 大小:100.21KB
下载 相关 举报
SAPABAP语法整理.docx_第1页
第1页 / 共45页
SAPABAP语法整理.docx_第2页
第2页 / 共45页
SAPABAP语法整理.docx_第3页
第3页 / 共45页
SAPABAP语法整理.docx_第4页
第4页 / 共45页
SAPABAP语法整理.docx_第5页
第5页 / 共45页
SAPABAP语法整理.docx_第6页
第6页 / 共45页
SAPABAP语法整理.docx_第7页
第7页 / 共45页
SAPABAP语法整理.docx_第8页
第8页 / 共45页
SAPABAP语法整理.docx_第9页
第9页 / 共45页
SAPABAP语法整理.docx_第10页
第10页 / 共45页
SAPABAP语法整理.docx_第11页
第11页 / 共45页
SAPABAP语法整理.docx_第12页
第12页 / 共45页
SAPABAP语法整理.docx_第13页
第13页 / 共45页
SAPABAP语法整理.docx_第14页
第14页 / 共45页
SAPABAP语法整理.docx_第15页
第15页 / 共45页
SAPABAP语法整理.docx_第16页
第16页 / 共45页
SAPABAP语法整理.docx_第17页
第17页 / 共45页
SAPABAP语法整理.docx_第18页
第18页 / 共45页
SAPABAP语法整理.docx_第19页
第19页 / 共45页
SAPABAP语法整理.docx_第20页
第20页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

SAPABAP语法整理.docx

《SAPABAP语法整理.docx》由会员分享,可在线阅读,更多相关《SAPABAP语法整理.docx(45页珍藏版)》请在冰点文库上搜索。

SAPABAP语法整理.docx

SAPABAP语法整理

1、ST05是用于在开发ABAP程序时,对应事务码取得的字段是“数据结构”而不是“透明

表”的时候,通过ST05的“SQL跟踪”来获得相关“Select”的语句;一般查看“REC列耗时比较多的“Select”语句;

2、跟踪时如果有涉及到“数量”这类有对数据表进行更新或插入操作的,则直接去查Update和Insert的SQL语句;

3、在跟踪后,直接双击“对象名”列的名称,点选“表格”转到“SE11的表字段表;

4、ABAP程序开头的Tables:

“数据表名”,只有在屏幕中有用到的表,才需要声明;在程序中用到的表则不需要进行在Tables声名;

5、抓SAP“文本”字段的数据,要先自定义变量,然后通过SE37的函数

“FUNCTIONZREAD_TEX「取回文本数据;

6、新建的ABAP程序,在测试运行的时候要先进行“激活”,才能测试运行;

7、SE93:

把ABAP写好的程序指定一个事务码执行;

8、abap引号的字符’’必须要是大写;

9、ABAPselect里面的语句,不能像mssql有那么丰富的函数使用,需要导到表后再对数据进行操作;

10、’EQ是单个数据值,’BT'是between区间的意思。

11、在写selectinnerjoin里面,要注意是否需要加上销售组织的条件;on条件1and销售组织条件。

12、SELECTION-SCREEN里面有两个子项,PARAMETER®select-options。

PARAMETER一般是用于必输项的屏幕参数设置,如果这个参数不是必输项的,就要用select-options。

在select...where条件里,用PARAMETER的条件语法是“数据字段=屏

幕字段”;而select-options的条件语法是“数据字段in屏幕字段”。

13、在where判断一个日期型数据是空,不是DEAKT=’’,也不是DEAKTisinitial,而

应该写成DEAKT=’00000000'(8个0)。

14、一对多的innerjoin,如果取出的数据有重复,前面加上distinct,用法和MSSQ相目

同。

15、sy-subrc,指上一个语句执行是否成功;执行成功返回0,执行不成功返回非0。

用if判断。

16、如果一个语句中,该名称同时可能代表表或者同名表工作区,则需要在表名称之

后加“[]”指明当前操作的是表对象。

不提倡使用带有表头行的表,而是应该总是声明结构

相同的其他数据对象作为显示工作区进行表行操作。

如何调整ABAP程序的性能(copy)

1、使用where语句不推荐

Select*fromzflight.

Check:

zflight-airln='LF'andzflight-fligh=‘BW222.

Endselect.

推荐

Select*fromzflightwhereairIn='LF'andfligh='222'.

Endselect.

2、使用聚合函数不推荐

Maxnu=0.

Select*fromzflightwhereairIn=‘LF'andtry='IN'.

Checkzflight-fligh>maxnu.

Maxnu=zflight-fligh.

Endselect.

'IN'

推荐

Selectmax(fligh)fromzflightintomaxnuwhereairln=‘LF'andtry=

3、使用视图代替基本表查询

不推荐

Select*fromzcntrywheretrylike'IN%.[Page]

Selectsingle*fromzflightwheretry=zcntry-cntryandairln=‘LF'

Endselect.

推荐

Select*fromzcnflwheretrylike'IN%andairln='LF'.

Endselect.

4、使用INTOtable代替selectendselect

不推荐

Refresh:

int_fligh.

Select*fromzflightintoint_fligh.

Appendint_fligh.Clearint_fligh.

Endselect.

推荐

Refresh:

int_fligh.

Select*fromzflightintotableint_fligh.

5、使用批量修改表代替逐行修改

不推荐

Loopatint_fligh.

Ifint_fligh-flagisinitial.

Int_fligh-flag=‘X'.

Endif.

Modifyint_fligh.

Endloop.

推荐

Int_fligh-flag=‘X'.

Modifyint_flightransportingflagwhereflagisinitial.

6、使用二分法查询,提高查询表数据速度

不推荐

Readtableint_flighwithkeyairIn=‘LF'.

推荐

Readtableint_flighwithkeyairIn=‘LF'binarysearch.

7、两个表添加使用批量增加代替逐行

不推荐

Loopatint_fligh1.

Appendint_fligh1toint_fligh2.

Endloop.

推荐

Appendlinesofint_fligh1toint_fligh2.

8、使用tablebuffering

Useofbufferedtablesisrecommendedtoimprovetheperformaneeconsiderably.The

bufferisbypassedwhileusingthefollowingstatementsSelectdistinct

Select…forupdate

Orderby,groupby,havingclause

JoinsUsetheBypassbufferadditiontotheselectclauseinordertoexplicitlybypassthebufferwhileselectingthedata.

9、使用FORALLEntries

不推荐

Loopatint_cntry.Selectsingle*fromzflighintoint_flighwheretry=int_cntry-cntry.Appendint_fligh.Endloop.

推荐

Select*fromzflighappendingtableint_fligh

Forallentriesinint_cntryWheretry=int_cntry-cntry.

10、正确地使用where语句,使查询能使用索引Whenabasetablehasmultipleindices,thewhereclauseshouldbeintheorderoftheindex,eitheraprimaryor

asecondaryindex

Tochooseanindex,theoptimizerchecksthefieldnamesspecifiedinthewhereclause

andthenusesanindexthathasthesameorderofthefields.OnemoretipisthatifatablebeginswithMANDT,whileanindexdoesnot,thereisahighpossibilitythattheoptimizermightnotusethatindex.

11、正确地使用MOV/句

Insteadofusingthemove-correspondingclauseitisadvisabletousethemovestatementinstead.Attemptshouldbemadetomoveentireinternaltableheadersinasingleshot,ratherthanmovingthefieldsonebyone.

12、正确地使用innerjoinLetustakeanexampleof2tables,zairlnandzflight.

Thetablezairlnhasthefieldairln,whichistheairlinecodeandthefieldInnam,

whichisthenameoftheairline.Thetablezflighthasthefieldairln,theairlinecodeandotherfieldswhichholdthedetailsoftheflightsthatanairlineoperates.

[Page]

Sincethese2tablesarelogicallyjoinedbytheairlnfield,itisadvisabletousetheinnerjoin.

Selecta~airlna~lnnamb~flighb~cntryintotableint_airdetFromzairlnasainnerjoinzflightasbona~airln=b~airln.Inordertorestrictthedataaspertheselectioncriteria,awhereclausecanbeaddedtotheaboveinnerjoin.

13、使用sortby代替orderby

14、避免使用SELECTDISTINCT语句

使用的ABAPSORT+DELETEADJACENTDUPLICATE代替.

定义表与工作区最方便的方法

*定义名为ITAB的表,表结构参照表TABLE。

DATA:

ITABTYPETABLEOFTABLE.

*定义名为WA的工作区,其行结构与表ITAB相同

DATA:

WALIKELINEOFITAB.

1.使用occurs0,定义的不再是对象,而是internaltable

2.使用withheaderline后缀,定义为internaltable的同时也定义了一个同名对象,因

此可以用以下语句:

LOOPATSTH.

WRITE:

/STH.

ENDLOOP.

3.TYPE后面接结构,LIKE后面接对象

4.OBLIGATORY为必输字段

5.DATASEPARATER.=DATASEPARATERTYPEC.

6.关于表的结构描述,它的当前记录数据是放在headerline中的‘Occurs是分配数据缓冲区,大小不重要,系统会自动分配。

但定义表不用occurs就需要用withheaderline,occurs语句记得是为了向下兼容。

7.occurs指明的數量是有一點學問的

1.當你知道可能每次用Select命中或交換的紀錄數xxx時,可指明occursxxx.

2.如用occurs0聲明時,buffers由系統自動分配.

8.SELECT在into时记得一般都要加上table,不然是into一个工作区,即wa,而工作区要写入表,则需要再append,所以直接定放表即可,表和工作区的区别就在于工作区就相

当于表头,是有一行,data定义beginofitab时不加occurs就是工作区,加了就是表,

occurs*,后面表示系统初始分配给此表多少行,每次满时再多分配多少行,我们平常为了节约存,一般直接用0,withheaderline是为了定义含表头的表,平常occurs就直接带表头,而withheaderline一般是在itab1likeitaboccurs0withheaderline时用,

这是参照一个表定义另一表,如果要带表头,一定要加withheaderline。

你这样问不是办法,最好不懂时直接接F1,查到SAP的帮助即可.check是检查后面的逻缉

是否满足,不满足则在上例是跳出form,不的执行下面的语句。

说实在,初略的看了一下上面的程序,写得太烂了,竟然将usr01或usr03透明表中

的字段按条件取到一个表工作区,竟然不加single,象这种不加single的select按理说

应该是调不过的,必须在后面再对应一个endselect,而这种select加endselect用每次去读一次透明表,访问数据库的次数太多了,换个好一点程序自己研究吧。

P(4)长度4个字节

Xstring(10)长度为10个字节,可以容纳20个数字

大结构体与小结构体的兼容

Move大to小大的覆盖小的大结构体的剩余部分保持不变

Move小to大匹配的部分被小的覆盖,其余的字段被初始化

P类型与F类型的优缺点

P:

计算精确,适合商业结算,但围短

F:

储存围大,计算不精确

P与F类型的运算方式

FIEEE用二进制数进行运算

P采用半字节储存一个数字的方式进行运算

字段结构体兼容问题

1.字段兼容:

类型和长度相同

2.结构体:

字段按顺序兼容,并且字段数相同

3.表兼容:

行类型相同,KEY兼容,表类型相同

如果字符串move到一个比字符串小的结构体,

[][][][]---a[][]

[][]

一个字段move到一个表中

Internaltable表.

1.静态数据对象包括:

简单数据类型(除了string和xstring类型),结构体(不包

含string和xstring类型)

2.动态数据对象:

string,xstring,包含string或xstring的结构体,表

一个结构体是否可以包含STRING或xstring,如果可以结构体可以拓展吗?

定义一个只有一个字段的表字段长度是c(18),

定义一个结构体结构体里包含三个字段,类型随意,第二个类型,是另一个结构体

定义一个表表的行类型是第一个结构体.

再用第二个结构体定义一个表,利用这个表作为行类型,做一个表

表的三个基本属性

1.linetype行类型

2.keydefinition键类型

3.tablekind表类型

1)在standardtable中使用tablekey的查找方式为tablescan全表扫描

2)在sortedtable中使用tablekey在遵循;left-aligned从左至右匹配,no

gaps没有间隔,使用”=”填充字段时,使用二分查找法,其它情况下使用tablescan查找

3)对hash表访问,只能通过key访问单条记录,访问的速度不依赖于表中的数据量而在其余两种表中,查询的时间与表中数据量成正比

其它情况是否代表,只是顺序不符合left-aligned.哈希表可以通过部分的key进行

访问吗?

定义表

1.定义一个局部表类型,通过该类型定义表变量

2.直接定义字段直接定义表变量(隐藏了一个表类型)

3.通过全局表类型定义表变量

标准的定义表语句

TypesorDATAname

TYPEtable_kind

OFline_type

WITHkey_def

[INITIALSIZEn.]

Tablekindandkey.表类型和表键

注意:

在定义standard类型的表时,如果使用WITHDEFAULTKEY.系统会自动将表中的字符类型字段(c,n,d,t,x,string,xstring)组合成tablekey.

表的key

1.standard标准表:

key不唯一.

2.sorted排序表:

可以指定KEY是否唯一

3.Hash哈希表:

KEY必须是唯一

在表中使用不是结构体类型的行类型

当表的行类型只有一列的时候,需要使用pseudo-compnent伪列,

用途:

设置一个按钮工具栏,用只含有一列的表.

对表的操作

1.move对表的拷贝

2.clear将数据清空

3.free释放存

pare表之间的操作,比较

5.sort排序表

6.arrayfetch

递归比较

1.先对表之间的行数进行比较

2.如果有必有的话,还需要对行的组件进行比较

表之间的比较

用行数比较,有必要的话可以用容比较

定义两个表两个表不兼容一个有3个字段一个有5个

对两个表进行比较•

定义两个表,结构一样,变量不一样

全做成数字型字段

第一个添加小数字

第二个表添加大数字

排序可以指定升序降序•

对表具体操作

1.1nsert插入

2.Read读取

3.Change修改

4.Delete删除

5.

插入累计

Insertsummatedcollect.

对表中的数据行进行限制条件操作

对数据的访问

一、单条数据访问

1)通过tablekey访问

3)通过condition条件访问

 

指定访问数据的传输方式

1.使用结构体workarea进行copy对表数据进行操作

2.定义fieldsymblo指针指向访问数据,(可以直接访问数据)

3.通过将表插入表的操作

重要:

不能通过lineindex对hash表进行访问,在排序表中插入数据•除非插入的位置正好是排序表中规定的位置,否则会出现运行期异常(强烈不推荐使用insert往sortedb表中插入数据)

Fieldsymbol指针

作用:

直接对表进行操作,而不用再重新定义结构体对目标表数据进行拷贝,增大了

效率.

定义指针语法:

Data:

var_aTYPEIVALUE4.

FIELD-SYMBOLS:

TYPEi.

ASSIGNvar_aTO.

=77.

重要:

定义的指针名,必须加”<>”

Insert插入操作

一、单条数据的插入操作

1)标准表:

可以使用index(推荐)和tablekey方式插入

2)排序表:

可以通过tablekey方式插入,但也可以用index插入(强烈不推荐,很有可能出现运行错误)

3)Hash表:

只能够用tablekey方式插入

二、多条记录的插入

1)源表为indextable:

则可以指定源表的数据围,并插入到目标表中

2)目标表为indextable:

则可以可以指定目标表被插入数据的具体index位置.

具体的语句插入语法:

InsertwaINTOTABLEitab.单条插入不指定位置

InsertwaINTOitabINDEXn.单条插入指定插入位置

INSERTLINESOFitabl

[fromn1ton2]

INTOTABLEitab2.

INTOitab2[INDEXn]

读取表的一条将数据读到结构体中

如果系统独到行sy-subrc=0.然后读取到结构体中,

Sy-tfill存放总行数

Sy-tleng行的长度

Transporting

指定特定列传输字段,传送部分字段

TRANSPORTINGNOFields不传值,作用,看表中有没有这条数据

Camparing

有一个结构体和表

C1C2C3

Lh001917

Lh001818

通过comparing后的值,可以判断读取的值是否符合要求

现在结构体中需要比较的字段赋值,

先判断相应字段是否相等

回去做个练习

比较成功sy-subrc=0

Zmycompare_2009

用一个结构作为查询条件,

到表查询符合条件的数据

Withkey可以用tablekey或普通字段作为条件

使用fieldsymbol

通过一个表定义一个结构体作为指针

Readtableitab[indexn/key]assigning.

Write:

/-field_1.

直接修改的值会怎么样?

Change修改表

Transporting的传输方向

通过fieldsymbol

直接修改表

重要:

不能直接指针对sorted和hash表进行操作

Delete

Deletetableitabkey

Key:

fromwa()

Withtablekeyk1=fl…

不能用sort对排序表进行排序

对sorted表进行insertmodify,使用不当可能会出错

HASF表不能通过index进行操作

Headerline

Withheadline关键字定义废弃用法

Occur+整数,10,

Occur0,默认大小,

Occur0withheadline废弃用法了

重要:

在面向环境中不能用带有headline的表

Data:

so_carrLIKERANGEOFcarrid.

Loop表

Where条件从起始点二分查找

标准表可以部分指定顺序

From1to5

对于一个标准表来说,加上二分查找是不是先排序

先把标准表排序,然后再二分

必须先手工排序,再进行二分查找

sapabapprogramming---关于ABAP表(aboutabapinternaltable)

1.表的类型及定义:

(1).ANYTABLE:

即任意表类型,此种定义方式只能在传递参数的时候定义。

例如:

FORMXXXUSING/CHANGINGTYPEANYTABLE.

(2).ANYTABLE包括了两种类型:

INDEXTABLE和HASHEDTABLE

《1》.INDEXTABLE:

包括了STANDARDTABU®SORTEDT

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2