基于XML的动态表单设计
- 格式:pdf
- 大小:257.24 KB
- 文档页数:3
自定义表单设计思路为了满足与现有工作流系统的耦合,在对现有工作流进行适当修改的基础上,定制表单系统(包括与工作流相关的)的设计计划如下:1。
基本功能模块:部门、角色、人员信息、团队和组、职位(所有这些都可能是潜在的流程参与者)在现有基础上适当扩展。
2。
权限管理:在操作权限中增加字段权限和记录权限,即表单权限、记录权限和字段权限。
3。
表单的基本信息:表单对应的表实体和实体属性的定义;4。
可视化表单定制工具:实现基于网络的图形表单设计器,努力实现可拖动控件,不需要安装任何客户端控件;困难在于数据绑定,即页面元素到数据表字段的映射。
此外,动态数据存储结构、表间数据校验和计算、主从表建立等问题也是难点。
因此,相应的样式库、脚本库、函数库、模板库等。
应该建立。
5。
除了可视化的表单定制工具外,还应具有表单加载、表单分析、表单数据处理和表单存储功能;6.设计起点:努力为未来的系统实现准备(即系统的运行已经是过程驱动或服务驱动的),以面向服务或面向过程的方式构建系统,使未来的系统维护不会停留在代码级维护水平。
7。
设计目标:我们开发的定制表单系统是实现工作流和定制表单松耦合的好方法。
它使用自定义表单,能够有效地将工作流与工作流过程定义方法和工作流系统结构结合起来。
8.整个表单系统的设计采用分层建模的方法进行设计和开发,分为数据层建模、业务层建模和表示层建模9。
采用基于描述的方法来提高表单的可维护性、可扩展性和灵活性。
表单数据模型、业务模型和表示模型是否用XML描述,需要讨论后确定(设计的表单以XML的形式保存在数据库的指定表中);10。
最初假设我们开发的自定义表单系统是基于XForms标准,而不是传统的HTML表单标准。
表单数据、行为和表示的分类也需要在设计者表单模板+数据中得到反映,设计者表单模板+数据本质上是以XML为中心的,实现了表单数据模型和表示层(表单格式)的分离创建表单的一般步骤如下: 步骤1:定义表单的基本信息;的第二步是建立表单设计者的数学模型。
125摘要:随着信息技术的不断发展,数据在各行各业都发挥着越来越重要的作用,随之而来的问题是人们需要收集填报的数据也越来越多。
为了解决传统数据收集过程中遇到的数据表格单一、归集汇总繁琐易出错等问题。
论文设计并实现了一种基于动态表单的数据填报系统。
系统基于网络平台,采用B/S架构模式,界面简洁大方,操作简单,通过使用本系统,数据收集人员在线定制表格元素,填报者只需登录网站,提交信息即可,而其他细节都由程序自动完成,减少人工参与环节。
本系统的实现一方面可以提高数据填报效率,另一方面可以解决传统数据填报工作中耗费时间和精力、数据有差错、收集整理困难等问题,对于提高数据归集利用效率、更好发挥数据价值具有十分重要的实际价值。
关键词:动态表单;数据填报;数据管理;系统设计一、前言表格作为数据良好的载体,在各个领域得到广泛的使用,特别在当今自动化工作中,表格在各个部门间进行传递数据发挥了巨大的作用。
早期的数据统计表单大多采用纸张制作而成,可重用性差,而且浪费资源,从表格的制定、分发,再到填写汇总,整个过程繁琐而复杂,尤其当数据填报单位处在分散的地区时,统计数据的时效性将受到极大的耽搁[1]。
随着信息化技术的不断发展,开始逐渐采用电子化的方式收集填报数据,但当前应用比较广泛的方式主要包括Excel 电子表格和信息系统两种方式。
Excel 表格的方式仍然存在人工分发、收集的问题,不能满足对时效性和安全性要求较高的数据填报工作使用,而信息系统的方式会因系统内置表格相对固定导致不能灵活支持多种数据填报的使用需要。
因此,设计并实现一种能够动态设计表格,并能通过网络快速分发汇集的数据填报系统对提高工作效率具有一定的现实意义。
二、系统需求分析及功能设计(一)系统需求分析系统应具有相对完备的功能模块,通过使用本系统,可以解决当前数据汇集过程中遇到的问题,提高表格制作灵活性,简化表格分发汇总流程,提高数据填报归集应用质量和效率。
自定义表单设计思路为了满足和现有工作流系统的耦合,在适当改动现有工作流的基础上,对自定义表单系统(包括与工作流相关)的设计做出如下的规划:1.基础功能模块:部门、角色、人员信息、班组、岗位(这些都可能是潜在的流程参与者)在现有基础上适当扩展;2.权限管理:需要在操作权限的基础上增加字段权限和记录权限,也就是要实现表单权限、记录权限、字段权限;3.表单基本信息:表单对应的表实体的定义、实体属性定义等等;4.可视化的表单定制工具:实现基于web的图形化表单设计器,争取做到可拖拽控件,无需安装任何客户端控件;——难点为数据绑定,也就是页面元素与数据表字段的映射,另外动态数据存储结构问题、表间数据校验和计算、建立主从表的问题是难点;因此要建立相对应的样式库、脚本库、函数库、模板库等等。
5.除了可视化表单定制工具外应有:表单加载、表单解析、表单数据处理和表单存储功能;6.设计出发点:争取为今后我们做系统实现以面向服务或面向流程的方式构建系统做准备(即系统的运行已流程驱动或服务驱动),做到随需而变,使得将来的系统的维护不要停留在代码级的维护层面上;7.设计目标:我们开发出的自定义表单系统做到工作流和自定义表单松耦合实现为好,用户自定义表单并能与工作流有效结合的工作流过程定义方法及工作流系统结构;8.整个表单系统的设计采用分层建模方法进行设计与开发,可以分为:数据层建模、业务层建模以及表现层建模9.采用基于描述的方法来提高表单的可维护性、可扩展性以及灵活性,是否通过采用XML来描述表单数据模型、业务模型和表示模型需要讨论后确定(设计完成的表单以XML 形式保存到数据库指定表中);10.初步设想我们开发的自定义表单系统是基于XForms标准而非基于传统的HTML表单标准,分类表单数据,行为与表示也需要在设计器中体现出来——表单模板+数据,本质上是以XML为核心并且实现表单数据模型与表现层(表单格式)分离。
大致的建立表单步骤如下:第一步:定义表单基本信息;第二步:表单设计器数学模型的建立,表单设计器引擎是整个表单设计的核心;第三步:通过表单设计器定义表单样式和所有字段详细信息;第四步:定义对表单的各类基本操作(仅仅针对的是增、删、改、查的基本操作)。
java⾃定义表单动态表单表单设计器⼯作流引擎flowable项⽬源码特别注意:本代码为 Springboot ⼯作流前后分离 + 跨域版本(权限控制到菜单和按钮)后台框架:springboot2.3.0+ Flowable6.5.0+ mybaits+maven+接⼝前端页⾯:html +vue.js 形式 jquery ajax 异步跨域 json 格式数据交互前后分离,前后台分开部署(特别注意,前端⽤的vue.js, 就是html页⾯引⼊vue.js形式,⽤tomcat部署运⾏,更适合后台开发者1.代码⽣成器: [正反双向](单表、主表、明细表、树形表,快速开发利器)freemaker模版技术 ,0个代码不⽤写,⽣成完整的⼀个模块,带页⾯、建表sql脚本、处理类、service等完整模块2.多数据源:(⽀持同时连接⽆数个数据库,可以不同的模块连接不同数的据库)⽀持N个数据源3.阿⾥数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发⼯具编辑器5.调⽤摄像头拍照⾃定义裁剪编辑头像,头像图⽚⾊度调节6.websocket 及时站内信并声⾳提醒、实时在线管理、websocket及时刷新页⾯(完胜ajax技术)7.Flowable⼯作流⽬前公认⽐较好⽤的⼯作流引擎,集成web流程设计器⼯作流模块-------------------------------1.模型管理:web在线流程设计器、导⼊导出xml、复制流程、部署流程2.流程管理:导⼊导出流程资源⽂件、查看流程图、根据流程实例反射出流程模型、激活挂起3.运⾏中流程:查看流程信息、当前任务节点、当前流程图、作废暂停流程、指派待办⼈、⾃由跳转4.历史的流程:查看流程信息、流程⽤时、流程状态、查看任务发起⼈信息5.待办任务:查看本⼈个⼈任务以及本⾓⾊下的任务、办理、驳回、作废、指派⼀下代理⼈6.已办任务:查看⾃⼰办理过的任务以及流程信息、流程图、流程状态(作废驳回正常完成)办理任务时候可以选择⽤户进⾏抄送,就是给被抄送⼈发送站内信通知当前审批意见以及备注信息注:当办理完当前任务时,下⼀任务待办⼈会即时通讯收到新任务消息提醒,当作废和完结任务时,任务发起⼈会收到站内信消息通知------------------------------------------- 系统模块1. 权限管理:点开⼆级菜单进⼊三级菜单显⽰⾓⾊(基础权限)和按钮权限⾓⾊(基础权限): 分⾓⾊组和⾓⾊,独⽴分配菜单权限和增删改查权限。
Rdlc 动态加载xml 实现图表宽度(高度)自适应Rdlc 动态加载xml 实现图表宽度(高度)自适应2011-07-23 10:28bymr.张,442visits,收藏,编辑微软提供的Rdlc 报表为我们提供的很大的便利,功能强大,使用简单。
但在使用过程中总是有那么点美中不足:图表大小是固定的,不能根据内容自适应大小。
这就造成了如下情况,看图说话:数据少时图表比较稀疏数据多时图表很挤这对于我们追求完美的程序员来说是不能接收的,坚决要改造。
思路:Rdlc 是基于xml的,我们可以通过动态修改rdlc的xml数据,来更改rdlc 定义的图表大小。
宽度的计算:类别总数*序列数*(条形单位宽度+类别间隔)宽度计算根据图表的类型不同计算公式也不同,上述公式只适合"简单柱形图""简单条形图",其它类型的图表以后解决。
Rdlc报表xml解析:这里我们只需要动态改变图表的宽度和高度,需要知道如下几个节点:<Chart Name="chart1"> 中间数据省略</Chart> xpath 路径为: Report/Body/ ReportItems/ ChartChart的类型Type节点: <Chart><Type>Column</Type> </Chart> 其中Type为Column 代表简单柱形图,Type 为Bar 代表简单条形图Chart的宽度Width 节点: <Chart><Width>23cm</Width> </Chart>Chart的高度Height 节点: <Chart><Height>11.5cm</Height> </Chart>部分代码:public class RdlcReportHelper{private XmlDocument _rdlcDoc;private XmlNode _root;private string _chartName;private double _perWidth = 0.15; //厘米private XPathDocument xpathdoc;private XPathNavigator xnv;private XmlNamespaceManager xnm;private string[] _chartType = new string[] { "Bar", "Column" };public RdlcReportHelper(string path){//加载xml_rdlcDoc = new XmlDocument();_rdlcDoc.Load(path);_root = _stChild;xnm = newXmlNamespaceManager(_Table);xnm.AddNamespace("rd","/SQLServer/reporting/report designer");xnm.AddNamespace("default","/sqlserver/reporting/2005/01 /reportdefinition");xnm.PushScope();xpathdoc = new XPathDocument(path);xnv = xpathdoc.CreateNavigator();}/// <summary>/// 转换xml/// </summary>/// <returns></returns>public MemoryStream AutoSizeReport(){…………XmlNode ChartNode =_root.SelectSingleNode("//default:Body/default:ReportItem s/default:Chart[@Name='" + _chartName + "']", xnm); //查找Chart 节点XmlNode ChartTypeNode =ChartNode.SelectSingleNode("default:Type", xnm); //查找图表类型节点if (w != 0){if (ChartTypeNode.InnerText == "Bar"){XmlNode heightNode =ChartNode.SelectSingleNode("default:Height", xnm); //设置高度heightNode.InnerText = w + "cm";}else if (ChartTypeNode.InnerText == "Column"){XmlNode widthNode =ChartNode.SelectSingleNode("default:Width", xnm); //设置宽度widthNode.InnerText = w + "cm";}}}}如何使用:使用设计器设计好报表,设置要自动伸展的图表名称,类别字段、序列字段、值字段和单位宽度。
Android中的动画(XML方式)实践(逐帧动画与补间动画)属性动画。
逐帧动画:基于单元格的动画,每一帧显示一个不同的drawable。
一帧一帧的顺序播放。
补间动画:补间动画应用于view,通过对其位置,大小,旋转和透明度的改变,让view动起来。
属性动画:属性动画几乎可以让应用程序中任何对象动起来。
所有补间动画的内容,都可以通过属性动画实现。
下面逐一介绍:注:这篇文章偏重于以xml方式实现相应动画效果。
逐帧动画逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧一帧的播放图片,类似卡通动画。
目标:实现如下图效果:loading步骤:1.在res/drawable目录下新建loading_frame.xml文件:loading_frame.xml根节点是animation-list,内部由一到多个<item>节点组成oneshot属性表示是否只播放一次(true:一次;false:循环播放).item节点声明是一个动画帧,其中 android:drawable属性定义要显示的图像,android:druation代表此帧持续的时间,毫秒为单位。
注:在AndroidStudio中强制规定带animation-list节点xml文件必须放在res/drawable文件下(eclipse(ADT)貌似支持任意放res/drawable和res/anim)。
在androidStudio中若放在res/anim下会报错:错误提示:1错误提示:22.新建页面布局activity_frame.xml:如上图布局很简单上面一个imageview,下面两个button,都水平居中(相对于parent)。
3.新建FrameActivityframeActivity主要逻辑代码当然为了避免animationDrawable带来的内存泄露,建议在onDestroy方法中做如下操作:onDestroy注意:帧数比较多的动画不建议用逐帧动画实现,其一会显得卡顿,其二容易引起OOM。
编号:V1.0 Livecycle动态模板开发手册2015年9月目录1单证模板设计 (3)1.1创建表单 (3)1.2绘制表单 (5)1.2.1控件介绍 (5)1.2.2绘制过程 (11)1.3绑定数据 (14)1.4模板测试 (17)2数据文件生成 (19)3IDPDocEngineAgent安装配置 (19)1单证模板设计1.1创建表单1.使用LiveCycle Designer工具开发模板,首先打开工具,出现如下所示的页面,点击“新建表单”2.选择“使用空白表单”点击“下一步”。
3.页面大小可以选择“默认值”,也可以选择“A4纸”,或者其他的一些页面方向可以选择“纵向”,或者是“横向”,一般都是选择“纵向”。
页面选择“1”。
点击“下一步”4.“添加电子表单按钮”与“添加打印按钮”可以勾选,也可以不勾选,一般不勾选点击完成5.出现如下所示的空白表单—表单1(由“主页面”以及“无标题子表单”构成的)1.2绘制表单1.2.1控件介绍1.2.1.1页面控件如上图所示,一个表单中主要包含两类页面元素:1.主页面主页面的名称通常以英文命名,支持定义多个主页面1)页面设置当需要使用特殊纸型时,需要在主页面内进行定义。
如下图所示:2)内容区域设置每个主页面中只能存在一个内容区域(region-body区域),每个主页面中元素可以按照下图分5个区域放置,除内容区外其他支持的4区域每个都对应一个子表单subform,其名称分别为:region-before,region-after,region-start和region-end,并且只能设计为静态(引用)元素。
主页面其他4个区域不能与内容区域重合。
内容区域限定了以该内容区域为基础的普通页面的可绘制范围,通常我们可以理解为页边距。
在一般场景下,如果没有页头、页尾、侧边文字等需要打印在每一页上的内容,仅绘制内容区域范围即可。
内容区域的大小可以通过内容区域的布局属性来进行设置,如下图所示:2.普通页面除每页都需要打印的一些基础内容外,所有在单证中需要显示的表单元素均需要绘制在普通页面上。
1. 在 InDesgn 中进行页面设置时,装订方向分为左侧书脊和右侧书脊,在图书杂志出版中,目前只有( )等国家在部分书籍中使用右侧书脊装订的方式。
O 中国、日本、国、中国、O 美国、日本、国、中国、O 马来西亚、中国、日本、国、中国、O 新加坡、英国、美国、中国2. 在一般的出版物或印刷品设计时,版面出血边尺寸通常都设置为 ( ) mm,但也有例外会设置的稍大或稍小。
O 5O 15O 3O 23. 在描述印刷用纸时,通常都用克重来形容,如 128g 、250g 、300g 等,这其中的克重是指()的重量。
O 每纸O 每半纸O 每平方米纸4. 在设计中,有时会接触到 PANTONE 的色标,其中当印刷类色标中出现诸如: PANTONE100 C 或 PANTONE 100 U 时,其中 C 代表铜版纸,而 U 则代表( ) 。
O 新闻纸O 胶版纸O 特种纸O 卫生纸5. 在使用 InDesign 进行文档设置时,当选择左侧装订且使用对页模式时,边距与分栏选项中的上、下、左、右边距分别对应的是版面俗称的( ) 。
O 天头、地脚、订口、切口O 天头、订口、切口、地脚O 地脚、订口、天头、切口6. 目前 PDF 格式在越来越多的出版领域被广泛利用, PDF 文件格式的中文名称叫做 ( ),PDF 文件可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中, PDF 文件还可以包含超文本、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。
O EPS 格式O 便携式文档格式O 纯文本格式O 多信息文本格式7. 在 InDesign 的文档,是否可以置入带有图层的 PSD 文件和 PDF 文件。
( )O 是O 否8. 在使用 InDesign 进行版面编排时,能否一次性向页面置入多页 PDF 文档页面?O 能O 不能9. 当使用 InDesign 输出带有超的 PDF 文档后,浏览 PDF 文档,会发现没有办法转到相关,是因为在导出为 PDF 文件时没有选择( )选项。
标题:element form表单必填项文案动态展示随着互联网的发展,作为用户与网页进行交互的重要界面元素之一,表单在网页设计中占据着至关重要的地位。
表单的设计与交互对于提高用户体验,增加用户转化率具有重要的作用。
而在表单设计中,必填项的标识和提示,是影响用户是否完成表单填写的重要因素之一。
在Element组件库中,表单必填项文案动态展示的功能,为开发者提供了更加灵活和便捷的方式来展示和提示必填项,从而提高用户填写表单的准确性和效率。
一、什么是element form表单必填项文案动态展示在传统的表单设计中,往往需要给必填项添加标识符号“*” 或者在表单旁边的文字提示中标明“*”符号,来告知用户该项为必填项。
而在element form表单必填项文案动态展示中,则提供了更加灵活的方式来展示必填项标识。
开发者可以根据具体的需求和设计风格,在用户填写表单的过程中动态展示必填项的文案提示,为用户提供更加清晰、直观的提示,增强用户对于表单填写的主动性和参与度。
二、element form表单必填项文案动态展示的优势1. 提升用户体验:动态展示必填项文案可以让用户在填写表单的过程中更加清晰地了解哪些项是必填的,有助于提升用户的填写效率和体验。
2. 灵活性强:开发者可以根据具体的需求和设计风格,自定义必填项的动态展示方式,从而更好地融入到整体的页面设计中。
3. 提高表单准确性:通过动态展示必填项文案,可以让用户更加注意并重视必填项的填写,从而提高表单填写的准确性和完整性。
三、element form表单必填项文案动态展示的实现方式1. 在element form表单组件中,通过设置必填项的 rules 属性来定义每个表单项的校验规则,包括必填项的提示文案、校验规则等。
```javascript<el-form :rules="formRules" ref="formData"><el-form-item label="尊称" prop="name"><el-input v-model=""></el-input></el-form-item></el-form>```2. 在 rules 属性中,可以根据具体的需求和设计风格,定义必填项的提示文案,例如:```javascriptdata() {// 定义表单校验规则var checkName = (rule, value, callback) => {if (value === '') {callback(new Error('请输入尊称')); // 动态展示必填项提示文案 } else {callback();}};return {formRules: {name: [{ required: true, message: '请输入尊称', trigger: 'blur', validator: checkName } // 设置必填项的提示文案]}};}```3. 通过设置 rules 属性中的 message 来动态展示必填项的提示文案,当用户在填写表单时,如果未填写必填项,则会根据规则动态展示相应的提示文案,提醒用户进行填写。
在Excel 2003 中导入XML 映射、XML 列表和动态图表源发布日期: 11/12/2004 |更新日期: 11/12/2004John R. DurantMicrosoft Corporation适用于:Microsoft ® Office Excel 2003摘要:Web 文章Web Queries and Dynamic Chart Data in Microsoft®Excel 2002演示了如何使用Web 查询将数据导入到Microsoft®Excel 2002 中,然后创建一个可以动态响应源数据更改的图表。
本文介绍Microsoft® Office Excel 2003 如何取得相同的结果,而只使用少量的代码、较少的繁琐以及具有更大的潜力。
与此同时,您将更深入地了解Excel 2003 的XML 功能,最重要的是XML 映射、XML 列表、用于导入XML 的新增例程,以及如何使用动态填充的XML 列表作为图表的数据源。
本页内容业务方案Excel 2003 中的XML 映射Excel 列表将XML 数据导入Excel动态图表源小结业务方案假设某个销售经理会定期查看销售数据。
她要指定一个日期范围,然后合计销售数据。
特别是,她希望查看指定范围内按天总结的销售数字。
她希望在看到原始数据的同时也可以看到显示指定日期范围内的总计销售趋势的图表。
针对她的每个要求创建显式报表似乎不切实际。
为此,必须有人详细审查输入数据,然后为组织内可能存在的大量方案创建独立的电子表格报表。
这样的话,开发人员和IT 员工的负担就非常大,尤其是考虑到组织内并不只有一个部门的销售经理具有这种要求。
更好的方法是使Excel 电子表格可以自适应提供销售经理所需的各种报表,同时这些报表可以被其他部门的销售经理重复使用,并根据他们的相似需要进行调整。
本文说明如何使用Microsoft® Office Excel 2003 中的功能来导入数据,以及将图表动态绑定到数据。
本文介绍用ORACLE REPORTS BULIDER做为数据源,结合WORD创建RTF模板,制作XML报表的过程:一、用REPORTS BULIDER设计RDF报表,写好SQL语句二、在EBS中定义可执行并发程序三、在EBS中定义并发程序,注意输出格式选择XML四、将报表挂到请求,分配权限后执行报表,结果如下:五、将网页另存为XML文件,以备制作RTF模板时使用六、编辑RTF模板,需要安装Oracle BI Publisher Desktop安装完后在开始菜单可以看到相关工具七、打开WORD,可以看到多了一个功能面板,接下来开始编辑RTF模板:点示例XML打开前面保存的XML文件然后点击表向导,(也可以直接点所有字段按钮导入所有字段,然后根据需要删除不需要的字段)选择数据集选择字段选择分选择 序 式完 后 字段 :入页 页报表,可选择PDF TML EXCEL 格式后将WORD保存为RTF格式:、接下来在EBS中 入Oracle XML Publisher 定义数据,数字定义的 需 可执行的 字一 , 报表请求时 配到模板文件, 示一 XML数据,Oracle XML Publisher 需要用 分配、定义模板, 保存的RTF文件、 行后出 ,如下:出 :一、 请求编 , 过以下SQL语句 到 的 文件:SELECT cpp co curre t re uest id re id cp ode a e cp lo ile a e FROM d co c pp actio s cpp d co curre t processes cpW ERE cpp processor id cp co curre t process idA D cpp actio t peA D cpp co curre t re uest id二、使用FTP 件下 文件:分 出:击字段打开 , 制 面的 :打开WORD :点 文字 制的 , re 的 :保存 到模板重要:在编辑RTF模板生成字段前设置选项:设置表单字段大小为向后兼容可避免上图窗体域帮助文字的内容出现?ref的内容四、 行报表在选 中可以选择输出格式五、 行完看输出结果:RTF格式:XLS格式:TML格式:。
自定义表单设计思路为了满足和现有工作流系统的耦合,在适当改动现有工作流的基础上,对自定义表单系统(包括与工作流相关)的设计做出如下的规划:1. 基础功能模块:部门、角色、人员信息、班组、岗位(这些都可能是潜在的流程参与者)在现有基础上适当扩展;2. 权限管理:需要在操作权限的基础上增加字段权限和记录权限,也就是要实现表单权限、记录权限、字段权限;3. 表单基本信息:表单对应的表实体的定义、实体属性定义等等;4. 可视化的表单定制工具:实现基于web的图形化表单设计器,争取做到可拖拽控件,无需安装任何客户端控件;——难点为数据绑定,也就是页面元素与数据表字段的映射,另外动态数据存储结构问题、表间数据校验和计算、建立主从表的问题是难点;因此要建立相对应的样式库、脚本库、函数库、模板库等等。
5. 除了可视化表单定制工具外应有:表单加载、表单解析、表单数据处理和表单存储功能;6. 设计出发点:争取为今后我们做系统实现以面向服务或面向流程的方式构建系统做准备(即系统的运行已流程驱动或服务驱动),做到随需而变,使得将来的系统的维护不要停留在代码级的维护层面上;7. 设计目标:我们开发出的自定义表单系统做到工作流和自定义表单松耦合实现为好,用户自定义表单并能与工作流有效结合的工作流过程定义方法及工作流系统结构;8. 整个表单系统的设计采用分层建模方法进行设计与开发,可以分为:数据层建模、业务层建模以及表现层建模9. 采用基于描述的方法来提高表单的可维护性、可扩展性以及灵活性,是否通过采用XML来描述表单数据模型、业务模型和表示模型需要讨论后确定(设计完成的表单以XML形式保存到数据库指定表中);10. 初步设想我们开发的自定义表单系统是基于XForms标准而非基于传统的HTML表单标准,分类表单数据,行为与表示也需要在设计器中体现出来——表单模板+数据,本质上是以XML为核心并且实现表单数据模型与表现层(表单格式)分离。
InfoPath 2007 Solution王瑜 高级研究员 GrapeCity MSN: FudanWangyu@ Email: leo.wang@本次课程内容包括z InfoPath概览 z 由2003到2007 z 模板组件 z 模板导入 z InfoPath 2007 电子表单解决方案 z InfoPath 2007与其他系统集成 z What we can do?InfoPath 概览z 首次出现在Office 2003中 z Rich-client端程序 z 下一代电子表单处理平台z 收集商业数据z 纯XML数据 z 动态表单 z 多种数据展现和验证模式z 商业流程自动化z 与后台应用系统集成z 快速开发解决方案– 条件格式, 规则 – 支持内嵌脚本和托管代码深入InfoPath表单Template (XSN)data (.XML)Schema (XSD) Define of solution (XSF) URL or URN default (XML) logic (JS, DLL) view (XSLT)InfoPath所面临的挑战InfoPath非常棒, 如果能提供以下支持就更棒了 : z 让更多的用户能够使用(smart vs thin clients) z 更好地支持离线模式 z 更好地与其他Office组件集成 z 更好地集成到我们自己的应用程序中 z 更好地与后台应用系统集成 z 编程模式更加清晰InfoPath 2007 十大增强1. InfoPath直接嵌入Outlook 2. 将业务流程处理扩展到防火墙之外 3. 导入Word和Excel文档 4. 预定义表单部件. 5. 将表单数据转换为PDF和XPS文档.InfoPath 2007 十大增强6. 基于InfoPath 2007 and OSS 2007实现工作流 7. 表单同时支持网页浏览器和InfoPath 2007客户端 8. 增强的表单数据保护模式 9. 增强的表单开发和部署模式 10. 与 2005集成模板部件(Template Parts)z 一些可重用的, 用于构成表单的部件 z 自动更新 z 支持特性z 条件格式 z 主数据源和辅助数据源 z 规则, 数据验证, 条件格式 z 公式和计算字段z 不支持代码模板部件模板导入XYZ Document Your Importer InfoPath DesignerXSN Folder (XSF, etc)z 内建支持 Word, Excel文档 z 可扩展的架构: IFormTemplateConverter z 可以与Design Checker配合工作导入Word文档InfoPath 2007 电子表单解决方案Intranet Extranet / InternetBrowser BrowserInfoPath Client (Design Mode)Office 2007 servers Forms ServicesInfoPath Client (Edit Mode)InfoPath Client (Edit Mode)InfoPath表单提交模式的选择z 智能客户端(Smart Client)– – – – Outlook中使用InfoPath 离线数据缓存 直接输出到其他Office应用程序 支持IRMz 瘦客户端(Thin Client)– 基于服务器端的表单管理 – 表单呈现在浏览器中 – 支持各种平台和浏览器• IE 6+, Safari, Netscape, Firefox (latest versions) • Windows, Mac, Linux, Unix • Mobile devices (HTML compatible browsers)InfoPath表单交互模式: 智能客户端Office 2007 servers InfoPath Client Download XSN, XMLXSNWSSXSN, XML loaded Business logic execution Rendering Validation Execute calculations Execute rules Editing actionsInfoPath表单交互模式:网页浏览器Postback event log via XMLHTTP BrowserOffice 2007 serversXSN, XML loaded Business logic execution Replay event logGenerateASPX WSSDownload script and data array Return updated data arrayGenerate and render HTML (using script) Validation Execute calculations Execute rules Editing actions (All using script)XSN设计InfoPath模板z 服务器/客户端设计模式z 智能客户端与浏览器端合二为一z支持条件格式, 数据校验, 规则,计算字段, 数据连接Designerz 仅智能客户端支持z离线数据缓存,自定义的Activex控件, 主细表,Task Pane, IRM, 脚本代码z 表单设计阶段即可验证是否可以在浏览器上正 常运行InfoPath 2007部署到 WSS 3.0上InfoPath 2007 集成z 网页集成– 表单嵌入ASPX网页z 应用程序集成– InfoPath作为Activex控件直接嵌入第三方应用程序z 电子邮件集成– Outlook中嵌入InfoPath表单z 与其他Office 产品集成– 工作流 – 文档属性面板InfoPath 2007 集成InfoPath无处不在对.NET开发人员的支持z全托管代码(CLR 2.0): 不再需要使用PIA z使用System.Xml, 废弃MSXMLz更好的开发体验–Visual Studio Tools for Office (VSTO)•直接在2005里面设计表单我们的机会z构建更灵活的InfoPath解决方案–使用InfoPath作为解决方案的前端组件跨越internet, intranet)z在各种第三方系统里面嵌入InfoPath表单–网页程序–Windows程序–手持移动设备z围绕InfoPath的二次开发–创建各种表单模板和转换器–创建各种插件–定制TaskPanes–创建工作流组件小结z InfoPath: 基于纯XML格式的电子表单设计和填写工具.z InfoPath 2007中的新特性使我们开发出的电子表单解决方案更加强大,更具灵活性.z InfoPath已经成为整个信息工作者解决方案中的一个重要角色. 甚至可以独立支撑起一个完整的数据流转和处理解决方案.Thank You获取更多MSDN资源•MSDN中文网站/china/msdn•MSDN中文网络广播•MSDN Flash/china/newsletter/case/ msdn.aspx•MSDN开发中心/china/msdn/Developer Center/default.mspxQuestion & Answer如需提出问题,请单击“提问”按钮并在随后显示的浮动面板中输入问题内容。
BIRT 使用xml动态数据源总结博客分类:•Java&EclipseXML数据结构EclipseWebworkMySQL因为系统需要,添加报表功能,瞄上了birt,学习之,入门教程看了一大堆,还好,多种数据源支持,对于sql还没精通,看着一大堆sql还有点犯难,所以,xml数据源成了我的首选,仔细研究之下,发现原来birt提供的初级功能原来很少,报表经常需要替换数据源来显示其不同的内容,而传统的设置 xml数据源只是事前指定好xml文件,或url,google了一下,基本没有发现可用的例子,郁闷之,自己琢磨了一周几乎,更郁闷的是其实问题早有了答案,就载在acegi的权限控制之上一直未看到胜利的曙光下面把自己动态修改xml数据源的成功发上来我用的是webwork,其他用户请酌情修改相应参数这个是用来view报表的action 需要传入的参数是reban.reportName = 报表文件的文件名rbean.xmlDataUrl = 报表xml datasource url ,可以是stream,或xxx.xml 之类的,输入浏览器能显示xml即可BirtReportViewer.javaJava代码1.package com.morepower.controller.birt;2.3.import java.io.ByteArrayInputStream;4.import java.io.ByteArrayOutputStream;5.import java.io.InputStream;6.7.import javax.servlet.ServletContext;8.import javax.servlet.http.HttpServletRequest;9.10.import org.eclipse.birt.report.engine.api.EngineConstants;11.import org.eclipse.birt.report.engine.api.HTMLRenderOption;12.import org.eclipse.birt.report.engine.api.HTMLServerImageHandler;13.import org.eclipse.birt.report.engine.api.IHTMLRenderOption;14.import org.eclipse.birt.report.engine.api.IRenderOption;15.import org.eclipse.birt.report.engine.api.IReportEngine;16.import org.eclipse.birt.report.engine.api.IReportRunnable;17.import org.eclipse.birt.report.engine.api.IRunAndRenderTask;18.import org.eclipse.birt.report.model.api.DataSourceHandle;19.import org.eclipse.birt.report.model.api.ElementFactory;20.import org.eclipse.birt.report.model.api.OdaDataSetHandle;21.import org.eclipse.birt.report.model.api.OdaDataSourceHandle;22.import org.eclipse.birt.report.model.api.ReportDesignHandle;23.import org.eclipse.birt.report.model.api.TableHandle;24.import org.eclipse.birt.report.model.api.activity.SemanticException;25.26.27.import com.morepower.controller.AbstractAction;28.import com.morepower.util.BirtEngine;29.import com.morepower.view.BirtReporterBean;30.import com.opensymphony.webwork.ServletActionContext;31.import com.opensymphony.webwork.interceptor.ServletRequestAware;32.33.public class BirtReportViewer extends AbstractAction implements34. ServletRequestAware {35. /**36. *37. */38. private static final long serialVersionUID = 1L;39. private static String REPORT_DIR = "birt-reportors";40. private static String REPORT_IMAGE_DIR = "images";41. private IReportEngine birtReportEngine = null;42. private HttpServletRequest request;43. private BirtReporterBean rbean;44. private InputStream reportStream;45. private static String DATASOURCE_NAME = "DataSource";46. private static String DATASET_NAME = "DataSet";47. private static String QueryText = "";48.49. public InputStream getReportStream() {50. return this.reportStream;51. }52.53. @Override54. public String execute() throws Exception {55. // get report name and launch the engine56. // resp.setContentType("text/html");57. // resp.setContentType( "application/pdf" );58. // resp.setHeader ("Content-Disposition","inline; filename=test.pdf");59. String reportName = rbean.getReportName();60. ServletContext sc = ServletActionContext.getServletContext();61. birtReportEngine = BirtEngine.getBirtEngine(sc);62. IReportRunnable design = birtReportEngine.openReportDesign(sc63. .getRealPath(java.io.File.separator + REPORT_DIR)64. + java.io.File.separator + reportName);65.66. ReportDesignHandle report = (ReportDesignHandle) design67. .getDesignHandle();68.69. // 只是动态更换数据源即可,不需改变报表的其他结构70. // 暂时不支持动态创建表格71.72. // create task to run and render report73. buildReport(report);74. IRunAndRenderTask task = birtReportEngine75. .createRunAndRenderTask(design);76. task.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY,77. BirtReportViewer.class.getClassLoader());78.79. // set output options80. HTMLRenderOption options = new HTMLRenderOption();81. options.setImageHandler(new HTMLServerImageHandler());82. options.setImageDirectory(sc.getRealPath(java.io.File.separator83. + REPORT_IMAGE_DIR));84. options.setBaseImageURL(request.getContextPath()85. + java.io.File.separator + REPORT_IMAGE_DIR);86. options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);87. options.setOption(IRenderOption.HTML_PAGINATION, Boolean.TRUE);88. options.setOption(IHTMLRenderOption.MASTER_PAGE_CONTENT, new Boolean(89. true));90.91. // options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);92. options.setOption(HTMLRenderOption.HTML_ENABLE_METADATA, Boolean.FALSE);93. ByteArrayOutputStream bout = new ByteArrayOutputStream();94. //String renderstr = bout.toString("utf-8");95. options.setOutputStream(bout);96. task.setRenderOption(options);97.98. /*99. * 另外一种方案,直接在action中构造inputStream 对像,但这样100.* 可能导致你的报表viewer与具体业务类耦合!101.* task.getAppContext().put(org.eclipse.datatools.enablement.oda.xml.Constants.APPCONTEXT_INPUTSTREAM, 102.reportStream);103.task.getAppContext().put(org.eclipse.datat ools.enablement.oda.xml.Constants.APPCONTEXT_CLOSEINPUTSTREAM,104.Boolean.TRUE);*/105.106.// run report107.108.task.run();109.task.close();110.reportStream = new ByteArrayInputStre am(bout.toByteArray());111.112.return SUCCESS;113.}114.115./**116.* 清除原有的数据源117.*/118.protected void clearDataSource(ReportDesignHandle designHandle) {119.//DataSourceHandle dsh = designHandle.f indDataSource(DATASOURCE_NAME);120.//dsh.drop();121.int count = designHandle.getDataSources ().getCount();122.123.try {124.for (int i = 0; i < count;i++)125.designHandle.getDataSource s().drop(i);126.} catch (SemanticException e) { 127.log.error(e);128. e.printStackTrace();129.}130.}131.132./**133.* 清除原有的数据集134.*/135.protected void clearDataSet(ReportDesignHandle designHandle) {136.getQueryText(designHandle);137.int count = designHandle.getDataSets().getCount();138.try {139.for (int i = 0; i < count;i++)140.designHandle.getDataSets() .drop(i);141.} catch (SemanticException e) { 142.log.error(e);143. e.printStackTrace();144.}145.}146.147./**148.*149.*/150.protected void getQueryText(ReportDesignHandle designHandle) {151.QueryText = (String) designHandle.getDa taSets().get(0).getProperty(152."queryText");153.}154.155.protected void buildReport(ReportDesignHandle d esignHandle) {156.try {157.ElementFactory designFactory = designHandle.getElementFactory();158.buildDataSource(designFactory, de signHandle);159.buildDataSet(designFactory, desig nHandle);160.TableHandle table = (TableHandle) designHandle.getBody().get(0);161.table.setDataSet(designHandle.find DataSet(DATASET_NAME));162.163.} catch (SemanticException e) { 164.log.error(e);165. e.printStackTrace();166.}167.168.}169.170.protected void buildDataSource(ElementFactory d esignFactory,171.ReportDesignHandle designHandle) throws SemanticException {172.clearDataSource(designHandle);173.OdaDataSourceHandle dsHandle = designFa ctory.newOdaDataSource(174.DATASOURCE_NAME, 175."org.eclipse.birt.report.d ata.oda.xml" );176./*dsHandle.setProperty( "odaDriverClass",177."com.mysql.jdbc.Driver" );178.dsHandle.setProperty( "odaURL", "jdbc:my sql://localhost/stat" );179.dsHandle.setProperty( "odaUser", "root");180.dsHandle.setProperty( "odaPassword", "");*/181.dsHandle.setProperty("FILELIST", rbean.ge tXmlDataUrl());182.designHandle.getDataSources().add(dsHandle );183.}184.185.protected void buildDataSet(ElementFactory desi gnFactory,186.ReportDesignHandle designHandle) throws SemanticException {187.188.clearDataSet(designHandle);189.OdaDataSetHandle dsHandle = designFacto ry.newOdaDataSet( DATASET_NAME,190.//"org.eclipse.birt.report.data.oda.jdbc.J dbcSelectDataSet" );191./* OdaDataSetHandle dsHandle = desig nFactory.newOdaDataSet(DATASET_NAME,*/192."org.eclipse.birt.report.d ata.oda.xml.dataSet");193.dsHandle.setPrivateDriverProperty("XML_FIL E", rbean.getXmlDataUrl());194.dsHandle.setPrivateDriverProperty("MAX_ROW ", "-1");195.dsHandle.setQueryText(QueryText);196.dsHandle.setDataSource(DATASOURCE_NAME);197.designHandle.getDataSets().add(dsHandle);198.199.}200.201.@Override202.public void setServletRequest(HttpServletRequest arg0) {203.request = arg0;204.205.}206.207.@Override208.public void destory() {209.BirtEngine.destroyBirtEngine();210.}211.212.public BirtReporterBean getRbean() {213.return rbean;214.}215.216.public void setRbean(BirtReporterBean rbean) {217.this.rbean = rbean;218.}219.220.@Override221.public void initilize() {222.try {("报表系统初始化中............");224.BirtEngine.initBirtConfig(); 225.REPORT_DIR = BirtEngine.getBirtR eportorProperty("report_dir");226.REPORT_IMAGE_DIR = BirtEngine227..getBirtReportorPr operty("report_image_dir");228.DATASOURCE_NAME = "DataSource";229.DATASET_NAME = "DataSet"; 230.} catch (Exception e) {231. e.printStackTrace();232.log.error(e);233.}234.}235.236.}BirtEngine.javaJava代码1.package com.morepower.util;2.import java.io.InputStream;3.import java.io.IOException;4.import java.util.Properties;5.import java.util.logging.Level;6.7.import mons.logging.Log;8.import mons.logging.LogFactory;9.import org.eclipse.birt.report.engine.api.EngineConfig;10.import org.eclipse.birt.report.engine.api.IReportEngine;11.import javax.servlet.*;12.import org.eclipse.birt.core.framework.PlatformServletContext;13.import org.eclipse.birt.core.framework.IPlatformContext;14.import org.eclipse.birt.core.framework.Platform;15.import org.eclipse.birt.core.exception.BirtException;16.import org.eclipse.birt.report.engine.api.IReportEngineFactory;17.18.public class BirtEngine {19. private static IReportEngine birtEngine = null;20. private static Properties configProps = new Properties();21. private final static String configFile = "BirtConfig.properties";22. protected final static Log log = LogFactory.getLog(BirtEngine.class);23. public static synchronized void initBirtConfig() {24.25. loadEngineProps();26. }27.28. public static synchronized IReportEngine getBirtEngine(ServletContext sc) {29. if (birtEngine == null) {30. EngineConfig config = new EngineConfig();31. if (configProps != null) {32. String logLevel = configProps.getProperty("logLevel");33. Level level = Level.OFF;34. if ("SEVERE".equalsIgnoreCase(logLevel)) {35. level = Level.SEVERE;36. } else if ("WARNING".equalsIgnoreCase(logLevel)) {37. level = Level.WARNING;38. } else if ("INFO".equalsIgnoreCase(logLevel)) {39. level = ;40. } else if ("CONFIG".equalsIgnoreCase(logLevel)) {41. level = Level.CONFIG;42. } else if ("FINE".equalsIgnoreCase(logLevel)) {43. level = Level.FINE;44. } else if ("FINER".equalsIgnoreCase(logLevel)) {45. level = Level.FINER;46. } else if ("FINEST".equalsIgnoreCase(logLevel)) {47. level = Level.FINEST;48. } else if ("OFF".equalsIgnoreCase(logLevel)) {49. level = Level.OFF;50. }51.52. config.setLogConfig(configProps.getProperty("logDirectory"),53. level);54. }55. //sc.getRealPath("")+java.io.File.separator+configProps.getProperty("engine_home")56. config.setEngineHome("");57. IPlatformContext context = new PlatformServletContext(sc);58. (context.getPlatform());59. config.setPlatformContext(context);60.61. try {62. Platform.startup(config);63. } catch (BirtException e) {64. e.printStackTrace();65. }66.67. IReportEngineFactory factory = (IReportEngineFactory) Platform68. .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);69. birtEngine = factory.createReportEngine(config);70.71. }72. return birtEngine;73. }74.75. public static synchronized void destroyBirtEngine(){76. if (birtEngine == null) {77. return;78. }79. birtEngine.shutdown();80. Platform.shutdown();81. birtEngine = null;82. }83.84. public Object clone() throws CloneNotSupportedException {85. throw new CloneNotSupportedException();86. }87.88. private static void loadEngineProps() {89. try {90. // Config File must be in classpath91. ClassLoader cl = Thread.currentThread().getContextClassLoader();92. InputStream in = cl.getResourceAsStream(configFile);93. configProps.load(in);94. in.close();95.96. } catch (IOException e) {97. e.printStackTrace();98. }99.100.}101.public static String getBirtReportorProperty(St ring key){102.return configProps.getProperty(key);103.}104.105.}robin 写道使用方法在浏览器中输入urlhttp://localhost:8800/stat/birtviewer.action?rbean.reportName=inde x.rptdesign&rbean.xmlDataUrl=http://localhost:8800/stat/armrptxml.act ion?reporter.id=008a81b61c30d47e011c4f446718001b对报表熟悉的人应该知道这个方法。