在SE11里创建一张自定义数据库表时,有一种很容易让人产生困惑的情况。
表名明明只用了英文字母、数字和下划线,长度看起来也完全正常,系统却仍然拒绝创建。更容易让人迷惑的是,同样风格的名称放到某些 ABAP 程序变量、类属性甚至其他 Repository Object 上,看起来又没有什么问题。
问题通常不在数据库本身,而在ABAP Dictionary的命名体系。
SAP 对 DDIC 数据库表名称施加的约束,并不是简单的一条「最长 16 个字符」。一张数据库表同时具有持久化数据库对象和 ABAP 全局结构类型两种身份,因此它的名称必须同时满足多层规则。
SAP 对 DDIC 数据库表的定义也明确说明,在ABAP Dictionary中,数据库表是一种与底层数据库无关的表定义。ABAP SQL 访问的是 DDIC 中定义的数据库表,而表在激活时才由系统映射或者创建为数据库层面的相应对象。SAP 当前文档继续明确规定,DDIC 数据库表名称最大为 16 个字符,并且处于 DDIC 数据类型的命名空间中。
真正理解这些规则,需要先把一个经常被忽视的概念弄清楚。
数据库表不只是数据库表。
对于 ABAP 类型系统来说,它同时还是一个全局结构类型。
这正是整套命名规则的出发点。
一张数据库表为什么会进入 ABAP 类型系统
假设系统里存在一张自定义表ZSALES_ORDER。
ABAP 程序不仅可以对它执行数据库查询。