100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > AS400银行核心系统开发中的技术总结--数据字典和枚举值

AS400银行核心系统开发中的技术总结--数据字典和枚举值

时间:2018-11-03 05:48:16

相关推荐

AS400银行核心系统开发中的技术总结--数据字典和枚举值

*数据字典和枚举值

在核心系统应用开发中,数据字典有举足轻重的作用。数据字典是对系统中所有字段的归纳抽象,需要规范同类字段的类型长度,方便定义和修改。

但是,在过去的核心系统中,数据字典的理解往往也会有失误。常见的错误方法,是试图穷举定义所有可以出现的字段名字。可是实际上核心系统应用程序内容是不断扩充的,功能和交易程序都在不停增加,所用到的字段也是无穷无尽。如果需要列举的是所有字段,就像建巴比伦塔一样困难。而且不可避免会出现账号1到账号9这样的重复。

在Firebird系统中,数据字典的使用方式回归了本源意义,即数据字典定义的是不重复的字段基础类型。举例来说,“日期”就是一个基础类型,归数据字典管理。而“交易日期”,“开户日期”这些字段,都只是使用基础类型定义出来的具体字段变量,不归集到数据字典管理,但命名上要求具体字段必须以数据字典基础类型结尾,体现归属关系。“日期”在数据字典里定义的是WKDT,“开户日期”起名可以叫OPWKDT,“交易日期”起名可以叫TRWKDT,不同场景中也可以起名不一样。这样的数据字典和字段命名规则,既满足应用系统字段的不断扩充,又保持数据字典的精简和稳定。

数据字典的实现方式,是建立一个DICT的PF文件并编译,里面的内容即是所有基础类型的定义。摘录部分如下所示。

A R RDICT A*长度 L A @@WKDT L TEXT('日期') A A*长度 T A @@WKTM T TEXT('时间') A A*长度 Z A @@TMSP Z TEXT('时间戳') A A*长度 1A A @@CHAR 1A TEXT('字符') A @@YNFG 1A TEXT('是否标志') A* 1 是 YES A* 0 否 NO ...... A*长度 3P A @@EXSQ 3P 0 TEXT('执行序号') A*长度 4A A @@SMCD 4A TEXT('摘要代码') A @@ITCD 4A TEXT('核算代码') A @@CSCD 4A TEXT('现金项目代码') ......

为了与实际应用程序中的字段名区分,数据字典中的基础类型字段名以@@开头。

在表结构PF字段定义,通用结构定义,交易、组件输入输出接口PF字段定义时,就可以参照数据字典了。

以尾箱凭证登记表ACNVCBB为例展示如下。

A UNIQUE A REF(DICT) A R RACNVCBB A BKBRNO R REFFLD(@@BRNO) A TEXT('机构号') A COLHDG('机构号') A BKBXNO R REFFLD(@@BXNO) A TEXT('尾箱号') A COLHDG('尾箱号') A BKVCTP R REFFLD(@@VCTP) A TEXT('凭证种类') A COLHDG('凭证' '种类') A VBMDNU R REFFLD(@@MDNU) A TEXT('凭证张数') A COLHDG('凭证' '张数') A BKSTCD R REFFLD(@@STCD) A TEXT('记录状态') A COLHDG('记录状态') A K BKBRNO A K BKBXNO A K BKVCTP

以尾箱主表ACNBXBX为例展示如下。

A UNIQUE A REF(DICT) A R RACNBXBX A BKBRNO R REFFLD(@@BRNO) A TEXT('机构号') A COLHDG('机构号') A BKBXNO R REFFLD(@@BXNO) A TEXT('尾箱号') A COLHDG('尾箱号') A VCACNO R REFFLD(@@ACNO) A TEXT('凭证账号') A COLHDG('凭证' '账号') A BKTLNO R REFFLD(@@TLNO) A TEXT('柜员号') A COLHDG('柜员号') A EQYNFG R REFFLD(@@YNFG) A TEXT('碰平标志') A COLHDG('碰平' '标志') A OPBRNO R REFFLD(@@BRNO) A TEXT('创建机构') A COLHDG('创建' '机构') A OPDPNO R REFFLD(@@DPNO) A TEXT('创建部门') A COLHDG('创建' '部门') A OPTLNO R REFFLD(@@TLNO) A TEXT('创建柜员') A COLHDG('创建' '柜员') A OPWKDT R REFFLD(@@WKDT) A TEXT('创建日期') A COLHDG('创建' '日期') A OPWKTM R REFFLD(@@WKTM) A TEXT('创建时间') A COLHDG('创建' '时间') A MTBRNO R REFFLD(@@BRNO) A TEXT('修改机构') A COLHDG('修改' '机构') A MTDPNO R REFFLD(@@DPNO) A TEXT('修改部门') A COLHDG('修改' '部门') A MTTLNO R REFFLD(@@TLNO) A TEXT('修改柜员') A COLHDG('修改' '柜员') A MTWKDT R REFFLD(@@WKDT) A TEXT('修改日期') A COLHDG('修改' '日期') A MTWKTM R REFFLD(@@WKTM) A TEXT('修改时间') A COLHDG('修改' '时间') A BKSTCD R REFFLD(@@STCD) A TEXT('记录状态') A COLHDG('记录' '状态') A K BKBRNO A K BKBXNO

从上面的例子可以看出,PF定义中首先要REF(DICT)引入数据字典,然后定义具体字段时候,REFFLD指明数据字典的基础类型字段。注意的是命名规范要求,具体字段的后4位必须和数据字典基础字段名字一致。这样在程序中可以轻松认出是哪种类型(这就是应用型匈牙利命名法,有关匈牙利命名法的误解和讨论参见《软件随想录 -- Joel on software》的第23章“让错误的代码显而易见”)。不同的PF字段名字可能会一样,因此在RPG程序中需要QUALIFIED防止重叠,这在后续“命名限定”时候再介绍。

那么如果在RPG程序中需要参照数据字典定义变量该怎么写呢。这里就需要使用一个新的关键字TEMPLATE,它可以引入一个PF结构但并不分配存储空间。同样让例子程序说话。

********************************************************************** **公共结构 **引入数据字典 DDICT E DS EXTNAME(DICT) QUALIFIED TEMPLATE ************************* **临时变量结构 DD_VARS DS **定义参照数据字典(LIKE)的变量 D V_BKBRNO LIKE(DICT.@@BRNO) D V_EQYNFG LIKE(DICT.@@YNFG) **定义无法参照的临时变量 D V_NUM 5P 0 **********************************************************************

先是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源码部分如下。

**BEGIN*************************************************************** **程序名称:数据字典枚举值 * **功能描述:数据字典枚举值常量定义 * ** * **版本:-11-08_1 * ** * **设计人员:PACMAN 开发人员:AUTOGEN * **设计日期:-08-30 开发日期:-08-30 * ** * **END***************************************************************** ** *是否标志:是YES D YNFG_YES C CONST('1') *是否标志:否NO D YNFG_NO C CONST('0') * *借贷标志:借方DEBIT D DCFG_DEBIT C CONST('1') *借贷标志:贷方CREDIT D DCFG_CREDT C CONST('2') * *记录状态:正常NORMAL D STCD_NORML C CONST('1') *记录状态:删除ABNORMAL D STCD_ABNML C CONST('2') *

在RPG程序中,通过D/COPY DSCPPGM,ENUM 即可引入数据字典枚举常量。之后就可以 EVAL V_EQYNFG=YNFG_YES 这么写了。

来自 “ ITPUB博客 ” ,链接:/283313/viewspace-1992224/,如需转载,请注明出处,否则将追究法律责任。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。