从事银行核心系统设计开发的程序猿
分类: 信息化
2016-02-22 00:14:14
*数据字典和枚举值
在核心系统应用开发中,数据字典有举足轻重的作用。数据字典是对系统中所有字段的归纳抽象,需要规范同类字段的类型长度,方便定义和修改。
但是,在过去的核心系统中,数据字典的理解往往也会有失误。常见的错误方法,是试图穷举定义所有可以出现的字段名字。可是实际上核心系统应用程序内容是不断扩充的,功能和交易程序都在不停增加,所用到的字段也是无穷无尽。如果需要列举的是所有字段,就像建巴比伦塔一样困难。而且不可避免会出现账号1到账号9这样的重复。
在Firebird系统中,数据字典的使用方式回归了本源意义,即数据字典定义的是不重复的字段基础类型。举例来说,“日期”就是一个基础类型,归数据字典管理。而“交易日期”,“开户日期”这些字段,都只是使用基础类型定义出来的具体字段变量,不归集到数据字典管理,但命名上要求具体字段必须以数据字典基础类型结尾,体现归属关系。“日期”在数据字典里定义的是WKDT,“开户日期”起名可以叫OPWKDT,“交易日期”起名可以叫TRWKDT,不同场景中也可以起名不一样。这样的数据字典和字段命名规则,既满足应用系统字段的不断扩充,又保持数据字典的精简和稳定。
数据字典的实现方式,是建立一个DICT的PF文件并编译,里面的内容即是所有基础类型的定义。摘录部分如下所示。
为了与实际应用程序中的字段名区分,数据字典中的基础类型字段名以@@开头。
在表结构PF字段定义,通用结构定义,交易、组件输入输出接口PF字段定义时,就可以参照数据字典了。
以尾箱凭证登记表ACNVCBB为例展示如下。
以尾箱主表ACNBXBX为例展示如下。
从上面的例子可以看出,PF定义中首先要REF(DICT)引入数据字典,然后定义具体字段时候,REFFLD指明数据字典的基础类型字段。注意的是命名规范要求,具体字段的后4位必须和数据字典基础字段名字一致。这样在程序中可以轻松认出是哪种类型(这就是应用型匈牙利命名法,有关匈牙利命名法的误解和讨论参见《软件随想录 -- Joel on software》的第23章“让错误的代码显而易见”)。不同的PF字段名字可能会一样,因此在RPG程序中需要QUALIFIED防止重叠,这在后续“命名限定”时候再介绍。
那么如果在RPG程序中需要参照数据字典定义变量该怎么写呢。这里就需要使用一个新的关键字TEMPLATE,它可以引入一个PF结构但并不分配存储空间。同样让例子程序说话。
先是D段定义了DICT,引入外部PF结构DICT,并且是QUALIFIED限定为以点访问字段,TEMPLATE指明只声明不分配空间,然后定义变量时就可以用LIKE了。
数据字典除了定义了字段类型长度,还对枚举项列表进行了管理。比如数据字典例子中,@@YNFG就是一个枚举,1表示是,0表示否。在尾箱主表的EQYNFG碰平标志就是用了这个枚举。在程序中如果写0,1的话,既不便于阅读程序,也不方便枚举值的变化。因此,Firebird中根据DICT自动生成了ENUM这个枚举列表,这样RPG程序中就可以用YNFG_YES代表1,YNFG_NO代表0。摘录DSCPPGM/ENUM这个RPGLE源码部分如下。
在RPG程序中,通过D/COPY DSCPPGM,ENUM 即可引入数据字典枚举常量。之后就可以 EVAL V_EQYNFG=YNFG_YES 这么写了。