Skip to content

一、概述

  表包含实际数据库中的物理表与 ABAP数据字典的表这两种,参见[图7-2]。在T-CODE:SE11创建表后激活就会在数据库中生成物理表。(数据库种类很多,但很多公司都在使用Oracle数据)。在ABAP数据字典创建的表通过SAPDB Utility转换成数据库表如[图7-2所示]本章讲解的表不是实际数据库中存在的表,而是ABAP 数据字典中的表,因此要注意区分。例如,ABAP 数据字典的表字段与数据库中的表字段顺序有可能不同。SAP公司一般不提供开发者直接登录 DBMS修改表、删除数据及查询的权限。因为在实际数据库中没有 ABAP 数据字典中存在的外部键(ForeignKey),因此会破坏数据完整性。即使不了解数据库物理性领域也不会影响 ABAP程序的开发,因此不必担心。当激活 ABAP 数据字典发生奇怪的错误时则最好向 BC 担当者寻求帮助。如[图 7-3]所示,表由二维结构模型(Matrix)构成。列中显示各自的名字及属性,这些称之为字段(Field)。字段是固定的,拥有不重复的唯一的名字及属性。表可以指定一个或多个字段作为主键,并且通过这些主键控制重复数据的产生。除了主键以外的字段叫一般字段(General Field)或者叫功能字段(Functional Field)。另外,表的行坐标用行(Line)、元组(Tuple)、记录(Record)、数据(Data)等术语表达。 alt textalt text   ABAP 表有三种类型,分别为透明表、簇表、池表。池表、簇表是把多个表组合成一个的 ABAP数据字典对象,在此站中只讲述经常使用的透明表。表的基本属性存储在表 DD02L中,而关于表字段的信息存储在表 DD03L中,表有下列四种属性。

  • 表字段: 有字段名及属性。存在主键。
  • 外部键:定义该表与其他表之间的关系。
  • 技术属性:设置表数据的总件数、缓冲设定等表属性。
  • 索引:可以提高查询数据的速度,在表中创建索引。若表中已经追加了索引,则每当往表中追加数据时索引中也要一起追加,因此读取速度提高的同时插入数据的速度反而下降。

二、表字段

1. 表字段介绍

  表字段是显示表属性的个别构成要素。假设存在员工信息表,则可以定义如员工编号/出生地/电话等员工基本信息。这种个别属性叫表字段。下面在 T-CODE:SE11 下查询表 SCARR,观察其表结构,参见「图 7-4]。 alt text 使用 T-CODE:SE11可以创建/修改/査询/删除所有 ABAP 数据字典对象。应用工具栏上的按钮功能,请参照[表 7-1]。 alt text [图 7-4]表结构要素中的字段包含下列几种属性。

  • 字段名:最大长度为16位,要以字母开头,允许使用下画线()。
  • 主键选项:定义表主键。
  • 初始值:用于设置字段的初始值。
  • 字段类型:定义如字符型,数字型等数据类型:
  • 字段长度:定义字段可容纳的数据长度。
  • 小数位:指定小数位。
  • 描述:记述字段意义的内容。

2.字段属性定义(数据类型、字段长度、描述)

  表字段中要指定数据类型、长度、描述。字段属性可以利用数据元素和Predefined Typc两种方式指定。数据元素是用户可以创建的对象,若输入已存在的数据元素,则会自动指定数据类型长度。这是因为在创建数据元素时已经输入了必要的信息。若选择Predefined Type方式,则可以直接输入数据类型、字段长度及描述。

3.引用字段与引用表

  定义代表数量的数据类型QUAN与代表金额的数据类型CURR的字段时要指定引用(参字段。例如,有显示物料数量的数字1000,但是此数量会随着单位kggton 等表达的照)数量会不同。通货也有KRWUSDIPY等多种单位,因此这两种类型一定要参照单位。前者要指定 Unit ofmeasure(数据类型 UNIT),后者要指定 Currency Key(数据类型 CUKY)。用 BDC执行含有 QUAN 或者CURR类型的标准程序时,若不参照单位会发生错误。为了解决此类问题,显示数量金额的字段时要指定单位。

abap
WRITE 原数量 TO 转换数量 UNIT 'KG'.

CURR 类型也一样。

abap
WRITE 原价格 TO 转换后价格 CURRENCY 'KRW'.

  下面再仔细讲述关于通货单位的知识。SAP是全球都在使用的系统,因此各国的通货都存储在表里进行价格管理。[图7-5]是存储 SD 模块的销售文档明细的VBAP表结构。选择块内的字段NETWR是销售文档明细中的物料单价其类型为CURR类型。另外此字段下面的WAERK 是用来指定 NETWR 字段的通货单位。双击字段 NETWR 就可以查看字段之间的关联信息。 alt text

  运营 SAP 系统时至少一两次会遇到画面上显示的价格因完全没有预想到的问题发生变化的现象。这是因为价格会根据表中存储的通货单位小数位会发生变化。假设[图7-6]价格表中有分别参照KRW、USD、KWD三个通货单位的三条数据10.00。这些价格在ABAP程序的画面(包含 ALV)上查询,则会按照参照的各国通货单位指定的小数位显示数据。通货单位的小数位信息存储在表TCURX(在T-CODE:OY04中设置)中。[图7-6]中可以看出在韩国使用的通货单位KRW在表TCURX中小数位是0。这代表着存储在价格表中的金额10.00不使用小数位,即要去掉两个小数位返回金额1000。而在中国使用的通货单位 RMB 使用2位小数位,因此不改变其值直接返回10。如RMB,USD一样使用2位小数位的国家通货在表TCURX中不存在相应数据。即该表中不存在的通货意味着使用2位小数位。另外,在科威特使用的通货单位KWD使用3个小数位,因此10.00会转换成1显示到画面上。下面直接查看表中设定的价格与通货单位。 alt textalt textalt text 如果 WRITE语句中无法使用CURRENCY选项,就要在程序中单独追加根据通货单位转换金额的逻辑,如[例 7-1]所示。

例 7-1

abap
REPORT z07 01.
PARAMETERS p cOSt TYPE P DECIMALS 2
PARAMETERS p cuky TYPE c LENGTH 3.

DATA lv_dec TYPE tcurx-currdec.

SELECT SINGLE currdec INTO lv dec 
FROM tcurx WHERE currkey= p cuky.
IF sy-subrc EO 0.
    IF lv dec > 0.
        p_cost=p_cost*(100/10** lv dec )
    ELSE.
        p_cost= p_cost* 100.
    ENDIF.
ELSE.
    p cost=p cost.
ENDIF.

WRITE p_cost.

  在[结果 7-1]的价格字段 cost中输入1000,然后分别输入通货单位RMBKRW 后运行程序。从右图中可以看出,虽然是相同的价格,但根据通货单位不同,分别显示了1,000和100.0.00 两种不同的结果。 alt text

三、创建表

下面创建如[图 7-7]所示的员工表、员工取得的证书表、证书名称表三个表。 alt textalt text 下面再创建拥有如[图 7-8]所示结构的存储社员证书的表。创建步骤如上所述。 alt text 另外,再创建一个存储证书I与名称的表,表结构请参照[图7-9]。 alt text

四、修改表

1. 操作介绍

  做开发或修改程序的业务时经常会遇到需要修改表的情况。在TCODE:SE11中利用alt text按钮可以修改表,当有数据的表上删除主键时无法在SE11上激活,此时在T-CODE:SE14上选择Savedata后单击alt text按钮即可解决。若没有权限,则需要向 BC担当者提出申请。 下面语句中的gsst是参照ABAP数据字典(如[图 7-10]所示)表类型定义的结构体(Structure)。这种结构体的数据类型与字段长度都从表ZTABLE复制而来。当激活程序时从表 ZTABLE 中获取信息来确定结构体的结构。 alt text 这代表着即使修改表SCARR的内容,也不必修改代码其修改的内容会自动反映到结构体上,即可以明显地减短修改程序的时间。

abap
DATA: gs_str TYPE ztable.
    SELECT * INTO gs_str FROM table.
    WRITE:/gs str-carrid, gsstr-carrname.
ENDSELECT.

2. 自动修改表操作

  当表中存在数据时修改字段属性,则数据库中自动会执行修改表的操作。此时被修改的对象同时存在激活、未激活的两个版本。激活版本的数据字典对象在执行环境中使用,而未激活版本当修改激活版本时才生成且不执行语法检查,另外不会影响正在执行中的程序。为了适用修改内容单击激活按钮,则会修改TIMESTAMP,执行与变更对象相关程序时会确认TIMESTAMP,从而调用最新版本。实际上,Conversion先为临时表复制生成数据后再重新复制数据到新修改的表中,其步骤如下所示。

  1. 给表加锁(Lock)。
  2. 删除索引后修改表名(QCM<tab_name>)。
  3. 将未激活版本改成激活版本后在数据库中重新生成表
  4. 将临时表的数据复制到重新生成的表中。
  5. 重新生成索引。
  6. 删除临时表。
  7. 给表解锁(Lock)。

五、表字段属性

下面了解一下关于表的主键及初始值属性,参照[图 7-11]。 alt text

1.主键

  字段要指定为主键时选择 Key选项。一般把唯一可以区分数据的字段设置为主键。即在员工信息表中不存在重复的员工编号,则可以只指定社员编号作为主键。若员工编号有可能重复,则名字也可以指定为主键。

  • 一个表最多可以指定16 个主键。
  • 主键字段长度合计长度可达120。
  • 主键基本上都选择 Initial Value 选项。
  • 创建表时自动创建以主键构成的主索引。

2.初始值

首先明确定义 NULL 与初始值(Initial Value)的概念。

  • NULL 是指“无”。
  • NULL是指不存在值。不占用内存空间。
  • NULL不可能是下列值。

    :0,”,SPACE,空

  • NULL 不能作为分配、运算、比较用对象。
  • 在 ABAP 语言中类似于IS NULL,IS NOTNULL的比较运算符可以用在 SOL语句中
  • Initial Value 是指“有”。
  • Initial Value 是指存在值。因此占用内存空间。
  • Initial Value 可能会是下列值。

    :0,'’,SPACE,空

  • Initial Value 可以作为分配、运算、比较用对象。

在 ABAP 语言中可以使用类似于 IS INITIAL,IS NOTINITIAL 比较运算符。

Initial Value 不是指 Null 值,而是指初始值。每个数据类型都有不同的初始值,如[表 7-3]所示。 alt text   主键不允许是 Nul1 值,因此选择了Key选项,即使没有选择Initial Value 选项也会自动赋初始值。Initial Value选项只有在生成追加字段时才有重要意义。即保存现存数据时决定以初始值形式还是 null 值形式保存数据的设定。在[图7-11]中出生地home 字符类型的字段若不选择 Initial Value选项后进行追加,则现存数据中的home 字段中会存储nul 值,而追加完home字段后,即使刚入职的员工 home字段中不输入值也会自动赋初始值(Initial Value)。Home字段追加后的新入职员工的 home 字段里即使不输入值也会自动存储初始值(space)。最终此表的这个字段中会同时存在nul值与初始值。此时,想查询home 字段中不存在值的数据时使用下列语句,则无法查询到以nul 值保存的数据。

abap
SELECT * FROM zemp WHERE home <> SPACE

即若想查询所有空数据(包含nu1l值),则要改成下列所示语句。

abap
SELECT* FROM zemp WHERE home is not null

  能识别 Null 值的语句只有ISNULL与ISNOTNULL。经常会遇到正在使用的CBO 表中要加入新字段的情况。在实际运营系统环境中会遇到因没有设置Initial Value 选项而发生此种错误,因此需要正确理解概念后再使用。在前面也已经提过,即使没有选择Initial Value 选项,刚创建的表中追加数据时会自动保存初始值。在表中追加新字段时数据库中会执行下列语句。

abap
ALTER TABLE table name ADD FIELD field name.

另外,在新追加的字段中选择 Imnitial Value 后激活表,则新追加的字段的所有记录会执行下列所示语句。

abap
UPDATE tablc namc SET 字段= Initial value.

在新追加的字段中没有选择 Initial Value选项就不会执行 UPDATE语句。因此,新追加字段之前的数据会以 NULL值存在,之后数据就开始以初始值存在。

六、创建数据的方法

OPEN SQL 与NATIVE SQL中已经介绍在TCODE:SE16下创建数据的方法,本章就讲述在TCODE:SE16N下编辑大量数据的方法。 alt text

七、外部键

1. 概要

  外部键(Foreign Key)在关系数据库中是用来定义表连接的,另外外部键还可以确保数据完整性及数据一贯性。举例说明,则当用户输入类似于北京='010’、上海='021’等地区编号时可以排除输入不存在的数据的情况。在本章开头也提到,ABAP领域里的外部键只存在于 ABAP数据字典中,而在实际数据库中是不存在的。因此,要禁止直接在数据库中追加数据的操作。利用前面创建的员工证书信息表与证书名表说明外部键关系。详情参见[图 7-12]。 外部键显示两个表之间的关系,此时外部表字段参照检査表的主键值。在[图7-12]中的表ZEMPCERT的字段CERTID与表ZCERINFO的主键连接在一起。其中,表ZEMPCERT叫外部表(从属表),表ZCERINFO叫检查表(引用表)。外部表的字段是检查表的主键。以外部键连接的字段,在两个表中字段名可以不同,但是数据类型与长度一定要相等。当然也可以是使用相同域的字段。 alt text

2.Check Field 与 Value Check

  外部键与Check Field连接在一起意味着输入作为外部键的字段值时要检查次数据是否存在于检查表中。若检查表中不存在值,则外部键字段中就无法输入该值。如[图7-13]所示,在外部表中创建数据时首先检查该值是否在检查表中存在后才能保存该值,若不存在会发生错误。例如,当表ZEMPCERT 中插入CERID="7的值时,因为ZCERTINFO表中不存在该值而无法保存。定义外部键时在内部自动会生成SELECT语句。若检查表中存在符合条件的数据,则就是有效数据,否则就认为是不正确的数据。在[图7-13]中创建外部表的 SELECT语句如下所示。

abap
SELECT * FROM zcertinfo where zempcert-certid = zcertinfo-certid.

alt text

3.一般外部键与静态外部键

  没有必要用外部键检查 Check 表中的所有主键。若不想检查 check 表中所有主键时,则将不作为检查对象的主键定义成一般外部键或者静态外部键即可。

  1. 一般外部键。
      当检查表中存在多个主键时没有必要检查的字段定义为Generic Key,则在检查表中会忽视此字段检查。即执行SELECT语句时在条件中会删除Generic字段。假设在证书信息表ZCERTINFO中将发放证书的公司字段追加设定成主键。在[图7-14]中只将检查表的一部分主键定义成了外部键。此时,在外部表中追加数据,则只会检查设定为外部键的字段是否存在。这种情况叫一般外部键定义。在实际TCODE:SE11上设置外部键,则可以确认在 company字段上选择了 Generic 选项,如[图 7-15]所示。
  2. 静态外部键。
      外部键中可以指定常量。当该字段的值和常量一致时才能输入值,否则就无法输入值。如[图 7-16]所示,表 ZCERTINFO的字段 COMPANY 中可以设置静态外部键'SAP’在[图7-17]中ZEMPCERT与ZCERTINFO 根据静态外部键连接在一起,表ZEMPCERT中只能追加检查表字段 company 的值为SAP 的数据。
  3. 创建外部键。
      为了有助于理解,下面试着创建社员取得的证书表(ZEMPCERT)与证书信息表(ZCERTINFO)之间的外部键。详情参见[图7-14]~[图 7-17]。 alt textalt textalt text

八、表增强

1.Include 结构体

  前面已经讲述,可以将个别字段组合在一起构成一个表。除了这种基本方法以外还可以直接将一个结构体追加到表(或者结构体)中。另外还可以组合这两种方法构成表。当多个表使用相同结构的字段时使用追加/修改个别字段的方法会影响工作效率。此时可以创建一个公用的结构体,当很多表重复使用相同的字段时,可直接将此结构体包含到表中。一般经常使用的有表的创建者、创建时间、修改者、修改时间等。以便往表里包含时使用。表可以包含结构体或表。[图7-18]是往表 ZEMP 中追加证书信息表ZCERTINFO的方法。结构体字段中可以输入结构体或者表。 alt text

2.Append 结构体

  在实际业务中使用的 Append 结构体是指把一个结构体追加到一个表(或结构体)的方法,换句话说,就是不用直接修改表而可以追加字段的方法。SAP公司将这些字段称之为客户用字段(Customer Filed,用此方法在标准表中可以追加所需的字段,即使升级 SAP 也不会受影响)。一个Append 结构体只能用在一个表中,在一个表中可以使用多个Append 结构体。池表与簇表不能使用 Append 结构体。另外包含类似于LCHR 与LRAW 等 Long 类型字段的表也不能使用。

Append 结构体有下列几种功能。

  • 在标准或者 CBO 表中追加新字段
  • 在现存表中追加及定义外部键。
  • 在现存表中追加检索帮助。

  表中追加 Append 结构体后激活,数据库表中生成包含Append 结构体的所有字段的表。利用 Append 结构体功能在标准表SCARR中尝试追加新客户字段。不以Y或者Z开头的表都是标准表。 alt text

2.表增强目录

  ECC 6.0版本以后在T-CODE:SE11中生成表后激活就会弹出下列所示的警告窗口。每次激活时都会弹出[图 7-19]所示的窗口。 alt text   为了确认其含义,在警告窗口中单击alt text按钮确认信息。上面会出现Enhancement category fortable missing内容,如[图7-20]所示,这是提示大家需要指定使用 APPENDINCLUDE 功能时所需的增强目录类型。为了解决此问题,在生成表后要执行下列操作。选择菜单:ExtrasEnhancement Category,如[图 7-21]所示。 alt textalt text   弹出设置表增强目录的窗口,如[图 7-22]所示,共四种类型。 alt text

九、索引

1.索引介绍

讲述索引(Index)之前,首先看一下索引相关的问题及解答

abap
<提问>
在下面 SOL中 HINTS 语句代表什么?
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_emp
FROM zemp
% HINTS ORACLE 'INDEX(ZEMP, "ZEMP~Z01")'
abap
<解答>
例如,让 optimizer 从北京的东直门出发到永安里站。
通常都会想乘坐一号线,而optimizer 会考虑所有换乘线路而最终导出最佳线路。即HINTS 提示 optimizer“乘坐一号线最快”的信息,使之能够选择捷径。

  类似于地铁线路的这种实例,使用索引还可以加快访问数据库表的速度。开发程序时用SQL来访问数据库。执行SQL时为了提高相应SQL性能会使用索引。使用索引的SQL语句有SELECTUPDATEDELETE。为了提高访问数据的速度,索引会在与存储数据的不同物理空间里生成索引目录。   换句话说,就是复制原表生成新的有序表,有序数据可以节省数据访问时间。物理上ABAP数据字典的表中追加的索引会在Oracle等数据库中生成,即SAP内部不存在索引。在T-CODE:SE11(ABAP数据字典)上激活ZEMP 表的同时以主键为基准自动生成0的索引,在数据库中也会生成索引表。索引表与ZEMP表中都有代表各自表数据位置的 ROWID 信息(表的ROWID 是以 pseudo-假设字段存在),索引表是通过 ROWID 取表数据。另外,利用索引访问数据库并且以索引字段为基准已经排好数据,因此SELECT会输出有序数据,如[图 7-23]所示。 alt text   在[图 7-23]中是为了便于读者理解将ROWID以1、2等整数来代替,但实际上是以六十四进制(a~z,A~Z,+,1,0~0)显示,且它还代表着存储在数据库中的位置。

2.创建索引

  下面介绍在标准表直接创建 Secondary 索引的过程。 alt text

十、技术设定

  在数据库中创建表时(在SE11中激活表时)要定义技术设定(TechnicalSetting)。表大小、是否使用缓冲、是否记载运行记录等信息可在技术设定里设置。虽然技术设定工具与ABAP 工作区集成在一起,但也可以通过个别事务码(T-CODE:SE13)来执行。设置画面如图[7-24]所示。 alt text

1.逻辑存储参数(Logical storage parameters)

  逻辑存储参数在技术设定里最重要的一项。

1. 数据等级(Data Class)

  数据等级用于指定表存在的即实际存储数据的数据库物理领域。(Orace中称之为TABLSESPACE,INFORMIX中称之为DBSPACE)。[图7-25]显示的是 ABAP 数据字典的表与数据库的表结构。数据库中生成表时会在物理空间 TABLESPACE 中生成。   数据等级种类有主数据、事务码数据、组织数据、系统数据及客户数据,如[图7-26]所示。主数据是不经常发生变化的数据,因此类似于组织代码属于主数据。事务码数据属于经常发生变化的数据,因此类似于发票发行每当执行事务码时都会生成数据。组织数据是指当设置系统后几乎没有变化的数据,可以把国家为主键的表作为代表实例。系统数据是指系统自身所需的数据,即存储程序代码的表可作为代表实例。客户数据是用户所需而追加的数据。 alt textalt text

2.大小目录(Size Category)

  大小目录定义表中可以生成的记录数可以根据客户需求设置。   缓冲(Buffering)   设置Buering,如[图7-27]所示,不会直接从数据库读取数据而是在应用层服务器的缓冲器中查询数据。缓冲设置特别在客户端/服务器模式下发挥很大作用,且可以有效减少访问时间。但是缓冲器中若不存在所需的数据时就要直接访问数据库进行查询。这种情况下需要先从缓冲器中读取数据,当不存在数据时再访问数据库,将数据保存到缓冲器后才返回数据,因此比直接访问数据库更加耗费资源。因此经常发生操作的表中不设置缓冲器才是明智的选择。 alt text