whichtableIntowhereto
Wherewhichline
需要声明一个结构体或内表
单条记录into到结构体.
多条记录into到内表.
Readingbysinglerecordaccess读取单条记录
对于java来说,sql和java互不相干.Java执行的SQL并非java元素,sql对于java来说只是简单的字符串.
Abap中的opensql是abap中的一部分.OpenSQL是基于sql的拓展
只读一条记录时,一定要加single关键字
Selectsingle*
Fromscarr
Intowa_scarr
Wherecarrid=pa_car.
重点:
无论查询结果有多少条,single读取只返回第一条记录.
Leftjustified从左到右匹配.
概念:
根据字段在表中的顺序,对where条件中的字段进行从左到右排序
Where语句中的条件顺序会影响查询性能,要遵循从左到右匹配查询.
多表查询
1.先根据多张表中所需的字段建立结构体.
2.通过这个结构体对数据进行操作
3.要使用correspondingfieldsof对字段赋值进行匹配操作.
注意:
不使用corresponding不会出异常,但拷贝结果不一定会正确
多条记录读取
Selectcarridconnidfldate
…..
Endselect.
当数据库操作执行完毕,要根据sy-subrc判断操作是否成功.
0成功
非0失败
数据库查询小节
数据库查询分两种
1.单条selectsingle
2.多条select….Endselect,arrayfetch.
多条记录查询
1.Select..endselect:
逐条读取稳定,但速度较慢
2.Arrayfetch:
把符合查询条件的记录一次性插入到内表中速度快,但不稳定(当内存不足或数据过大时,会导致内存溢出)
运行机制:
例如查询10条记录,大小10k
a)使用select--endselect方式访问,会访问10次,每次访问1k,
b)Arrayfetch将数据看成一整个数据.一次性放入到内表中
Intoclause
对同名并且类型相同的字段进行拷贝需要使用correspondingfieldsof,虽然速度较慢,但较稳定
名字相同类型不同,则拷贝不会成功.
对于client-specific表的查询
client-specific表中的第一个主键字段为mandt,作用是标识client
该查询分为两种情况
1.默认情况查询client-specific表
2.通过特定的mandt查询client-specific
默认情况查询
查询条件中没有mandt字段
Select…..fromspfli
Where(mandt=‘100’)carrid>‘LH’.
底层默认在where中加入了mandt字段作为查询条件,而此时的mandt的值为当前操作
该程序的client的值
注:
使用这种查询方法,不同的client运行该程序会极大可能的产生不同运行结果
通过特定的mandt查询client-specific
指定特定mandt
Select*fromspfli
Clientspecified
Into..
Wheremandtin(401,402)注意:
mandt一定写在第一位
AndcarridEQ‘AA’.
使用特定的mandt,系统将通过该特定mandt进行数据访问,返回结果与client无关
Secondaryindex第二索引
索引优点:
加快数据库查询速度
劣势:
索引仅对数据查询有利,对update语句(例如:
删除,插入)会降低其效率.
注意:
索引并不是越多越好,适当的索引可以加快查询效率
索引分为两类
1.第一索引(物理索引或者主索引)
该索引是基于数据库表主键所包含的所有字段创建的,有且只有一个,当主键被创建时,主索引就会被系统自动创建
2.第二索引
根据主键之外的字段所创建的索引,可以包含多字段主键的其中之一或多个作为第二索引,但不能包含主键的所有字段.
注意:
第二索引的数量应该适当,不应太多.
索引机制
在索引创建的时候,系统会自动创建相应的索引表
例如:
1)一个表中的前2个字段为主键,
2)此时系统会创建一个3个字段的索引表
3)其中包括两个主键字段和一个index字段(为了根据主键定位对应的表数据)
4)创建的索引表与数据表拥有相同的数据条数
写查询语句的时候where条件语句要遵循leftjustified机制
从左到右写入索引字段
Databaseoptimizer数据库优化器
它会根据查询操作,选择出最佳的查询方案.
Authorizationchecks权限检查
运行流程:
1)用户在选择屏幕上输入查询条件例如:
AA
2)用户确定输入
3)在数据库查询之前,ABAP程序会到数据库查看当前用户的用户主数据,查看用户是否具有对该数据进行操作的权限,如果有sy-subrc=0,如果没有权限sy-subrc=4,检查失败sy-subrc=8.
Authorizationobjectsandauthorizations.权限对象和权限
权限查询流程
1)查看用户是否又有相应权限
2)当具有查询的权限时就在if语句中对该表进行相应操作
3)如果没有权限就通过屏幕提示给用户
Authorization_checkobject:
s_carrid包含两个字段
1.Carrid:
用来指定carrid的值
2.Actvt:
activities可操作的权限类型
Actvt可取的值:
1.Create=01是否有创建的权限
2.Change=02修改权限
3.Display=03查看权限
一个权限对象可以生成多个权限
carrid:
*
Actvt:
03
用户对所有航空公司编码所对应的数据具有查看权限
carrid:
Hl
Actvt:
02
该用户可以对HL航空公司对应的数据可以更改.
Authority-check
Object‘S_CARRID’
ID‘CARRID’field‘LH’
ID‘ACTVT’field‘02’.
(查看数据库的二维表,查看权限是否存在,然后返回给sy-subrc)
Ifsy-subrcNE0.
Endif.
Dummy:
当忽略字段的值时,可以使用dummy
Authority-checkobject‘S_CARRID’
ID‘CARRID’DUMMY
ID‘ACTVT’field‘02’.
插入权限检查
点击pattern
在authority_check中输入s_carrid
ReadingLinkabledatabasetables读取多表连接
对于对表的访问有两种方式
1.静态连接:
从多中取出所需字段,根据提取的字段创建视图
2.动态连接:
在abap中使用连接语句对多表连接并读取
表连接分类
1.内连接innerjoin
2.外连接outerjoin(包含:
左外连接右外连接注:
ABAP不支持右外连接)
内连接:
innerjoin
例如:
对两个表进行内连接,将两个表中符合连接条件的记录的字段合并为一条记录,
相当于把这些符合条件的记录又重新组成了一个新表.
SELECT…
FROMspfliINNERJOINscarr
ONspfli~carrid=scarr~carrid
Where…
注:
由于多表中可能出现重复字段,索引因该使用<表名>~<字段名>进行区分
外连接:
outerjoin
左外连接:
例如:
两张表进行外连接,一张为左表,另一个为右表
当进行左外连接时,无论左表是否符合连接条件,它的字段都会在新集合中,而右表只有符合连接条件,字段才会被插入到新集合中
右外连接(abap不支持):
与左连接顺序相反,
BAPI:
businessAPI
可以理解为abap的方法
封装了select语句,可以直接使用
Logicaldatabase逻辑数据库
不是物理数据库,而是ABAP程序,可以充当数据库使用
警告:
对数据库进行插入,更新,删除,修改是很危险的.所以推荐初学者只进行查询操作
subroutines子程序
功能:
封装了程序中经常使用的代码,可以简化代码量.(相当与其他语言的方法)
子程序的定义
定义子程序interface
1.参数个数
2.参数类型
形式参数与实际参数
1)形式参数:
子程序定义中的参数
2)实际参数:
调用子程序时的参数
形式参数的三种方式
1.Call-by-value值传
2.Call-by-reference引用传
3.Call-by-value-and-result值传并带有返回值
Call-by-value值传类型
1.变量首先进行自身拷贝
2.拷贝变量被传到子程序中
3.子程序对拷贝变量的修改不会关系到原变量的变化.
Call-by-reference引用传
1.该传递会将变量的内存地址传送至子程序中
2.子程序会直接操作内存,所以源变量也会随之改变
Call-by-value-and-result值传并带有返回值
1.与值传相同,首先变量自身拷贝,并将拷贝变量传送到子程序中
2.子程序对拷贝变量修改完毕后,会将该拷贝变量重新覆盖回源变量中去
注意:
修改的值不一定每一次都返回成功.当出现异常错误时,拷贝变量将可能不会返回.
子程序的声明
在形式参数中:
USINGValue(<参数名>)值传
CHANGINGvalue(<参数名>)值传带有返回值
USING(推荐:
内表形参使用)/CHANGING<参数名>引用传
子程序定义时的参数类型:
1.简单类型:
一般类型(不可分解)
2.复合类型:
内表类型
形参的简单类型
1.指定类型:
例USINGvalue(f_1)TYPEi.
2.任意类型:
该形参可匹配任何类型例:
USINGvalue(f_1)TYPEANY.(不推荐,运行过程中很可能出现类型不一致的运行错误)
形参的复合类型
重点:
复合类型形参必须为特定类型,以访问内部的字段.
复合类型的形参推荐使用call-reference引用传作为传递类型.
例:
使用内表作为形参,当调用子程序并传递内表参数的时候,由于内表数据量相对较大,使用值传或值传带返回值都会对内表变量进行拷贝,这样会降低运行效率.
所以使用引用传可以避免拷贝过程以提高效率.
但是引用传会使内表被修改.
因此推荐将该引用传参数写在USING关键字后,以提醒编程人员不要轻易修改.
重点:
在子程序中定义的变量,只有在子程序中才有效
而在主程序中的变量,子程序依然可以调用,但不推荐,因为这样可能会导致程序出现错误,所以在使用子程序时要传入相应参数
子程序的调用
1.将子程序从导航中托到主程序中
2.使用pattern的perform选项调用子程序
Abapruntimesystem运行环境
Abap程序是若干处理得块的集合
代码块分类
1.Eventblock事件块
2.subroutines子程序
3.module块
Load-of-program程序启动时被调用
一个报表的运行
1.首先执行load-of-program或initialization.
2.推出选择屏幕
3.用户确定屏幕以后,启动start-of-selection事件
4.通过列表缓冲区,运行环境把列表返回给用户
注意:
Load-of-program和start-of-selection有且只能触发一次.
重点:
事件块的特点
1.通过关键字开始
2.事件块的开始意味着上一个事件块的结束
3.每一个事件块执行不同的任务
4.事件块的执行是有顺序的,虽然在编写上没有要求,但建议按照顺序编写
5.标准的事件块
Initialization只能在可执行程序中初始化程序
创建报表必须使用start-of-selection事件块
Listattributes
报表功能:
可以被打印
可以格式化输出(不通的货币和长度单位)
输出日期格式
根据登陆语言选择特定语言
生成一个屏幕
列表屏幕的标准功能
Back/exit/cancel
Scroll
Print
Fine
Save
一个列表拥有一个listheader和四个columnheader.
Multilingualcapability多语言编程
Text-ccc(三位数字)
1.Writetext-001.
2.双击text-001进行创建.
3.Goto-translate
4.修改翻译语言
5.使用相应的登陆语言登陆,就会输出相应语言
Write语句会将数据写到缓冲区
1.用select语句取出数据
2.每write一次就会把数据放到缓冲区中
3.当start-of-selection结束后,运行环境将会把所有的writeskipuline数据全部推到屏幕上
Detaillist
Atline-selection事件
1.在listscreen中,双击记录或者单击并按F2键会出发atline-selection事件
2.通过该事件,可以生成下一级的报表,通过该报表还可以再生成下一级报表,
每一个屏幕都有一个编号.Start-of-selection所生成的屏幕叫做basiclistscreen其编号为0,
而后所生成的屏幕的编号为依次加1.
重要:
最大屏幕号为20,最多有21层
除了第一层在start-of-selection
其他的屏幕都在atline-selection后生成
Sy-lsind列表屏幕的索引编号lsind=listindex
在detaillist使用back按钮,可以跳到上一级屏幕
重要:
当双击list的数据后,系统首先将sy-lsind加1然后再触发atline-selection
用arrayfetch很难做双击后的list
Hidearea隐藏域
Hidearea隐藏域是系统运行环境中的一张内表.
其中包含3个字段
1.Line:
标示行号
2.Fieldname:
字段名
3.Value:
字段的值
隐藏域的使用
1.通过select…endselect对数据库进行循环查询,
2.通过write语句,打印出basiclistscreen中的列表信息
3.通过hide语句,将指定的字段,存放到隐藏域中
4.Basiclistscreen生成后,用户双击信息行,触发atline-selection事件,
5.此时,系统将根据该信息行到隐藏域中查找相应字段
6.最后将该字段返回给对应的全局变量的字段中去,以便于在下一个detaillist中继续使用
展开阅读全文
相关搜索