当前位置: 代码迷 >> Web前端 >> 【转】动态表单设计与兑现
  详细解决方案

【转】动态表单设计与兑现

热度:392   发布时间:2012-09-19 13:43:53.0
【转】动态表单设计与实现

?

动态表单的意义
  对于动态表单的探讨现在越来越多了。原因无非是表单在信息管理系统中的重要作用,基本上采用表单+流程就可以实现一个OA系统。然而数量众多的表单和易变动性让开发人员感到疲惫。为了让开发人员把注意力集中在业务流程上来,也可以让系统操作人员参与到表单的管理,就出现了动态表单技术。

信息管理系统

   通常情况下,表单加流程,就构成了一个信息管理系统。
   在对信息管理系统的探索中我们发现,按业务的量和成熟度,我们可以将业务系统是分为大业务系统和小业务系统。大业务具有业务量大且成熟稳定的特点。而小业务大部分也是新业务,具有业务量小和动态多变的特点。这些特点主要体现在业务流程和表单上的不同。

业务特点

   往往对新业务没有一个很好的系统支持,因为新业务的特性是市场前景不明,业务量小,表单和业务流程都随着业务的发展不断在变,越具有快速成长性的新业务可能变化更多。为一个新的业务开发一个独立的系统支持,从业务运营者角度看成本大,从系统开发者角度看难度更大。通常只有当新业务逐步发展,逐步稳定下来,业务量上去了,变成了一个大业务,才可以考虑建立独立系统支持或者移植到原有的大业务系统中去。所以对许多新业务的系统支持上比较薄弱。
  从现状来看,由于新业务没有系统支持,所以大部分采用各种excel表单的方式进行管理,一项业务的办理都是通过excel表单的流转。当然比纸制的要先进。不过,无序和低效表现得比较明显。?
  从技术上讲,新业务系统的开发需要解决可定制表单和流程的技术难题。本篇主要讨论如何为多变的表单提供一个解决方案。 我们看到许多业务都是由表单驱动,比如申请开通业务填写申请单,业务实施填写施工单。不过,随着业务的发展,这些表单包括字段和显示格式都在变。很显然,固定表单的开发无法满足这类用户业务需求。而作为软件开发者在做需求分析的时候,希望通过要求用户签字确认的方式来限制用户需求的变化,这样的做法不合情理,技术没有真正为生产服务。那么如何在新业务的发展阶段支持业务中多变的表单呢,我们就提出了动态表单


动态表单的实现思路

   分析一个表单,主要包含字段、数据,和表现形式这三个元素。数据和字段是成对出现的,可以进行格式化存入数据库或者xml文档。而表现形式可以采用html作为表单模板。现在html功能强大,可以表现复杂的表格。在没有OA系统的时候大部分表格是用word或者excel格式制作而成的,他们都有另存为html的功能。

   设计动态表单模型,基本的思路应该是数据和表现显示的分离。抛开表现层,一个表单包含的若干个字段和填写的数据。所谓动态,就是这些字段名称可能改变,数量可能有增减。
动态表单

?

   如何实现表现层。有一个思路也是动态生成表现层。实现一个表单设计器,把需要的字段类型从字段库里拖出来,摆在合适的位置,保存生成表单,系统可以通过这个表单录入数据。但即使我们可以把这个设计器做得很完美,定义表现层的这个过程也是一个非常繁琐,还可能要考虑打印的效果。所以对于复杂表单,这个方法不可取,要改变思路。   
   从现状况出发,因为已经有excel的表单存在,表现显示已经确定了。这是静态的。我们可以稍做修改,在其中插入字段名标签和数据项标签,用来对应动态表单字段名称和数据项。然后实现一个“表单解析器”。从这个预先定义好的模版中提取字段名称和数据项生成一个动态表单,并将这个模版做为展示页面。从用户操作的角度上看,在现有的excel表单的基础上设计显然简便多了,即使是一个新的表单,用excel设计界面也会比在我们实现的设计器中要简单而且精确,还可以预缆打印效果。从实现来看,动态表单的解析器比设计器要容易,而且更加符合需求。解析器的思路可取。
  解析器的实现是对特殊处理过的html文件进行解析,技术上可以使用功能强大的正则表达式。
  
动态表单解析器







数据标签的设计?
  生活中我们用到各种表单,需要填写各种表格。表单的作用是按固定的格式填写数据,让数据有条理。抛开排列位置次序等表现方式不管,表单是多个字段名称和紧跟其后需要输入数据组成,字段和数据总是一一对应。需要输入的数据可能多种类型,常用的是文本、单选、多选。在设计的动态表单的解析器时,需要使用特定字符组成的标签来表示字段域和数据域,以及不同类型的数据域。我们在总结html解析实践上总结出如下比较恰当的标签表示。
文本输入框样式:#字段名称#?? @@
单选按钮样式:#字段名称#?? @a1;a2;a3@?
复选框样式:#字段名称#?? @b1,b2,b3@?
文本域样式:#字段名称#?? @textarea@?
  同一张表单里应该避免相同的字段名称; 在“#”之间部分的字段才是系统所识别的字段;一对“#”对应一对“@” ; 字段名称与输入域只能是左右排列的关系,既“##”与“@@”只能是左右排列。
  考虑到多个表单之间可能存在的数据继承的关系。也是为了方便录入,希望填写表但B的时候部分数据是从已经填写的表单A中继承过来。两个表单中的#字段名称#?要相同。
  考虑到统计和打印显示查找等需要。需要把一些特殊的字段定义成关键字。在设计表单时候要字段名称要与关键字保持一致。



表单数据的查询
  动态表单如何实现方便的查询。比较动态表单的数据和固定表单的数据结构,一个固定表单是存放一条记录,这条记录是包含了表单内的n个字段,而一个动态表单,是一个字段一条记录,所以有n条记录。所以针对动态表单的查询,是需要牺牲效率。如何提高效率,可以设置一些关键字段,这些字段和表单信息在一起。针对关键字段的查询效率就高很多了。



动态表单之间的关系
  假设,一个业务进程有AB两个表单。为方便使用,A表单中某些字段的数据(比如业务编号)填写完后,B表单中相同字段需要继承下来。如何解决这个问题。在制作表单模板的时候,需要注意的是相同字段名称的书写方式要相同,比如不能多一个空格之类的。然后在程序实现B表单的填写时候读取A表单的数据,在相同字段对应的位置显示。


动态表单的局限性
  动态表单可维护性好,可以在很多信息管理系统中得到应用。但是毕竟是动态的,要损失掉效率。当系统数据量大,而且业务及表单结构稳定的情况下,固定表单是更好的方式。所以动态表当的适用范围是,是具有业务量小和动态多变的特点的业务系统,通常是一些新业务或是小业务。

动态表单的特殊应用
  假设我们只需关注字段和数据,而不必关注表单的表现形式,或只需要简单的按顺序排列字段就可以满足需要。也没有复杂的业务的概念,表单之间没有复杂的数据继承的关系,独立表单就可以作为业务的流转实体。这样就可以去掉了表单模板的部分和业务概念的部分,这个动态表单模型就更加简化。只需要操作Form,FormPattern,FormData,Field四个对象就可以了。这个模型的应用还是广泛存在的,比如学生的档案信息。

动态表单数据库设计

业务表t_service
一个业务包含了多个工单样式
表字段?
id:业务编号
departmentId :业务管理单位(中心节点)
serviceName:业务名称?
serviceType:业务类型,初始化14种业务
formPatternCount:工单样式数量,默认0?
pictureFilename:业务流程图片文件?
isAnnexAllowed:是否允许上传附件;0不允许,1表示允许
workingDay:任务计划总施工时间?
version:版本号。定义业务名称相同时候提示并自动生成一个新的版本,如果存在新的版本则在申请业务的时候给出最新版本。统计报表按业务名称相同 。 定义一个新版本的业务,旧版本自动作废。
Locked: 是否锁定,锁定后不能被申请?
creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人


工单样式表t_formPattern

记录表单样式
根据模版生成表单样式。
表字段
?
id:编号
templateId:模版编号,空或-1或模版不存在也表示不使用模版
formPatternType:表单样式类型,申请单 applicationForm,施工单 workingForm
formPatternName:表单名称
serviceId:业务编号,在系统中需要选定业务上传模版生成表单样式。 creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人

工单表t_form?
表单实体,继承自表单样式,可以填写数据。?
申请单相对与一个业务是唯一的,如果是工单,没有状态。
表字段?
id:表单编号,系统自动生成的流水号
formPatternId:表单样式编号
serviceId:业务编号,来自formPattern.serviceId,为了查询方便增加
formNumber 工单业务编号,工单编号是实际流转中的工单唯一标识。实施管理员输入,如果已经存在相同编号,系统需要提醒?
applicationId:申请(单)编号,表示该表单对应的申请单编号,来自Form.id and formPattern.formPatternType= applicationForm creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人

字段表t_field
?
记录表单定义的字段。字段包含有类型,枚举型数据去字点表查
表字段?
id:编号
formPatternId:表单样式编号
filedName:字段名称,从模版中提取出来
fieldTag:数据标签,用于与模版上的标签匹配,如果是?@@表示,使用序列关联
inputType:字段输入类型,输入框 text,下拉框(枚举型)select。单选radio,多选checkbox?
creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人

模版表t_template
?
定义表单的模版,表单通过模版打印。?
通过excle导出html文件,上传。
样式规则:
字段名称使用“#字段名称#”表示
字段名称对应的填写数据处使用“@@”表示
如果是枚举型的字段使用“@枚举域1; 枚举域2; 枚举域3@”表示
表字段?
编号id
模版名称templateName
模版路径filename
原文件名称sourceFilename?
creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人

数据表t_formData?
用于存放字段内的数据,字段内容支持最大1000个字符
表字段?
id:编号
fromId:表单编号。?
fieldId:字段编号
content:数据内容,支持最大1000个字符?
creator:创建人
dateCreated:创建时间
dateUpdated:更新时间,字段更新,表示表单也更新,?
modifier:修改人

T_keyfield关键字段表?
需要中fromdata.content表中读到数据利用触发器tr_formdata_keyfield写到form表中去,
表字段
Id
KeyfieldName:关键字段名字,例如“#工单编号#”
mappingTable:对应表,例如“t_form,t_application”
mappingField:在t_Form表中对应的字段 例如“formNumber”
mappingCondition:表的条件,例如where?id = v_formid?and?id<>applicationid;
disable:是否执行,1表示执行,2表示不执行
如果需要更新两个表,写两条记录,如果没有对应表则不其作用
触发器代码,例如
if?v_fieldname='#工单编号#'?then
update?t_form
set?formnumber = v_content,
modifier = v_modifier,
dateupdated =?sysdate
where?id = v_formid?and?id<>applicationid;
end?if;
if?v_fieldname='申请单号#'?then
update?t_form
set?formnumber = v_content,
modifier = v_modifier,
dateupdated =?sysdate
where?id = v_formid?and?id=applicationid;
update?t_application
set?applicationnumber = v_content,
dateupdated =?sysdate,
modifier = v_modifier
where?applicationid = v_formid;
end?if;




动态表单数据库设计

?

?

转自 :?http://www.chasion.com/freeform.asp

?

  相关解决方案