概述
很多项目人员在实施过程中会遇到这样尴尬的情况:流程的字段已经建好,且有流程已有数据存在,但是现在要换流程中的字段类型。根据公司先有的产品,必须先把这个字段清空,才能对该字段进行编辑删除,可是这样的话,历史数据就不能保存了。
基于上述情况下,写了该文本便于项目人员通过数据库,自己修改流程的字段类型,不影响历史数据的使用。
表结构
说到字段类型,会用到的表有:workflow_billfield 、htmllabelindex 、workflow_bill 、workflow_browserurl 、formtable_main_*。其中最关键的表为workflow_billfield这张表,下面介绍一下这张表的表结构:
表名称: | workflow_billfield | |
字段名称 | 描述 | 备注 |
Id | 主键 | 字段id |
Billid | 表单id | 表示该字段所属表单的ID。外键,对应的为workflow_bill该表的主键 |
Fieldname | 表单数据库名称 | 表示该字段字数据库表中的列名称 |
Fieldlabel | 字段显示名 | 外键,对应的为htmllabelindex表中的id |
Fielddbtype | 字段数据库类型 | 表示该字段所在表的类型 |
Fieldhtmltype | 字段变现形式 | 1:单行文本框
2:多行文本框 3:浏览按钮 4:check框 5:选择框 6:附件上传 7:特殊字段 |
type | 类型 | 当fieldhtmltype = 1 时:
1:文本 2:整数 3:浮点数 4:金额转换 5:金额千分位 当fieldhtmltype = 2时: 1:一般格式 2:html编辑器 当fieldhtmltype = 3时: 表示为浏览框,具体浏览类型,可以根据type到workflow_browserurl表中进行查询,type值对应的即为该表的id值 161 : 自定义单选 162 : 自定义多选 |
附表1:
字段表现形式 | Fielddbtype | Fieldhtmltype | type | |
单行文本框 | 文本 | varchar(x)
x代表字段长度,最大为999 |
1 | 1 |
整数 | int | 1 | 2 | |
浮点数 | decimal(15,x)
x代表小数位,1~4 |
1 | 3 | |
金额转换 | decimal(15,2) | 1 | 4 | |
金额千分位 | varchar(30) | 1 | 5 | |
多行文本框 | 非HTML | text | 2 | 1 |
是HTML | text | 2 | 2 | |
浏览按钮 | 一般 | 与workflow_browserurl中的fielddbtype对应 | 3 | 与workflow_browserurl中的id对应 |
自定义单选 | browser.x
x代表自定义浏览框标识 |
3 | 161 | |
自定义多选 | browser.x
x代表自定义浏览框标识 |
3 | 162 | |
Check框 | char(1) | 4 | 1 | |
选择框 | int | 5 | 1 |
介绍一下如何查询浏览框类型,查询workflow_browserurl这张表的结果集。
如果对表结果比较熟悉的话,可以根据该结果集中tablename列来知道该浏览框的类型,不知道也没关系啦。
在查询语句的结果集中找到labelid这一列,然后根据labelid去HtmlabelIndex表中去查询其对应的中文名:select * from htmllabelindex where id = ?
修改字段类型步骤
修改字段类型,往往需要以下步骤(下面将以把字段类型修改成单人力资源浏览框为例):
- 修改该字段在流程表单中的显示类型:
- 首先找到该字段的fieldid(如:6545)和字段名称(如:xgry),和字段对应的表单id(formid = 3)
- 从workflow_browserurl表中找到人力资源浏览框对应的id(1)和fielddbtype (int)
- 根据附表1所示,可以得出修改的SQL为:
UPDATE WORKFLOW_BILLFIELD SET Fielddbtype = ‘int’, Fieldhtmltype = ‘3’,type= ‘1’ where id = 6545
- 修改该字段所在表中的类型
- 在该表中新建一个新的字段,用于临时存放历史数据,由于是单人力资源浏览框,数据库字段类型应为INT型
ALTER TABLE FORMTABLE_MAIN_3 ADD TEMPFIELD INT NULL
- 将历史数据保存到临时字段中
Update SET FORMTABLE_MAIN_3 SET TEMPFIELD = XGRY
- 然后删除当前字段,重新添加
ALTER TABLE FORMTABLE_MAIN_3 DROP COLUMN XGRY
ALTER TABLE FORMTABLE_MAIN_3 ADD XGRY INT NULL
- 再将历史数据还原,删除临时字段
UPDATE FORMTABLE_MAIN_3 SET XGRY = TEMPFIELD
ALTER TABLE FORMTABLE_MAIN_3 DROP COLUMN TEMPFIELD
以上步骤,是修改一个字段类型的完成步骤。但是实际中往往有很多情况下不需要如此复杂,比如单行文本长度字段从50变100,这个可能就可以直接修改字段类型了;还有的时候,历史数据根本无法保存下来,比如说原文本字段,现在要改成整数,这种情况下就无法保留历史数据了。
转载请注明:赫非域 » ECOLOGY OA如何在数据库修改一个字段的类型