用友软件股份有限公司研发过程
U9报表组件模型开发规范
文件编号:版本号:修改状态:编写人:审核人:批准人:批准时间:
U9-SE-××-SPEC-×× 0
吴运刚/陈宇 2008-07
第 1 页 共 18 页
适用对象
该规范适用于U9报表设计人员和开发人员。
版本记录
【此部分要记录该文档形成过程中的历次版本变更过程及变更的内容】 版本
1.0
修改与参与人
吴运刚/陈宇
修改时间
2008/07/01
修改原因
原始文档建立
修改概述 审批人
相关文档
¾ 《U9研发体系(交互设计规范)》
约定
标有 ★ 的条目表示强制性规范。
第 2 页 共 18 页
报表组件模型开发规范细则
1. 报表开发规范
1.1. 概论
报表的开发,涉及UI、组件、报表工具多个方面的设计。为了保证报表开发模式的一致性,制定了该规范。
其中:
UI的通用规范,按照《UBF2.5.1UI编程实践.doc》《U9 V1.0 交互设计规范》执行 组件的通用规范:按照《Object Query Language 使用指南.doc》《U9组件-开发规范标准细则》执行
1.2. UI(报表界面)
报表界面交互,整体要符合《U9 V1.0交互设计规范》。
1.2.1. 解决方案命名规则
名称:服务组名称+RptUI组成。 粒度:一个服务组一个解决方案
举例:
当前服务组是GL,那么解决方案的名称就为GLRptUI.ubfsln。
1.2.2. 项目命名规则
名称:报表名称+RptUI; 粒度:一张报表一个项目
举例:
GL总账,命名为GeneralLedgerRptUI.ubfuiproj。
第 3 页 共 18 页
1.2.3. 项目装配件属性命名规则
名称:UFIDA.U9.领域名称.服务组.报表名称+RptUI
注:修改方法:在模型视图中选中项目,然后查看其属性。 属性中的“配件名”即该项目的装配件属性。
举例:
财务领域的总账服务组中的总账:UFIDA.U9.FI.GL.GeneralLedgerRptUI
1.2.4. UIModel的命名规则
名称:报表名称+RptUIModel
举例:
总账的名称为:GeneralLedgerRptUIModel
1.2.5. UIModel的命名空间的命名规则
名称:UFIDA.U9.服务组.报表名称+UIModel; 注:UIModel的命名空间修改方法:双击*.ubfuim视图中的用户界面模型树中的根节点。弹出画面中的“命名空间”项。
举例:
总账的命名空间:
UFIDA.U9.GL.GeneralLedgerRptUIModel;
1.2.6. UIForm的命名规则
名称:报表名称+RptUIForm
举例:
第 4 页 共 18 页
总账的结果画面UIForm的名称: GeneralLedgerRptUIForm。
1.3. ReportTemplate(报表模版)
1.3.1. 解决方案命名规则
名称:领域名称+RptTemplate组成。 粒度:一个领域一个解决方案
举例:
财务领域,解决方案的名称为FIRptTemplate.ubfsln。
1.3.2. 项目命名规则
名称:服务组名称;
粒度:一个服务组一个项目
举例:
总账:命名为GL.ubfanproj。
1.3.3. 报表命名规则
名称:报表名称 举例:
总账,GeneralLedger.urdl。
1.3.4. 参数规则
报表参数、查询参数、DataCommand中参数三者要保持一致。
第 5 页 共 18 页
1.4. ProcessStratety(报表处理策略)
1.4.1. 解决方案命名规则
名称:领域名称+RptProcessStrategy组成。 粒度:一个领域一个解决方案
举例:
财务领域,解决方案的名称为FIRptProcessStrategy.sln。
1.4.2. 项目命名规则
名称:UFIDA.U9.服务组.Report.ProcessStrategy 粒度:一个服务组一个项目
举例:
总账:UFIDA.U9.GL.Report.ProcessStrategy.csproj
1.4.3. 项目装配件属性命名规则
名称:UFIDA.U9.服务组.Report.ProcessStrategy
举例:
总账:UFIDA.U9.GL.Report.ProcessStrategy
1.4.4. 命名空间属性命名规则
名称:UFIDA.U9.服务组.Report.ProcessStrategy
举例:
总账:UFIDA.U9.GL.Report.ProcessStrategy
第 6 页 共 18 页
1.5.
DataCommand(报表数据)
1.5.1. 解决方案命名规则
名称:领域名称+RptDataCommand组成。 粒度:一个领域一个解决方案
举例:
财务领域,解决方案的名称为FIRptDataCommand.sln。
1.5.2. 项目命名规则
名称:UFIDA.U9.服务组.Report.DataCommand 粒度:一个服务组一个项目
举例:
总账:UFIDA.U9.GL.Report.DataCommand.csproj
1.5.3. 项目装配件属性命名规则
名称:UFIDA.U9.服务组.Report.DataCommand
举例:
总账:UFIDA.U9.GL.Report.DataCommand
1.5.4. 命名空间属性命名规则
名称:UFIDA.U9.服务组.Report.DataCommand
举例:
总账:UFIDA.U9.GL.Report.DataCommand
第 7 页 共 18 页
1.5.5. 类命名规则
DataCommand类命名 :报表名称+Cmd DataSource类命名 :报表名称+Ds
举例:
总账数据源: GeneralLedgerDs
总账DataCommand :GeneralLedgerCmd
1.5.6. ReportParams命名规则
Cmd+ DS1 Cmd+ DS2 …..
Cmd+ DSn
1.6. 业务处理规范 1.6.1. OQL调用规范
使用代码生成工具,先生成 框架代码 ,然后在DataCommand类文件中添加必要的逻辑代码
注意:
1 代码中需要访问数据库的地方都必须使用 EntityViewQuery来执行
Oql的方式来处理,不能通过实体来查询 后台处理不能直接调用BE或BP。
1.6.2. 条件校验规范
对条件项的所有校验都在UI端进行,必输校验由条件控件完成(需要在条件定义时,将
) 是否为空设为否),其他的校验,在报表处理策略中完成。(重载VerifyParameters()
1.6.3. DataCommand提交规范
DataCommand类的提交标准,必须通过测试用例的验证,才能部署到报表服务器上。
第 8 页 共 18 页
2. 报表发布规范
2.1. 报表各个角色职责
2.1.1. 报表服务组负责人
例如:GL服务组 在U9UICode\\U9.VOB.PD.FI\\GL\\Model\\ 下创建 ReportMetaData 报表开发人员将自己的报表通过UBFStudio 导出到该目录 更新CC视图后,进入UBFStudio中报表元数据管理界面,点中GL服务组, 右键点导入操作,选择元数据所在目录,如下图
在U9UICode视图中建立元数据目录。 更新本服务组报表元数据目录。
在UBFStudio报表元数据管理导入。 导出到U9Data视图中相应位置。
导入完毕后,在右键点导出,选择
U9Data\\U9.VOB.Data\\SystemData\\StdSqlScript\\ReportMetaData\\Report\\FI\\GL
第 9 页 共 18 页
2.1.2. 报表开发人员
将自己负责的报表导出到U9UICode视图中相应位置,并加入到CC
2.2.
元数据管理
2.2.1. 导出元数据位置
各个开发部门负责维护自己的报表发布和导出。位置分别为U9Data视图中的
U9Data\\ U9.VOB.Data\\SystemData\\StdSqlScript\\ReportMetaData\\Report\\FI U9Data\\ U9.VOB.Data\\SystemData\\StdSqlScript\\ReportMetaData\\ Report \\SCM U9Data\\ U9.VOB.Data\\SystemData\\StdSqlScript\\ReportMetaData\\ Report \\MFG U9Data\\ U9.VOB.Data\\SystemData\\StdSqlScript\\ReportMetaData\\ Report \\HR
2.2.2. 报表模型结构
服务组名称-报表名称
第 10 页 共 18 页
3. 报表模板开发规范
1.1 报表布局规范
一般文本格式:宋体, 9pt,黑色,居左,行高:0.2 1.1.1 表头
1) 标题
字体:宋体, 11pt, style=Bold 边框颜色:White 位置(X/Y):0.050/0.01
1.1.2 明细
1) 表格头:
行度:0.2 字体:宋体, 9pt
背景色:RGB(230,230,230) 文本位置:居中 2) 表格体
第 11 页 共 18 页
行度:0.2 字体:宋体, 9pt 背景色:White
文本位置:文字居左、数字居右、时间居左(?) 3) 表格尾
行度:0.2 字体:宋体,9号
背景色:RGB(255,244,171) 1.1.3 表尾
1.2 报表条件项规范
1.2.1 条件项之间的约束控制
1) 需求文档里特殊说明的需要才进行控制。例如,要输入账簿,才能选择会计期间;
1.2.2 条件操作符规范
需求文档中的取值方式与平台条件项的匹配:
1.2.3 其它条件项规范
1) 基本条件和高级条件全部由需求指定,需求未指定的不作为条件。
2) 文档里默认方案=y的,是默认基本条件,需求文档里默认方案=F的为固定条件,不能从基本条件中移除。
1.3 报表栏目项规范
1) 报表的可选栏目全部由需求指定,需求未指定的,不提供。
2) 栏目和行分组在需求文档中注明是固定列的(固定显示(F)),必须显示在已选项,且不能从已选项中删除。
3) 在矩阵展现的报表中,可做交叉单元的项(如数量、金额等数值型字段)放在备选栏目,其他项放在行分组或列分组。
4) 如果在查询条件中同时存在同一实体属性的编码和名称,则编码字段使用参照录入,名称字段使用手工录入。如:料号为参照,品名按字符串过滤
1.4 报表行/列分组和表头项规范
1) 被选中的行列分组,是可以被作为表头项。(表头项目可动态增加,动态显示,上限为15个)。
2) 表头项参照的内容,如果在条件里已经输入了范围,则是满足条件项的值,否则是
第 12 页 共 18 页
全部的值。
3) 分组汇总项中的某段在作为表头过滤字段后,表头项为空时在列表中显示,否则不显示。
1.5 关于报表中参照的规范
1、关于条件参照和表头项参照:
1)应该与单据一致,档案用参照,枚举用下拉框。
2)公共档案的参照应该尽量一致,尤其是统计期间/会计期间/客户/部门等公共档案。 3)档案参照支持手工输入,可以不校验,与匹配符进行匹配。 2、动态值集的参照以及过滤 值集之间的参照有依赖关系。如:料品为动态值集,有4级分类,则首先查询方案中料品各值集段应该全部为参照,其次,只有当录入一级分类后二级分类才可用,三级和四级以此类推。
1.6 币种/币符/精度设置规范
1) 金额值之前都要增加币符,且按币种精度显示。本币不绑定币符。
2) 金额合计/小计,如果币种相同,则显示币符,如果币种不同,则不显示币符,精度按各个币种的最大精度显示,且币种必须做为分组项。
3) 数量的精度根据计量单位的设定显示,对于数量合计/小计,如果精度不一致,按最大的精度显示。
4) 百分数的精度:根据常规精度为2。
1.7 多组织查询规范
1.7.1 多组织的查询/统计分为两类
1、 相同职能组织,上级组织可以查询下级组织的数据,称为垂直多组织查询。
例如,上级营运组织查询其下属的某个营运组织的销售情况,或者查询其下属多个营运组织的销售汇总情况。
2、 不同职能组织,可以查询对应职能组织的数据,称为平行多组织查询。
例如,某个营运组织,查询其在各个核算组织的应收的情况。
一个查询,通常即会涵盖垂直组织的查询,又涵盖平行组织的查询。
1.7.2 垂直多组织查询规范
1、 在查询条件上,‘组织’要作为一个查询条件,并且是多选值,可以选择当前登陆组织
的当前职能垂直关系档上的所有下级组织。默认为当前登录组织。(见下例的核算组织描述)
2、 组织可以被做为汇总项目(GroupBy),也可以被做为分组项目(Item By)。(见下例的
核算组织描述)
3、 查询条件上的其他对象(主要指基本档案,例如客户)的范围,依据所选的组织确定。
如果选择的组织范围是单一组织,则相关其他对象取该组织的;如果选择的组织范围是多组织,则相关的其他对象取当前登录组织的。(见下例的立账客户描述)
4、 如果选择的组织范围是多组织,则不支持按会计期间/统计期间查询,只能按日期范围
第 13 页 共 18 页
查询。(见下例的期间类型描述)
5、 多组织查询,对于组织间下发的对象,可以汇总。(见下例的立账客户描述)
以应收的‘应收余额表’为例: 核算组织垂直关系树如下:
A
—A1 —A2 —A21 B
—B1
当前登录组织是A A组织客户档如下:
客户甲(下发给A1、A2) 客户乙 客户丙
应收余额表的查询条件如何支持多组织:
查询条件
取值范围
是否分组汇总
核算组织
多选
Y
是否分组项目Y
是否排序项目 Y
1、从应收的角度看就是垂直组织; 2、默认当前登录组织A
3、可以选择A、A1、A2、A21,不
能选择B和B1
来源组织立账客户
多选
Y Y
Y Y
Y Y
如果核算组织选择的是A,则客户档参照的是A组织的客户档;
如果核算组织选择的是A1,则客户档参照的是A1组织的客户档;
如果核算组织选择的是A+A1+A2,则客户档参照的是A组织的客户档; 在按客户汇总时,只有客户甲能进行汇总;
期间类型
会计期间 统计期间 单据日期
如果核算组织选择的是单组织,则可以任意选择
如果核算组织选择的是多组织,则只能选择单据日期
期间
Y 如果核算组织选择的是A,则会计/统计期
间参照的是A组织的;
如果核算组织选择的是A1,则会计/统计期间参照的是A1组织的;
...物料应收余额高级条件区
Y
Y
Y
同客户的参照 说明
第 14 页 共 18 页
收款员。。。
1.7.3 平行多组织查询规范
1、 一个查询活动,要在相关职能的功能结点中都体现出来。
例如,上例的‘应收余额表’要在财务、销售的职能中都挂。 在财务职能中挂,是从核算组织的角度,看客户的应收余额; 在销售只能中挂,是从营运组织的角度,看客户的应收余额; 两者的出发点是不同的,具体对应到数据表的字段也是不同的.
2、 同一个查询活动,从不同的职能进入,只是查询条件的默认值和查询条件的约束不同,
查询的逻辑和结果应该是一样的。应该能在文档中对查询条件从不同的职能进入进行说明。
3、 垂直多组织是相对职能来说的。同样的‘应收余额表’,在销售职能中,来源组织是垂
直组织,在财务职能中,核算组织是垂直组织。 还以应收的‘应收余额表’为例: 核算组织垂直关系树如下:
A
—A1 —A2 —A21 B
—B1
营运组织垂直关系树如下:
X
—X1 —X2 Y
—Y1
营运—核算组织平行关系是:
X -A X1-B X2-A1
应收余额表的查询条件如何支持多组织:
查询条件
从核算组织/财务职能进入 当前登录组织是A
核算组织
1、从应收的角度看就是垂直组织; 2、默认当前登录组织A
不能选择B和B1 4、不能为空
来源组织
1、 根据所选的来源组织范围,从组织
间平行关系档过滤出来源组织; 2、 可以为空
1、 从销售的角度看就是垂直组织; 2、 默认当前登录组织X
3、 可以选择X、X1、X2,不能选从营运组织/销售职能进入 当前登录组织是X
1、 根据所选的来源组织范围,从组织
间平行关系档过滤出核算组织;
3、可以选择A、A1、A2、A21,2、 可以为空;
第 15 页 共 18 页
择Y和Y1 4、 不能为空;
立账客户
1、 如果核算组织选择的是A,则客户
档参照的是A组织的客户档; 2、 如果核算组织选择的是A1,则客
户档参照的是A1组织的客户档;3、 如果核算组织选择的是A+A1+
A2,则客户档参照的是A组织的客户档;
1)在按客户汇总时,只有客户甲
能进行汇总;
期间类型
1、如果核算组织选择的是单组织,则可
以任意选择
2、如果核算组织选择的是多组织,则只
能选择单据日期
期间
1、如果核算组织选择的是A,则会计/
统计期间参照的是A组织的; 2、如果核算组织选择的是A1,则会计
/统计期间参照的是A1组织的;
...物料应收余额高级条件区 收款员。。。
同客户的参照
同客户的参照
3、只能选择单据日期 3、只能选单据日期
5、 如果来源组织选择的是X,则客户
档参照的是X组织的客户档; 6、 如果来源组织选择的是X1,则客
户档参照的是X1组织的客户档;7、 如果来源组织选择的是X+X1,
则客户档参照的是X组织的客户档;
4. 报表性能规范
1) 遵循《U9性能规范》
2) 可以直接使用:select * into #temptablename from …。这样的好处是省却了构建create table语句和执行其的消耗,并且以后当表中字段类型发生调整后,可以不必重新对create语句作调整。
3) 动态创建临时表,不需要的字段不要用null来代替,(如果有虚拟字段,可以使用Cast指定其数据类型)
4) 尽量合并执行的SQL语句,以便减少和DB服务器的交互次数,即不要多次使用Append往临时表插入数据,使用Union all一次插入
5) IsNull函数的使用(A5.[DisplayName] is null or (A5.[DisplayName] = '') 替换为:isnull(A5.[DisplayName],’’)=’’
第 16 页 共 18 页
6) 相同结构的临时表可以复用,删除临时表数据,不要使用Delete From Table,使用Truncate
7) 去掉结果临时表定义,直接返回结果OQL
8) 不要对插入的数据排序,而在获取数据的阶段排序; 9) 尽量用子查询代替临时表。
10) 不再使用的临时表可通过drop table语句或delete all及时释放掉占用的资源 11) 去掉不必要的调试代码(如:DataSet,OqlToSqlUtil.GetSql(Oql)等); 12) 去掉未被使用的变量(如:string sql;)
13) 将绝大部分行级计算字段,放在Report Server的Layout层处理,部分工作可以由DB层迁移到ReportLayout层处理
14) 字典映射应该放在Report Server的Layout层处理,这样可以利用.NET缓存字典数据,提高字典翻译速度;
15) 通过以下几种语句,尽量减少中间临时表:
A. select (select #A union select #B) order by排序字段的形式 B. Update A set A.c1=B.c1 left join B on xxx where xxx的形式 C. select A left join (子查询作为连接表) B on A.x=B.x的形式 16) 尽量避免使用静态对象
5. 报表补丁提交规范
1) 补丁号命名:
“日期\\模块名+报表补丁+顺序号“,如“6.27日\\INV报表补丁1” 2) 补丁下相关目录:
ReportServerLib(DataCommand)、ReportMetaData(报表元数据)、Portal\\UILib(报表UI及策略)、SqlScript(Sql脚本) 3) 补丁说明:(参考如下)
1. 解决的用户:XXXXXX 2. 解决的bug号:XXXXXX 解决问题描述: 1)XXXXXX 2)XXXXXX 3. 补丁如何安装: 1)XXXXXX 2)XXXXXX 3)XXXXXX
第 17 页 共 18 页
4)XXXXXX 4. 和其它补丁的依赖关系: 1)XXXXXX
2)XXXXXX
5. 可能的影响范围(提供给测试的建议验证范围); 1)XXXXXX 2)XXXXXX 3)XXXXXX
4) DataCommand补丁:
将ReportServerLib目录下的文件拷入ReportServer\\ReportServerLib,运行报表配置工具,执行“配置”操作。 5) 报表元数据补丁:
使用UBF导出报表元数据有两种方式:
A、按目录一次性将各模块所有的元数据全部导出。 B、按每张报表生成元数据
(如果一次性需要打多张报表,批量更新时建议选择方式A,否则按方式B更安全。选择方式B打补丁时只打有问题的报表,从而避免了将正确的报表元数据打错) 6) 报表UI及策略补丁:
直接将Portal下的报表UI及策略补丁覆盖Portal相应目录即可。
附录
1) 无
第 18 页 共 18 页
因篇幅问题不能全部显示,请点此查看更多更全内容