代码表介绍
在应用开发中,常常存在着这种情况。在数据存储时,我们存储的是一个 Id 值,而显示时,是一个具体的汉字。比如,性别,我们存储在记录中可能是 1 或者 2,但是显示时,1 则显示成“男",2 着显示成“女"。这种情况,我们叫做编码。
在 Toolkit 中,有两种编码形态。一种叫代码表(CodeTable),另外一种叫 EasySearch。这里,我们先介绍 CodeTable。
在编码中,存在一种数量比较小(一般不超过 50 个),内容相对固定不变,我们把这种称之为 CodeTable。
Toolkit 中提供了多种形式的代码表,比如将枚举类型定义为代码表,以 Xml 的方式定义代码表,按照数据库规范定义标准的代码表,用 Sql 的方式提取代码表。下面将介绍这些类型:
标准代码表
在数据库命名规范中,有如下定义:
代码表名称的命名为"CD*"+代码表的逻辑名称。(例如:性别代码表为 CD_SEX)。在 Toolkit 中,CD*开始的代码表,如无特别配置,可以不做 CodeTable 或者 EasySearch 的声明,系统自动注册。
代码表的字段名规定如下:字段名必须包含代码值、代码名称、代码拼音、代码排序和代码删除标记五个个字段。代码值、代码名称、代码拼音对应的字段名必须是"CODE_VALUE"、“CODE_NAME”、“CODE_PY”。字段代码排序和代码删除标记对应的字段名必须是"CODE_SORT"、“CODE_DEL”。其它附加字段也以"CODE_"为前缀。
关于字段的类型,CODE_DEL 是 smallint 类型,CODE_SORT 是 int 类型。其他三个都是 varchar 类型,根据具体业务需要确定长度。
例如,下面就是创建性别代码表的 SQL:
CREATE TABLE CD_SEX (
CODE_VALUE int NOT NULL,
CODE_NAME varchar(10) NULL,
CODE_PY varchar(5) NULL,
CODE_DEL smallint NULL,
CODE_SORT int NULL
)
通常情况下,标准代码表都是不需要做特别注册,但是如果需要数据进行一定的过滤,那么就需要进行 Xml 定义。需要在 Xml/Decoder 目录下创建 Xml 文件,并以 CodeTable.xml 作为结尾。
以下是具体的例子
<?xml version="1.0" encoding="utf-8"?>
<tk:Toolkit version="5.0" xsi:schemaLocation="http://www.qdocuments.net ..\..\schema\v5\CodeTable.xsd" xmlns:tk="http://www.qdocuments.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tk:StandardCodeTable TableName="CD_SX">
<tk:FilterSql>CODE_VALUE LIKE '3100%'</tk:FilterSql>
</tk:StandardCodeTable>
</tk:Toolkit>
枚举类型代码表
在代码中,常常会定义一些枚举类型,而枚举类型本身也可以作为一种代码表。由于枚举类型本身只是一个值定义。因此,Toolkit 提供了自定义的 Attribute 进行扩展。下面是枚举类型代码表的例子
[EnumCodeTable(Author = "YJC", CreateDate = "2015-10-21", Description = "插件类型的代码表")]
public enum PlugInType
{
[DisplayName("代码")]
Code,
[DisplayName("实例")]
Instance,
[DisplayName("配置")]
Xml
}
在每个枚举值上定义 DisplayNameAttribute,说明对应枚举值的中文说明,那么解码显示就对应显示相应的中文。同时必须在类型上标记 EnumCodeTableAttribute,这样系统就识别了,它是一个枚举代码表,会进行相应的注册。这里,没有在 EnumCodeTableAttribute 显式的说明 RegName 的值,那么类型名 PlugInType 就是这个代码的注册名。
采用 Xml 方式定义代码表
一些内容非常简单,而且保证不会变的内容,可以不用专门建一个数据库表,而是用 Xml 存放,这样简单方便。(当然,喜欢定义数据库表的,可以无视这个功能)
在 Xml/Decoder 目录下,可以定义这种结构的文件,需要注意,该文件名必须以CodeData.xml结尾。
下面就是相关的例子:
<?xml version="1.0" encoding="utf-8"?>
<tk:Toolkit version="5.0" xsi:schemaLocation="http://www.qdocuments.net ..\..\schema\v5\CodeData.xsd" xmlns:tk="http://www.qdocuments.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tk:CodeData RegName="CodeSex" Author="YJC" CreateDate="2014-07-12" Description="性别代码表">
<tk:Row>
<tk:Value>01</tk:Value>
<tk:Name>
<tk:Content>男</tk:Content>
</tk:Name>
</tk:Row>
<tk:Row>
<tk:Value>02</tk:Value>
<tk:Name>
<tk:Content>女</tk:Content>
</tk:Name>
</tk:Row>
<tk:Row>
<tk:Value>03</tk:Value>
<tk:Name>
<tk:Content>其他</tk:Content>
</tk:Name>
</tk:Row>
</tk:CodeData>
<tk:CodeData RegName="CodeWhether" Description="是否代码表" Author="YJC" CreateDate="2014-07-12">
<tk:Row>
<tk:Value>1</tk:Value>
<tk:Name>
<tk:Content>是</tk:Content>
</tk:Name>
</tk:Row>
<tk:Row>
<tk:Value>2</tk:Value>
<tk:Name>
<tk:Content>否</tk:Content>
</tk:Name>
</tk:Row>
</tk:CodeData>
</tk:Toolkit>
上面定义了两个代码表,一个是性别,一个是是否,注册名分别是 CodeSex 和 CodeWhether。需要注意,注册名必须在所有的代码表(包括各种类型)中保证唯一。对于重名的,系统只会加载一个,而踢掉另外一个。这样,可能会出现很古怪的界面效果。
使用 Sql 方式定义代码表
有时,需要通过 Sql 提取一段数据,作为代码表。这时,我们也需要进行 Xml 的配置。类似于标准代码表,在 Xml/Decoder 目录下,创建文件名以CodeTable.xml结尾的文件(也可以定义在已有的这样的文件中,看归类需要)
需要注意,Sql语句中,需要把Id的字段重命名为Value,把显示的名称的字段重命名为Name。
下面是 Sql 定义的例子:
<?xml version="1.0" encoding="utf-8"?>
<tk:Toolkit version="5.0" xsi:schemaLocation="http://www.qdocuments.net ..\..\schema\v5\CodeTable.xsd" xmlns:tk="http://www.qdocuments.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<tk:SqlCodeTable RegName="CDORG">
<tk:Sql>SELECT ORG_ID AS Value,ORG_NAME AS Name FROM SYS_ORGANIZATION</tk:Sql>
</tk:SqlCodeTable>
</tk:Toolkit>
关于TKCore的更多信息请点击:
http://www.tkcore.net
关注微信公众号获取TKCore最新资讯: