月度归档:2014年06月

通过宏,指针,Field-symbol实现ABAP动态取得数据

ABAP动态查询的实现:可以完全实现动态查询,每个字段都可以动态。
(1) 利用宏
(2) 利用abap指针
(3) 利用FIELD-SYMBOL

具体实现:
1.结构的动态查询

2.变量的动态查询

3.内表的动态查询

ABAP程序的数据查询语句SELECT的那些事儿

通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存。
一.SELECT语句:
1)SELECT用于确定读取数据表中的哪些字段;
2)FROM子句用于确定从哪些内表或者视图中读取数据;
3)INTO用于确定将数据读取到程序内的哪些数据对象;
4)WHERE用于限定选择条件;
SELECT select_clause FROM from_clause INTO into_clause WHERE where_clause.
在传统的ABAP语言中,如果使用TABLES语句声明表工作区,则可省略INTO子句(此方法已经被ABAP Object禁用)
除以上4种外还有:
GROUP BY:用于将一组数据条目压缩为一个单行作为选择最终结果;
HAVING:用于限定ORDER BY子句子数据目组的选择条件;
ORDER BY:用于限定行排序;
SELECT整体语法结构:
SELECT <result> FROM <source> INTO <target> [WHERE <condition>] [GROUP BY <fields>] [HAVING <cond>] [ORDER BY <fields>].

二.选择单行数据:
如果只需要选取一个结果数据行,系统在数据库种找到第一个符合条件的数据条目时,就停止查询。单行选择需要在SELECT中使用SINGLE关键字,且INTO自居的结构必须为扁平结构:
SELECT SINGLE <RESULT> INTO <target> FROM <source> …
如果系统找到一个完全符合指定条件的行,SY-SUBRC返回0,否则返回4。
1.选择全部字段
一般不需要指明所有字段,而是在SELECT后用”*”符号,其中INTO语句种的目标对象最好与FROM种的类型相同。
2.选择指定字段
若指定多个数据对象,则需要将这些对象放在括号中,并用逗号隔开,而且其顺序需要与SELECT子句中指明的表字段顺序一致。
如果指定一个扁平结构作为目标对象,且该结构体中的字段多需要选择的字段,则可以使用INTO子句的CORRESPONDING FIELDS选项,该选项只会将SELECT子句中指明字段的内容传送到目标工作区的同名组建中。

三.选择多行数据
将符合条件的数据全部选取出,其语句结构也需要有相应变化,包括循环选择和选择至内表,两种情况。多行选择也可以使用“*”选择整行数据或指定要选择的字段列表。
1.循环选择
通过SELECT / ENDSELECT循环从数据库中读取多行。
SELECT [DISTINCT] <result>…<statement block> ENDSELECT.
注:使用DISTINCT自动去掉重复的行;SY-DBCNT(系统字段)为每次循环计数;对三塔tement block中语句块进行处理。
2.选择至内表
克刚变得一次性把数据选择到一个内表中去。
SELECT …INTO|APPENDING[CORRESPONDING FIELDS OF]TABLE itab.
注:该情况下SELECT并不启动循环,因而不需要使用ENDSELECT语句;如果itab非空,则SELECT语句将用读取的数据覆盖其中的内容,使用APPENDING代替INTO将布覆盖内表,若结构不完全相同,也可使用CORRESPONDING FIELDS选项将同名区域相对应。
3.指定选择包大小
包的大小指的是一次选择到内表的行数,可使用INTO子句的PACKAGE SIZE选项。
SELECT * … INTO TABLE itab PACKAGE SIZE n …
<statement block>
ENDSELECT.
注:由于指定了包的大小,该语句以循环的形式出现;如果n小于等于0,将出现运行是错误。

四.指定查询条件:
1.比较运算符:(=、<、>、<>、<=、>=及相应关键字)
WHERE … f <operator>g … //f为不带前缀数据表名称的字段名FROM中指定,g任意数据对象。
2.范围限定运算符:
WHERE … f[NOT]BETWEEN g1 AND g2 … //条目中f必须在g1与g2之间的值。
3.字符比较运算符:
WHERE f[NOT]LIKE g [ESCAPE h] … //数据条目中,字段f值必须符合g的模式。g中通配符“_”用于代替单个字符,“%”用于代替任意字符串(包含空串)。
注:可使用ESCAPE选项指定一个忽略符号(h),如果通配符前有忽略符号,那么通配符和忽略符号本身都失去了其功能,而是还原为本义。
4.检查列表值:
WHERE … f[NOT] IN (g1,…,gn)… //来价差数据库字段f中的值是否等于括号内列表中的一个值。
e.g. SELECT … WHERE city IN(‘beijing’,’rome’,’london’).
5.检查空值:
WHERE … f IS[NOT] NUll … //来判断数据库字段f中的值是否为空值。
注:在ABAP中,特定的数据对象都具有初始值,这些初始值可能是一串0或空格等,但不等同于数据库中的NULL值,因而使用ABAP语句添加数据条目时,所有的数据字段都不可能是空值。但在ABAP数据词典里仍有可能存在控制字段,因为Native SQL可以进行空值设置。
6.检查选择:
选择表是一种复杂而强大的逻辑表达式组合形式,其本身是一个内表,检查选择表意味着数据库字段f需满足所有逻辑表达式的组合。
WHERE … f [NOT] IN seltab …
其中seltab是选择标准表,是具有特定格式的内表,可以通过SELECT-OPTIONS语句添加到程序和报表选择屏幕,并由报表用户填充它。
查询条件也可在全部或者部分运行时动态指定,方法为在程序中将所有选择条件放置于一个内表中。
SELECT … WHERE <condition> AND (itab) …
内表itab金包含一个类型c组件且最大长度为72的字段。

五.夺标结合查询
应用程序需要从相关联的多个数据库表读取数据进行评估,此时需要用某些结合条件(字段)把各个数据库表连接起来。
1.SELECT语句嵌套:
2.FOR ALL ENTRIES选项:
Open SQL在WHERE子句中提供了FOR ALL ENTRIES附加项,选出符合已存在内表中所有满足条件的数据值:
SELECT … FOR ALL ENTRIES IN itab WHERE <condition> …
3.使用视图:
可通过视图(view)将多个数据库表的选择结合在同一个SELECT居于中进行。
4.结合查询(Join)
Inner Jion基本思想是如果主数据表和结合表中存在共同的字段内容,根据其相同值提取
SELECT … FROM table [INNER] JOIN
jointable1[AS alias]ON<cond><options>,
jointable2[AS alias]ON<cond><options>…
table是主选择表;jointable是结合表;ON用于指定结合条件;
注:不同逻辑条件之间只能通过AND连接,且每个条件中必须包含一个主选择表中的字段,可用“~”指定其所属的数据库表作为前缀。
LeftOuterJoin与InnerJoin的主要区别是前者中对于主选择表的数据,即使在结合数据表中条件字段只不存在,也将该数据行选出,结合表中不存在的字段保持空白。
SELECT … FROM table LEFT[OUTER]JOIN dbtab [AS alias] ON <cond><options>…
ON附加项中,只能使用“=”操作符。
5.子查询
使用EXISTS,IN或者逻辑运算符连接至WHERE子句中,但不能与结合选择附加项ON同时出现,子查询可进行嵌套。

六.组合查询结果
1.总计功能:
特定字段:MAX最大值、MIN最小值、SUM求和、AVG平均值、COUNT行数。
SELECT agg ([DISTINCT] s1)[AS a1] agg ([DISTINCT] s1)[AS a1] …
agg:总计的表达式;s1:字段;a1:目标变量;DISTINCT排出相同的选择结果。
2.分组总计:
使用GROUP BY子句进行分组总计,注:分组总计只能应用在查询字段已经指定了的情况,因此只有指定单独的基本字段列表或者使用INTO CORRESPONDING FIELD附加项的SELECT语句才能进行分组选择。
SELECT s1[AS a1] s2[AS a2] … agg(sm)[AS am] agg(sn)[AS an]…
INTO (f1,f2,…fm,fn)|COORESPONDING FIELD OF itab…
GROUP BY s1,s2 …
3.指定分组条件:
使用HAVING子句给分组选择的结果限定条件。注:只有使用GROUP BY时才可使用。
SELECT s1[AS a1] s2[AS a2] … agg(sm)[AS am] agg(sn)[AS an]…
INTO (f1,f2,…fm,fn)|COORESPONDING FIELD OF itab…
GROUP BY s1,s2 …
HAVING <cond>.
<cond>用法与WHERE子句中规则一致。
4.指定行的顺序:
ORDER BY 子句指定行的顺序,排序标准是数据表住关键字或指定的字段。
SELECT * FROM … ORDER BY PRIMARY KEY. //系统以升序次序给出
SELECT * FROM … ORDER BY f1[ASCENDING|DESCENDING] f2[ASCENDING|DESCENDING] … //默认为升序,先按f1排,后按f2排

七.其它格式说明
1.使用标工作区: TABLES dbtab
标工作区是接口工作区中的一种,使用TABLES语句声明,在ABAP objects中不能再使用该语句格式,在指定了标工作区之后,SELECT语句中可省略INTO子句。
2.动态指定数据库表
SELECT …FROM (dbtabname)…
通过在运行时为变量值指定数据库表名。
注:dbtabname必须包含一个数据库表名字,且必须为大写形式,不能使用表工作区忽略INTO子句。
e.g. dbtabname=’SPFLI’
3.指定数据区域
不同应用被分为若干个商业区域,这些区域称为集团(Client)。每个集团都会被系统自动分配一个默认字段MANDT,
注:一些系统通用表是集团无关的,可跨区域存储无MANDT字段。
若要操作特定集团,则需要使用CLENT SPECIFIED取消系统自动处理功能。
SELECT|UPDATE … dbtab CLENT SPECIFIED …
注:CLENT SPECIFIED紧跟在表名之后,并在WHERE对mandt的集团字段进行使用。
4.设置缓冲机制
在数据字典Technical settings中进行不同类型缓冲设定。
SELECT语句中的FROM子句的BYPASSING BUFFER附加项,可取消数据字典对该表的缓冲。
DISTINCT附加项与结合选择、总计选择、IS NULL条件、子查询,以及GROUP BY和ORDER BY同时使用时,也将自动忽略缓冲设定。
SELECT … FROM dbtab BYPASSING BUFFER …
5.限定选择行数
SELECT … FROM dbtab UP TO n ROWS …
若n为正数,则系统最获选n行到程序中,若n为0,则选所有满足的行。
注:与ORDER BY同时使用时先排序,再从排序结果中选n行。
6.操作性能分析
GET RUN TIME FIELD f.
f为I类型,返回开始后的毫秒数。可得到当前系统已运行的时间,来分析SQL语句的操作性能。
注:若需要对程序进行更为复杂、全面性能分析,可以使用系统工具Runtime Aralysis(SE30)。
八.使用光标
在SELECT语句中,数据从数据库中以32KB的数据包传递至应用服务器中,并通过INTO子句传至ABAP中,Open SQL中提供了一套语句对数据的具体传输过程进行监测,这个监测通过操作数据库光标进行,使用光标几乎可以从任何SELECT语句的结果集中获得下一行,先用OPEN CURSOR语句将光标与相关的SELECT语句连接起来。
OPEN CURSOR [WITH HOLD] c FOR SELECT … [WHERE (conditions)].
其中:c为CURSOR类型,不能在SELECT SINGLE中使用光标。
打开光标后,就可使用FETCH语句从OPEN CURSOR的结果集中读下一行
FETCH NEXT CURSOR c INTO <target>.
其中所选行都将读到INTO子句指定的目标区域。若FETCH没有读取任何行SY-SUBRC为4,否则返回4。
必须使用CLOSE CURSOR c 来关闭光标
数据库提交时,系统将自动关闭光标,若在OPEN CURSOR中使用WITH HOLD选项,则Native SQL数据库提交将不会关闭光标。

【成员招募】赶快加入我们!一起享受写作创新的乐趣!

赶快加入我们,队员招募。

此处待编辑

QQ群:28069988

互联网上最广泛使用的头像服务 – Gravatar (全球公认的头像)

一个独一无二的头像,可以成为你在互联网上除了昵称外的第二标识符。Gravatar(Globally Recognized Avatar) 提供一种可在全球范围内通用的头像服务,你只要在 Gravatar 上传一次头像,就能在无数个支持 Gravatar 的博客、论坛等网站使用它。何乐而不为呢?

什么是 Gravatar?
一个 “avatar”(头像) 是你在互联网上的一个形象 —— 在你和网站互动时会出现在你昵称的旁边。

一个 Gravatar 是一个 Globally Recognized Avatar(全球公认的头像)。你只需上传一次头像就创建了你的个人资料,以后当你在支持 Gravatar 的网站上参与互动时,你的 Gravatar 图像就会自动显示。

那么 Gravatar 是根据什么信息来显示头像的呢?一个邮箱地址对应一张头像图片!

谁正在使用 Gravatar?
众多科技类网站使用的社会化评论系统:DISQUS、国内的多说、友言;程序员常去的 GitHub 和 StackOverflow;WordPress 和 Typecho 等博客程序也都使用 Gravatar 作为评论系统的头像。
他们正在使用 Gravatar

注册 Gravatar
Gravatar 的官网是:http://www.gravatar.com/

1. 首先你需要一个账号
如果你已经是 WordPress.com 的用户,你可以直接使用 WordPress.com 账号进行登录。
如果你不是 WordPress.com 的用户,则需要新注册一个账号(即 WordPress.com 账号),只需填写邮箱、用户名和密码,然后到邮箱激活就行。
登录后,网站默认显示英语语言,如果需要显示为中文,你可以将地址栏中的 en 改为 cn 即可( en.gravatar.com → cn.gravatar.com)。

Gravatar – Gravatar 管理界面
2. 添加头像
你可以通过3种方式上传头像,从电脑中选择图像、指定网上的图片或者使用之前上传过的图像。

Gravatar – 添加头像


3. 裁剪头像
上传图像后,你可以在线对图像进行简单的裁剪操作,调整头像以获得在不同尺寸下的最佳效果。

Gravatar – 裁剪


4. 选择头像评级
最后,你需要对每个头像设置评级,不过一般都选 G(普通级)。

G
普通级,Gravatar 适合展示于任何观众类型的网站。
PG
家长指引级,Gravatars 可能包含粗俗手势、挑逗性衣著,轻度发誓的话语或轻微暴力。
R
限制级,Gravatars 可能包含粗俗、亵渎、暴力、裸露或吸毒等内容。
X
成人级的,Gravatars 可能包含淫秽的色情图像或骚扰性暴力图像。

Gravatar – 选择评级


4. 完成
你可以给一个账号添加多个邮箱地址和头像,并指定邮箱和头像的对应关系,管理操作非常人性化。

Gravatar – 管理 Gravatar 头像


使用 Gravatar
好了,一切就绪,不如就在这篇文章下留个言试试吧!