ABAP数据字典的事务代码(TCODE):SE11,数据字典和SAP整个业务应用是整合的。
本章主要介绍:实例建表,数据表维护程序,添加数据,建立域、数据元素和搜索帮助,逻辑数据库,数据表的读取。
相关概念
通过本章的学习能清晰地了解ABAP数据字典与实际数据库之间的关系。数据字典对象由数据字段(Table Field)、数据元素(Data Element)、域(Domain)等组成。
“域”描述一个字段类型和长度等信息,“数据元素”描述一个字段的用途。先定义域,再定义数据元素使用哪个域,最后定义一个表字段使用哪些数据元素。
表类型:透明表(Transparent Table)、结构(Structure)、附加结构(Append Structure)、存储表(Pooled Table)、簇表(Cluster Table)、视图(Generated View Structure)。
在ABAP应用中大量使用透明表和结构,其中:“透明表”在数据库中有对应的物理表;“结构”为若干个字段组合,在数据库不存在数据纪录。
实例建表
下面以实例说明透明表的建立。建立城市表、学校表、学生表,表关系都是一对多,数据结构如下:
(1)城市表:YTJAYCITY,结构如下
字段名 | 数据类型 | 允许空值 | 主/外键 | 说明 |
YCT_ID | INT | NOT NULL | (PK) | 序号 |
YCT_NAME | CHAR(30) | NOT NULL | 城市名称 | |
YCT_COUNTRY | CHAR(255) | 国家名称 |
(2)学校表:YTJAYSCHOOL,结构如下
字段名 | 数据类型 | 允许空值 | 主/外键 | 说明 |
YCT_ID | INT | NOT NULL | (PK) | 序号 |
YSH_ID | INT | NOT NULL | (PK) | 学校序号 |
YSH_NAME | CHAR(30) | NOT NULL | 学校名称 | |
YSH_ADDR | CHAR(255) | 地址 |
(3)学生表:YTJAYSTUDENT,结构如下
字段名 | 数据类型 | 允许空值 | 主/外键 | 说明 |
YCT_ID | INT | NOT NULL | (PK) | 城市序号 |
YSH_ID | INT | NOT NULL | (PK) | 学校序号 |
YSTU_ID | INT | NOT NULL | (PK) | 学生序号 |
YSTU_NAME | CHAR(30) | 学生名称 | ||
YSTU_ADDR | CHAR(255) | 住址 |
输入TCODE:SE11,回车
输入数据库表,单击“创建”按钮
在属性页输入短文本、选择类型”A“(应用表),选择“X 允许通过标准表格维护工具维护”
选择“Fields”页面,单击按钮,直接输入数据类型和长度
点击“保存”按钮,弹出“创建对象目录条目”对话框,点击“本地对象”按钮
保存完成之后,点击“技术设置”,定义“数据类”、“大小范畴”
单击“返回”按钮,退回到字段编辑页面,单击激活按钮激活数据表。
然后依次建立YTJAYSCHOOL、YTJAYSTUDENT表。数据表建立完成后,可以登录数据库查阅建立的透明表。
注意:
(1)在SAP中建立的数据表会在数据库中创建;
(2)在数据库中直接建立的表不会在SAP中有数据字典;
(3)在SAP或数据库添加数据都能相互查阅到。
有了这样的概念,完全可以用其他语言读取数据库数据,做报表、开发等工作。
相关数据维护程序
由于在刚才建表时,选择了,因此能直接进行数据维护。
输入TCODE:SE16
输入表名
新增数据
点击如下“新增”按钮
输入完成后保存,在连续添加记录后,单击返回按钮回到上一屏
查询数据
点击如下“表内容”按钮
输入查询条件,点击“执行”按钮
查询结果如下:
删除数据
菜单“表条目”下,“全部删除”、“删除”按钮可以删除选中的纪录
修改数据
点击如下“更改”按钮,可以对选中的纪录进行编辑、修改操作
数据批量维护程序的生成及使用
打开表结构维护界面后(SE11),选择菜单“实用程序”-->“表格维护生成器”
输入函数组名称,选择一个权限组,选择维护类型“一步”,单击左上角“查找屏幕号”按钮
选择“建议屏幕号”
处理完成后,单击左上角“新建”按钮
弹出“修改对象目录条目”对话框,点击“保存”按钮,此时左下角如果弹出“请选择包”,则再次点击“保存”按钮
此时单击“本地对象”按钮,此时将会生成环境,有几秒的时间
此时回到主界面,输入“/nSM30”维护数据
输入表/视图名称,单击“维护”按钮
此时弹出对话框,确认
该界面可以对表格数据进行批量维护
建立域、数据元素和搜索帮助
本节介绍建立城市序号和城市名称的域和数据元素,并建立搜索帮助。搜索帮助是SAP系统中最常见的技术之一,是非常重要的。
建立域
输入TCODE:SE11,选择“域”,输入域名称,单击“创建”按钮
输入域类型、域长度等信息后点击“保存”按钮
点击“本地对象”按钮,然后再点击“激活”按钮
同样方法再建立城市名称域,此处略。
建立数据元素
选择“数据类型”选项,输入名称后,单击“创建”
选择“Data element”类型
选择已经建立的域名
选择“Field Label”页面,输入描述长度和描述,单击“保存”按钮,再点击“本地对象”按钮,最后点击“激活”按钮
同样方法再建立城市名称数据元素,此处略。
修改表结构使用数据元素
选择YTJAYCITY数据表,点击“修改”按钮,进入结构维护界面
单击“数据元素”按钮,选择刚刚建立的数据元素,保存之后,再激活
同样方法再修改学校表
建立搜索帮助
打开数据元素YDAJAY_CITYID,输入“Search Help”名称后,保存
双击“Search Help”名称输入框,启动设计界面,点击“是”按钮
选择“基本索引帮助”
输入描述,选择城市表、城市序号和名称,其中城市序号为输入、输出字段,双击YCT_NAME,建立城市名称参数
返回上一界面,输入参数“YCT_ID”,保存并激活这个数据元素
再用SE16打开城市表,就可以通过“搜索帮助”选择城市
逻辑数据库
逻辑数据库是由具有一定关系的表组成,预选设定了读取数据的方法。
数据库读取
读取数据表是编程中最基本的技能,不同的数据库(Oracle,Sql Server,Sybase,DB2等)提供的SQL语法不完全相同。SAP提供了一套SQL语法(Open SQL),在SAP应用中能通过这一套SQL语法处理SAP支持的数据库。另外,SAP也提供Native SQL(本地的SQL语句),处理数据库本身的SQL语法。SAP的SQL语法和标准的SQL很接近,由SELECT、INSERT、DELETE、UPDATE等常用语法组成。
基础的读取数据表例子
将介绍数据库读取的几种方法和步骤:
(1)从数据表直接读取数据至工作区输出
(2)从数据表读取数据至内表,再从内表输出
(3)从内表逐行读取数据至工作区,从工作区输出
REPORT YTEST20160527. *定义工作区 DATA A_YTJAYCITY TYPE YTJAYCITY. *定义内表,请注意有HEADER LINE DATA TA_YTJAYCITY TYPE TABLE OF YTJAYCITY WITH HEADER LINE. *分隔线 ULINE. WRITE / '使用工作区'. ULINE. *将数据表逐行转移至工作区,只读首3行 SELECT * INTO CORRESPONDING FIELDS OF A_YTJAYCITY FROM YTJAYCITY UP TO 3 ROWS. WRITE: / A_YTJAYCITY-YCT_ID, A_YTJAYCITY-YCT_NAME, A_YTJAYCITY-YCT_COUNTRY. ENDSELECT. ULINE. WRITE / '使用内表'. ULINE. SELECT * INTO CORRESPONDING FIELDS OF TABLE TA_YTJAYCITY FROM YTJAYCITY UP TO 3 ROWS. *从数据表读数据至内表,直接从内表输出 *如果TA_YTJAYCITY没有定义HEADER LINE,会出错 LOOP AT TA_YTJAYCITY. WRITE :/ TA_YTJAYCITY-YCT_ID,TA_YTJAYCITY-YCT_NAME,TA_YTJAYCITY-YCT_COUNTRY. ENDLOOP. ULINE. WRITE / '将内表数据转移至工作区'. ULINE. LOOP AT TA_YTJAYCITY INTO A_YTJAYCITY. WRITE :/ A_YTJAYCITY-YCT_ID, A_YTJAYCITY-YCT_NAME, A_YTJAYCITY-YCT_COUNTRY. ENDLOOP.
输出结果
使用PACKAGE SIZE读取数据
上面的例子中,使用了UP TO 3 ROWS语法读取前3行,但是不能继续读取数据。
使用PACKAGE SIZE可以一次读入几条记录,下面例子中有ENDSELECT语句,表示读取2条纪录后接着读取2条记录。
REPORT YTEST20160527. *定义内表有HEADER LINE DATA WA_YTJAYCITY TYPE TABLE OF YTJAYCITY WITH HEADER LINE. *以每次读取2条纪录,直到读取所有数据 SELECT * INTO TABLE WA_YTJAYCITY FROM YTJAYCITY PACKAGE SIZE 2. *输出内表纪录 LOOP AT WA_YTJAYCITY. WRITE :/ WA_YTJAYCITY-YCT_ID, WA_YTJAYCITY-YCT_NAME, WA_YTJAYCITY-YCT_COUNTRY. ENDLOOP. *输出2条后输出一条横线 ULINE. ENDSELECT.
输出结果
内连接和外连接
从两个或两个以上数据表直接读取数据时,需要使用内表连接和外连接语句。
REPORT YTEST20160527. *定义结构 DATA:BEGIN OF SCHOOL, CITY TYPE YTJAYCITY-YCT_NAME, NO TYPE YTJAYSCHOOL-YSH_ID, NAME TYPE YTJAYSCHOOL-YSH_NAME, ADDRESS TYPE YTJAYSCHOOL-YSH_ADDR, END OF SCHOOL. *工作区 DATA SCHOOL1 LIKE SCHOOL. *关联数据表,读取前3条记录,写入工作区,并输出 SELECT YTJAYCITY~YCT_NAME YTJAYSCHOOL~YSH_ID YTJAYSCHOOL~YSH_NAME YTJAYSCHOOL~YSH_ADDR INTO SCHOOL1 FROM YTJAYSCHOOL INNER JOIN YTJAYCITY ON YTJAYSCHOOL~YCT_ID = YTJAYCITY~YCT_ID UP TO 3 ROWS. WRITE: / SCHOOL1-CITY, SCHOOL1-NO, SCHOOL1-NAME, SCHOOL1-ADDRESS. ENDSELECT.
输出结果