收藏 分销(赏)

用友NC报表开发教程(全)).doc

上传人:精**** 文档编号:3977323 上传时间:2024-07-24 格式:DOC 页数:48 大小:333.54KB 下载积分:14 金币
下载 相关 举报
用友NC报表开发教程(全)).doc_第1页
第1页 / 共48页
用友NC报表开发教程(全)).doc_第2页
第2页 / 共48页


点击查看更多>>
资源描述
用友NC报表教程(全) 5X&6X 用友NC-UAP 2024/7/18 周四 1 第 页 目 录 第一章 前言 1 1. 背景 1 2。 入门 2 3。 小结 8 第二章 对象管理 9 1. 对象树 9 1.1 对象编辑 10 1。2 对象导入导出 10 2. 数据源 11 3. 首选项 14 4。 资源权限 15 第三章 查询模型 16 1. 参数控制 17 2。 SQL设计 19 2。1 数据字典 19 2.2 向导设计 20 2.3 手工设计 25 3。 数据交叉 27 3.1 投影交叉 28 3。2 旋转交叉 31 4。 代码嵌入 36 4.1 SQL整理 36 4.2 数据加工 38 4。3 穿透规则 42 5。 查询执行 48 6。 查询集成 50 6。1 复合查询 50 6.2 物化查询 51 6.3 合并查询 53 7。 数据权限 53 第四章 格式模型 55 1。 引用查询 56 2. 格式设计 57 2.1 控件管理 57 2。2 属性绑定 64 2。3 行列格式设计 66 2。4 预定义数据处理 69 3。 报表浏览 76 3.1 界面初始化 76 3.2 数据处理 78 3。3 控件连动 82 3.4 报表打印 83 第五章 报表发布 86 1. 发布为功能节点 86 1。1 手动挂接 86 1.2 向导发布 87 2. 轻量化报表展现 89 第六章 插件开发 94 1. 生成插件 94 2. 设计插件 100 3. 管理插件 100 4. 开发小结 101 第七章 查询引擎V5新特性 102 1. V5。0新特性 102 2。 V5。01功能变更清单 102 3。 V5.011功能变更清单 102 4。 V5.02新增功能描述 103 4。1 参数重构 103 4。2 分页技术 107 4。3 SQL代码辅助器 110 4。4 数据字典级别权限控制 111 5。 V5。02功能变更清单 114 6. V5。5功能变更清单 115 附录 117 1. 查询引擎FAQ之参数篇 117 2. 交叉表的使用样例 119 3. 查询与格式对象安装盘预置方案 124 4. 查询引擎报表联查业务节点应用方案 125 5. 查询引擎与三大模板集成方案 130 6. 基于QE底层的查询个性化设计方案 138 7. 个性化控制类(JAVADOC) 143 第 45 页 第一章 前言 查询引擎(Query Engine,简称QE)的功能定位是,一个面向高级实施人员和专业开发人员的查询建模产品,可以全面支持复杂查询的设计和个性化的报表展现。 1. 背景 查询引擎在功能流程和查询模型方面参考了其前身产品“自定义查询”的理念,在界面设计方面汲取了Form Design的思路,同时融入了DW的技术,并依赖于通用的NC数据字典。 (1) 自定义查询:NC于2000年开始研发的一个面向中级实施人员和二次开发人员的查询报表工具,由查询管理中心、报表格式设计、报表浏览、报表权限控制和数据加工厂几个模块构成,此工具首次提出了基于数据字典来管理数据并建立查询对象的思路,能够提供比较丰富的查询分析、数据加工和报表展现功能。 (2) Form Design:NC于2003年开始研发的一种界面开发模式,定位于支持功能建模。 (3) 数据字典:一种管理数据库逻辑结构的机制,存在于物理数据库和用户接口之间。NC于2002年开始研发数据字典,最开始只用于自定义查询,后来经过功能强化和逐步推广,成为现在的DDC(Data Dictionary Control).其功能包括数据库对象的管理与编辑、数据字典的解析生成等。 (4) 数据仓库:NC的一个独立产品,能够按照指定的入仓规则从多个业务数据库抽取数据,并通过入仓服务定期把数据加载到数据仓库。 产品的需求背景如下所述。 (1) 复杂查询报表的需求:在实际的业务查询中,开发人员经常会遇到以下一些棘手的问题——复杂的SQL,从不同的查询条件得到完全不同的查询结果,查询结果的复合,业务逻辑代码和大量数据加工算法的介入,各种各样的数据交叉和数据处理手段等等;在展现格式方面,通常要求灵活、友好、可视化、个性化的设计界面,丰富的展现控件和统计图表,依据数据对单元格、列表头和行表头的格式进行设置,表单控件之间的连动等等.这一切都对早期的查询报表工具提出了艰巨的要求. (2) 二次开发的需求:随着NC对行业用户的拓展,由业务组程序员在通用软件中针对每个查询报表需求进行开发的方案已经变得不太现实,一线人员越来越频繁的面临来自用户的个性化报表实施压力。实施团队迫切要求一个强大而且易用的二次开发工具,尽管功能的强大和易用往往存在着一些矛盾. (3) 工具整合的需求:自定义查询在推出后,在实施中得到了一定的应用,但局限于出复杂程度不太高的查询报表.IUFO是公司的传统报表产品,它更偏重于报表的管理方面,比如报表的发布、审核、校验等等.数据仓库使查询的应用由单数据源拓展到了多数据源,并且提供定时同步业务数据的功能。为了有效地实现资源共享,结合发挥各个工具的优势,NC决策层一直在推动相关产品的整合。 (4) 查询分析软件发展潮流的需求:近几年来,查询分析、数据挖掘、商业智能的研究不论在企业应用还是在学术领域都成为热点,ERP软件的数据建模和查询建模功能已经成为代表产品水平的重要指标. 2. 入门 现在让我们来看一个最基本的查询样例,作为入门,我们知道在任何ERP系统中都存在公司和用户的概念,下面我们做一个查询某公司下用户的查询。 1. 进入客户化à自定义查询à查询引擎管理界面 图 一Error! Bookmark not defined. 2. 在“查询设计”树下新建一个目录,“jl测试用例”,并在这个目录下面创建一个查询对象――用户查询。 图 一1 3. 选择参数定义,这里我们定义一个名为corp,显示名为“公司”的参数,注意这里的数据类型选择编码参照,枚举项中选择这个编码参照的类型,我们将根据这个参数选取的值来确定待选公司,并且在查询中根据这个参数选取的值来进行结果筛选。 图 一2 4. 制作查询定义,制作一个查询定义的具体流程实际上就是为了生成一条SQL语句,查询数据源去获取数据,但是这个生成SQL语句的过程被我们用图形化界面代替了,用户只需要了解基本的SQL规则就可以了,无需亲自手动去写纷繁复杂的SQL语句,同时我们也支持手工SQL。 图 一3 用户可以通过增加表来增加数据字典中的数据表,也可以点击临时表引用前面做好的查询定义对象,引用查询定义对象相当于设计了一个复合查询,关于复合查询的定义参见第二章第六节查询集成。这里我们选择增加表来增加一个sm_user表,这张表里面存储的是NC系统的用户信息。 图 一Error! Bookmark not defined. 在选择字段页签下选择“用户名”等字段,这里的字段表达式可以是某表的字段,也可以是字段的运算或者函数处理表达式,例如:len(sm_user.user_name),就是代表user_name这个字段的字符串长度。显示名可以是用户自定义的字符串,将来显示在报表的列表头区域. 图 一4 前面我们提到这个查询必须按照公司为条件,过滤查询出来的用户,实际上就是为SQL语句生成一个where条件,我们支持两种条件,固定和待定,顾名思义固定条件写好之后就不能变化,而待定条件是跟参数设置相关的,可以根据用户输入参数变化。我们在这里选取待定条件,用户表的公司编码字段等于前面我们设置过的corp。关于查询定义的设计后面的章节将有更详细的论述,这里只介绍最基本的功能。 5. 制作格式设计 图 一5 新建格式设计文件夹以及对象的方式与新建查询对象的方法一样,这里略去不讲。生成新的格式设计对象之后可点菜单中的界面模型à引用查询,来绑定我们刚才做好的查询设计对象“用户查询”。 图 一6 选取刚才做好的查询之后我们在点击界面模型à格式设计,这里可以选取我们预置的几种界面模型之一,例如这张表我们选取表头+表体格式。 图 一7 最后点菜单中的浏览,让我们浏览一下制作出的第一张报表, 图 一8 点浏览之后我们会看到一个选择参数的对话框,在这个参数对话框中我们可以设置自己的参数值,比如我们选取sunny_corp这个公司,点确定,则可以浏览这个公司下的所有用户,如下图。 图 一Error! Bookmark not defined. 选择表头区域的公司参照,我们可以浏览不同公司下的用户。至此一个最简单的自定义查询已经制作完毕,我们可以将做好的查询作为独立节点发布到NC系统下供用户使用. 3. 小结 在本章中我们介绍了查询引擎的发展历史以及产品的需求背景,通过一个入门样例,让用户初步了解了查询引擎的基本功能,在后面的章节中我们将详细介绍查询引擎的各项功能,并通过一些样例使得用户能够使用本产品进行快速便捷的二次开发。 下图是对查询引擎开发流程的一个示意: 图 一Error! Bookmark not defined. 查询建模体系 第二章 对象管理 1. 对象树 查询引擎的管理调度功能由主界面完成,主界面左侧为一棵对象树,树上挂有代表查询对象和界面对象的节点,右侧为显示当前选中对象基本属性的属性框。 图 二Error! Bookmark not defined. 管理调度主界面 · 对象树(ObjectTree):对象树是一个支持层次管理的数据结构,它维护自身的加载、存储和节点的目录管理,每个节点的信息主体存储在数据库的一个BLOB字段中。对象树上的节点通常分为目录(Folder)和对象两类,并支持快速定位(在树获得焦点时用ctrl-f快捷键可弹出查找对话框,支持按编码或名称来模糊查找)。 · 属性框(ObjectInspector):一个自动显示对象的属性和取值的控件,取值部分会根据属性的数据类型采用不同的渲染器来展示,不同的编辑器来编辑. 1.1 对象编辑 目录的编辑操作如下: (1) 增加/删除/修改:在根节点或目录节点之下可以增加目录,删除目录时会删除目录下的所有对象。目录的可修改属性为目录名称.同一目录下的目录和对象不能重名。 (2) 复制/剪切/粘贴:在查询子树或格式子树下,可以将一个目录及其下属内容从某位置拷贝或移动到另一个位置. 对象分为查询对象和格式对象,其编辑操作如下: (1) 增加/删除/修改:在根节点或目录节点之下可以增加查询对象或者界面对象。前者的属性为编码、名称和数据源,后者的属性为编码和名称,其中编码一经使用,就不再建议作任何修改,因为此编码可能被其它对象引用.请注意对象的唯一标识是编码而不是显示名称,一个查询对象或是格式设计对象可以有多个显示名称但是只能有唯一的编码. (2) 复制/剪切/粘贴:在查询或格式子树下,可以将一个对象从某位置拷贝或移动到另一个位置。请注意这里的复制粘贴都是在同一棵树下的,如果复制格式设计对象到查询对象树下则会出错。 1.2 对象导入导出 (1) 导出:选中某个对象,可将其导出为XML文件,文件里描述了对象的所有信息;也可选中某个目录,将该目录下所有的子目录和对象都导出到指定位置(保持原有的目录级次)。 (2) 导入:在选中某个目录之后,导入功能可用。导出的XML文件,可以导入到当前目录下。此功能可用于对象的跨数据库复制。导入时,我们可以选择单个文件,也可以选择一组文件或目录,导入后会保留原目录的级次结构。需要注意的是: l 在导出查询对象或界面对象时,需将其引用的查询对象一并导出才有意义; l 导入不能违反对象主键及名称的唯一性约束.下图显示了某查询对象所导出的XML文件. 图 二Error! Bookmark not defined. 导出XML文件 (3) 在导入导出的过程中需要注意的一个问题是数据源的问题,在实际应用中经常出现这样的场景:实施人员在自己的环境(数据源为home)下做了一对查询模型设计和格式设计,然后导出这一对设计对象为xml文件,然后到用户的环境(数据源为customer)下执行导入,发现无法查出数据,并且提示“找不到查询所用数据源”,这是因为导出成XML文件的时候,记录在XML文件中的执行数据源是home,而客户的数据源名称是customer,与查询模型设计中的数据源不符合,这样查询模型就无法到正确的数据源下去取数,可以在弹出的提示框“是否修改执行数据源为当前数据源”,选择“是”,则该查询设计模型的数据源被修改为当前账套的数据源,这样就可以在客户的数据源中正确取数了. 2. 数据源 查询引擎的数据源关系如下图所示: 图 二Error! Bookmark not defined. 查询引擎数据源关系模型图 l 多数据源运作机制:查询引擎支持这样的模式——NC业务在数据源A下运行,查询引擎的定义放在数据源B,通过引擎定义的查询可以到数据源C去执行。 注:只有数据仓库下的查询引擎有切换定义数据源和跨库查询的功能,客户化下的查询引擎只能查询当前账套数据源的数据。 图 二1 切换定义数据源 l 各种数据源的概念区分: 业务数据源(上面说的A)通常指当前登录账套的数据源,是NC运行所需要的业务数据源。 定义数据源(上面说的B)是指查询引擎自身的系统表所在的数据源,执行切换功能后,主界面上的对象树的内容会作相应改变.请注意查询引擎自身的系统表可以和当前的业务数据源不是同一个数据源,例如当前登陆账套是Account1,数据源是datasource1,而查询引擎的系统表可以不在该数据源下,而在另一个数据源datasource2下,datasource2可能是账套Account2的数据源,也可能是任何其他的数据源。但是前提是该数据源中必须含有查询引擎自身的系统表。 图 二2 切换定义数据源效果 执行数据源(上面所说到的C)是指该查询定义取数的数据源,我们知道查询定义设计的最终目的还是去特定的数据源查取用户所需的数据,执行数据源就是存储这些用户所需数据的数据源,查询引擎本身的系统表所在数据源可以跟这个取数数据源不同,也就是说定义数据源和查询数据源可以分离. 图 二3 执行数据源 3. 首选项 QE数据源的配置在V5。0版本中统一放在查询引擎环境变量设置(又称首选项)这个节点里面,该节点位于客户化à二次开发工具à自定义查询下,界面如图2—6所示: 图 二4 查询引擎首选项管理 这个节点存放查询引擎运行所需要的环境变量或者首选项变量,这些变量被存储在后台queryengine.xml中,位于nchome/ierp/bin目录下,由于本文下面的章节中还有需要涉及到环境变量设置的地方,所以这里只提及数据源环境变量的设置. ü 有效数据源: 启动中间件时的所有能够连接的合法数据源,实际上也就是prop。xml文件中的所有定义过并且能够正常连接的数据源。 ü 查询执行可用数据源: 查询引擎所能够引用的执行数据源列表,查询引擎管理中所有的查询模型的取数数据源范围就在这个列表中定义。请注意一个查询执行数据源必须是一个有效数据源。 ü 数据加工数据源: 查询引擎中高级功能“数据加工"所使用的数据源,二次开发人员需要特别注意在使用数据加工这个功能时,在获取数据源的时候有如下语句: getEnv()。getDefaultDsn(); 这句话返回的就是在这里定义的“数据加工默认数据源”。V5版本支持多种数据加工数据源,这里定义的时在默认情况下的数据源,下表列出在各种查询引擎版本下的数据加工数据源及其含义。 版本号 对应数据源及其含义 LOGIN 查询引擎单数据源版本,数据源为当前登陆账套数据源 Default 默认数据源,在查询引擎环境变量设置中显式定义的数据加工默认数据源 DW 查询引擎的DW版本,数据源为查询引擎环境变量中定义的DW数据源 BPM 查询引擎的BPM版本,数据源为查询引擎环境变量中定义的BPM数据源 QMD 查询引擎多数据源版本,数据源为查询对象设计中查询对象的数据源 表 二1 首选项配置的内容还包括数据仓库应用的一些配置,以及界面操作过程中的与个性化或性能相关的设置,比如后面会提及的查询执行的最大行数限制等等。首选项对应的配置文件是%NC-HOME%\ierp\bin\queryengine.xml,是被全集团共享的. 4. 资源权限 单数据源版查询引擎支持对不同公司的不同用户授予全部权限或浏览权限。全部权限是指所有查询、格式对象的设计和浏览权限,浏览权限是指能够浏览指定格式对象的报表展现. 图 二Error! Bookmark not defined. 查询引擎权限分配 如果想做更细粒度的资源权限控制,比如建立基于创建者的权限体系,或者对查询设计者的可查数据字典进行限制,则需要通过下文介绍的管理插件和设计插件技术进行开发. 第三章 查询模型 查询模型的定义包括参数定义、SQL设计(含交叉定义)、SQL整理、数据加工、穿透规则等几部分,其中穿透规则描述的是本查询与外部查询的通信关系,剩余部分都用于描述查询内部的属性。查询引擎的查询模型(数据模型)设计如下: 图 三1 查询模型示意图 查询设计态和运行态的基本流程如下图所示: 图 三2 查询模型流程 1. 参数控制 参数是查询模型中代表动态信息的元素。在SQL设计、SQL整理和数据加工中,均可以根据参数的不同,对查询的定义和执行进行调整. 过滤型参数:如果创建某个参数的作用是根据其取值的不同改变WHERE条件的设置,则这类参数成为过滤型参数,这是最常用的参数功能(参数的FAQ可以参见附录)。 (1) 参数定义:用于定义本查询内部引用的所有参数,其中参数名要保证互不相同。数据类型包括自由录入、枚举、参照几种,当类型为枚举时,枚举项为用“@"分隔的枚举值,或者是一个单字段的查询SQL;当类型为参照时,枚举项为基础参照名,或者是用尖括号括起的自定义参照的类名。 致开发者:在V5.0中 该类应该放置在client以上的包中,对于放置在private中的类, 则会抛出ClassNotFoundException (2) 参数引用:参数可在SQL设计的筛选条件页签引用,也可在SQL整理或数据加工的嵌入代码中利用编码向导引用。这里当筛选条件是待定条件的时候,双击“值",文本框,就可以弹出参数选择对话框,点击选择对应的参数即可. (3) 参数设置:运行态要求用户首先对参数进行设置,这与查询模板的使用类似。当报表引用了多个查询时,参数将通过多页签设置,每个页签代表一个查询。 图 三3 参数定义 图 三Error! Bookmark not defined. 参数引用 图 三Error! Bookmark not defined. 参数设置 替换型参数:是指参数名以#开头并以#结尾的参数,多用于手工SQL设计中,也可用于向导SQL的非待定条件部分.这种参数通常相当于preparestatment中的?占位符,关于替换型参数,后面的章节中还有详细介绍。在设置替换型参数的时候,不输入值将不被认为是忽略此参数对应的条件。 2. SQL设计 SQL设计包括向导设计方式和手工设计方式,无论采用哪种,在完成设计时系统均会对SQL进行合法性校验,如未通过校验则不能保存设计。作为向导设计的一个重要组成环节,我们有必要先介绍一下数据字典. 2.1 数据字典 前面已经提到过,查询对象的属性中包含数据源信息,因此在设计查询的时候需要加载相应数据源的数据字典。我们知道,NC的数据库以DDC作为数据字典,但非NC的数据库则没有DDC,此时,系统会根据执行数据源是NC、IUFO或其它数据库三种情况分别加载不同的数据字典,而且这一机制已经预留了扩展的接口,其目的就是可以面向各种类型的数据库执行取数功能. NC数据字典提供了统一的数据建模平台,支持对各种数据库对象进行管理,维护这些物理对象的逻辑属性,并向外系统提供访问数据库逻辑信息的接口。以查询引擎为例,查询对象的定义是基于数据字典进行的,而这份数据字典来自查询对象所指定的数据源。由于多数报表的列与业务数据库的字段存在某种对应关系,因此数据字典的存在有助于提高查询定义的直观性和易用性。 图 三4 NC数据字典 NC数据字典通常在安装产品时候由系统生成,如果想自己为某些数据库对象生成字典,可以采用数据字典管理界面提供的导入方法.导入方式包括三种(详细操作可参见《数据字典导入说明》): 1、 解析PDM文件(xml格式); 2、 解析NC标准建库脚本; 3、 提取数据库元数据; 如果需要给非NC数据库(比如用户采用的第三方数据库)生成数据字典,可以利用PowerDesigner提供的逆向工程功能将库里的物理表生成PDM文件,修改其中表和字段的中文名称,然后以xml文件格式存储,再使用上述第一种方法导入。 查询引擎中用到的数据字典都以一棵对象树的形式存在,树节点包括目录、表、视图、字段、外键等信息,通过双击对象节点可以协助录入SQL语句的成分。 2.2 向导设计 向导设计参考典型SQL的构成规则,充分利用数据字典的功能,引导用户一步步完成SQL的设计,因此是推荐使用的方式。它由以下六个环节构成,其中最后一步“交叉属性"超出了SQL的涵义,我们在后面的专门章节中进行介绍. (1) 表定义:即SQL语句中的from部分,可以利用数据字典选择库里的数据表,也可以选择查询对象,从而实现查询的集成(基于查询结果定义新的查询). 图 三5 表定义 图 三Error! Bookmark not defined. 增加表(物理表)与临时表 (2) 连接定义:即SQL语句中的join部分(表间连接关系),支持典型模式和高级模式,典型模式实际就是关系数据库中的单键连接,连接字段只有一个,并且操作符都是常见的’= 〉 <’,而高级模式可以自由设置连接表达式,支持多键连接。 图 三6 连接定义à典型模式 图 三7 连接定义à高级模式 (3) 字段定义:即SQL语句中的select部分,可以定义任何SQLSERVER语法支持的查询表达式,但要保证字段别名不重复且使用规范名称(以字母开头、由字母、数字、下划线组成的字符串,且不能使用SQL保留字)。如果使用了聚集函数,则由系统自动完成group by部分。V5中增添了这样的功能,可以在查询字段中添加NC的公式,但是这些公式需要特定的格式,例如取得前台数据库缓存中某表的一个或多个字段,可以使用’{getColvalue(xx,yy,zz)}’,请注意单引号和大括号是必须的.这里的处理机制是先将上述公式作为一个字符串,在查出结果集之后再把公式翻译执行.所以这里的公式是基于最终结果集的。 图 三Error! Bookmark not defined. 字段定义 图 三Error! Bookmark not defined.表达式生成器 (4) 筛选条件定义:即SQL语句中的where部分,可定义确定条件和待定条件.如果是待定条件,在值编辑框获得焦点时双击编辑框可弹出参数界面并作引用(或者在值编辑框获得焦点时按F12键或者双击弹出参数引用框);如果是固定条件,在值编辑框获得焦点时按F11键或者双击可弹出环境变量引用框,按F12键可弹出所引用的基础数据表的参照. 对于在查询字段里使用了聚集函数的SQL设计,筛选条件可能需要使用having子句。Having页签默认是隐藏的,可以在查询定义框的南部面板按Ctrl+Shift+鼠标左键弹出隐藏的Having页签。 图 三8 筛选条件定义(典型模式参见图3-3) (5) 排序字段定义:即SQL语句中的order by部分. 图 三Error! Bookmark not defined. 排序字段定义 (6) 向导设计完成后在查询定义框的南部面板鼠标双击可弹出向导生成的等效SQL(待定条件全用(1=1)代替).该功能可以用来检查SQL语句是否有错。实际上,每次做完查询设计之后点击确定时,我们都会试执行一下您的SQL语句,但是并不查出数据来,如果您的查询设计最终生成的SQL语句有问题,那么就会有相应的出错提示. 图 三9 由查询设计生成的SQL语句 (7) 数据交叉属性:交叉是一种常用的多维数据分析手段,详见后文。 2.3 手工设计 手工设计是支持自由SQL的方式,由于复杂SQL在解析、适配、执行等方面的不稳定性较大,因此不推荐普通用户使用.手工设计分为以下两个环节: 1) SQL录入:用户可以在数据字典的辅助下录入SQL语句,要求遵循SQLSERVER语法。如图3—13,注意,我们在SQL定义里用到了一个替换型参数(#pk_corp#),这里替换型参数也必须在前面参数定义中定义,并且参数名要以#开头并且以#结尾。(关于替换型参数的具体说明参见附录); 图 三10 SQL录入 2) SQL翻译:实际上最终到数据库中执行的SQL语句都是经过翻译的,NC系统有专门的SQL翻译器对各种SQL方言进行翻译,在手工设计中可以选择是否启用翻译器这个功能,通常建议启用. 图 三Error! Bookmark not defined. SQL录入 3) 字段显示名设置:系统通过对用户录入SQL的解析获得字段信息,并向用户提供输入字段显示名的机会,显示名的默认值与查询字段的物理名相同。 图 三Error! Bookmark not defined. 字段显示名设置 3. 数据交叉 什么叫做数据交叉?在怎样的场景下需要用到数据交叉?让我们来看两个应用场景: 1. 我们从数据库的原始数据表中经过连接得到这样一个结果集,该表共有三行三列,现在我们想得到部门的员工民族统计表, 图 三Error! Bookmark not defined. 下图是我们想要得到的最终结果: 图 三11 我们知道这样的查询实际上是不能通过SQL语句来实现的,因为通过SQL语句查询出来的列中不可能存在像汉族,满族,蒙古族这样的列,这些数值是原始数据库表中某列中的值.但是这个功能我们可以通过投影交叉来实现。 2. 还是刚才那个例子,我们现在想要得到的结果需要按照民族列中的民族数动态扩展,也就是说,不能只有汉族,满族,蒙古族这些固定好的值,如果添加了一笔数据,民族的值为苗族,我们最终的报表能够动态的呈现出这样的变化,理想中的结果如下图所示: 图 三12 实际上这样的例子可以用旋转交叉来实现。下面我们要分别介绍这两种交叉功能。 3.1 投影交叉 · 投影交叉(第一类交叉):假定有一个查询SQL,其查询结果是单行单列的汇总值,另外还有两组WHERE条件的序列,分别为横向序列(WhereX1、WhereX2、……、WhereXn)和纵向序列(WhereY1、WhereY2、……、WhereYn),则数据矩阵A(aij)对应的结果集成为投影交叉,如果aij是WhereXi和WhereYj同时作用在上述SQL上获得的结果。 数据模型如图所示: 图 三13 投影交叉数据模型 比如,查询某公司下各部门各民族的人数,原始SQL(由查询向导生成的等效SQL)为: select bd_deptdoc。deptname as deptname, bd_defdoc.docname as docname, count(bd_psndoc.pk_psndoc) as psnno from bd_deptdoc left outer join bd_psndoc on bd_deptdoc。pk_deptdoc= bd_psndoc。pk_deptdoc left outer join bd_accpsndoc on bd_psndoc.pk_psndoc=bd_accpsndoc.pk_psndoc left outer join bd_defdoc on bd_accpsndoc。nationality=bd_defdoc.pk_defdoc where bd_deptdoc.pk_corp = ? group by bd_deptdoc.deptname, bd_defdoc。docname 查出的结果如下表所示: 图 三Error! Bookmark not defined. 原始数据(无交叉) 现在我们把查询字段中只保留人数count(bd_psndoc。psncode)一项,然后进行如下的投影交叉设置: 图 三Error! Bookmark not defined. 图 三Error! Bookmark not defined. 投影交叉设置 则交叉后的结果如下表所示: 图 三Error! Bookmark not defined. 投影交叉结果 通过投影交叉,我们可以完成纯粹的SQL语句无法完成的功能――把行中的数值放置在列头,但是,这类交叉也有不足之处,例如,我们新增了一笔数据,这笔数据中人员的民族属性是苗族,由于我们在交叉定义中列头没有苗族,所以如果我们想要增加一列,则必须修改原先的查询定义,如果增加的数据非常多,那么我们需要重新修改的列头将会变的纷繁复杂,大大降低了效率,如果能够动态扩展列,不必再去修改原始的查询定义,这样会给我们带来极大的方便。旋转交叉为我们提供了这样的功能. 3.2 旋转交叉 · 旋转交叉(第二类交叉):此类交叉用于显示表中某几个字段(称为交叉值字段)的统计值,并将其分组放置在查询结果中,一组列在数据表的左侧(称为交叉行字段),一组列(称为交叉列字段)旋转到数据表的上部成为列表头,统计值则放在对应的交叉单元。 旋转交叉数据模型图如图所示: 图 三Error! Bookmark not defined. 旋转交叉数据模型图 两类交叉的最大差别在于:第一类交叉属于查询行为,适用于行列设置都已在表样中固定的报表,其交叉结果严格遵循表样格式,其行列结构不会受查询数据的影响;第二类交叉属于数据加工行为,其交叉后的行列结构在查询出数据之前不可预料,多用于完全真实地对原始数据进行动态处理。 沿用3.1使用的例子,假定我们进行如下的旋转交叉设置: 图 三14 旋转交叉设置 这里交叉砝码的意思是指交叉值列在旋转后的位置。则交叉后的结果如下表所示: 图 三15 旋转交叉结果 · 在旋转交叉设置界面上单击行,列,值标签(在图3—18中用蓝色框标示的位置),可弹出交叉行列复合维度设置和是否小计的设置框. 图 三Error! Bookmark not defined. 交叉设置 图 三Error! Bookmark not defined.交叉复合维度设置 图 三16是否小计设置 ü 复合维度:设置复合维度是为了减少冗余数据的出现,举例说明如下图是没有设置复合 图 三Error! Bookmark not defined. 没有设置复合维度 维度的交叉结果,我们把交叉行和交叉列中的每一项当作一个数据维度,则该原始表就存在三个维度,分别是部门编码、部门名称和民族,然后我们把处于交叉值的人数列中的数据“投影”到这个三维的数据空间中。如图 三Error! Bookmark not defined. 图 三Error! Bookmark not defined. 这样,即使原始表中不存在部门名称为ERP事业部,部门编码为10的记录,在交叉过后也会出现多余的一条记录,如表中红框所示,如果在交叉行上设置复合维度,实际上就等于把部门编码和部门名称合起来形成了一个维度,如Error! Reference source not found. 图 三Error! Bookmark not defined. 设置复合维度后的数据空间 上面描述的数据库中没有记录的就不会再被展现出来,交叉结果如下图所示: 图 三17 设置复合维度后的交叉结果 ü 交叉值合计: 在点击交叉设置中的“值”字样,可以弹出如图 三16的对话框,在这里可以设置是否对交叉值进行合计,如是设置过合计的结果: 图 三Error! Bookmark not defined.旋转交叉结果(设置了合计) 关于旋转交叉的更细节的内容,请参考附录的交叉表使用样例. 4. 代码嵌入 4.1 SQL整理 · SQL整理(SQL Repair):指在SQL查询之前,对SQL所作的调整.通常会根据参数的不同,对查询的表、字段或条件等信息进行增补或修改。 SQL整理的具体内容由内嵌的代码片段描述(这与后面将介绍的数据加工和穿透规则一样),代码的录入可通过编码向导协助完成,尽管如此,这几种功能仍然推荐由高级实施人员或程序员使用。 在SQL整理中把新的查询基本定义设置为整理成果的方法是: setQueryBaseDef(QueryBaseDef qbd); 图 三Error! Bookmark not defined. SQL整理代码 在图示的SQL整理代码中,表达了这样一个整理愿望:当参数showtype的取值等于“明细”时,取出所有定义的查询字段表达式,并且去除汇总函数(sum),然后增加一个分录摘要字段,并且设置分组列为空,实际上这里不仅仅能够修改查询字段及其表达式,更可以增加或者删除查询所引用的表,连接条件,排序分组字段,甚至可以手工写一个查询定义,并且把手写的查询定义设置为主查询定义。请注意如果在这里替换了查询定义,则原先在向导中或者在手工SQL设计中的查询定义就不再生效。 以下简单介绍几种SQL整理算法的编码向导使用方法: (1) 追加查询表:参数为待追加的表物理名. 图 三Error! Bookmark not defined. 追加表向导 (2) 追加连接条件:与追加表同时使用,参数为连接模式、追加表物理名和追加的表间连接条件。 图 三Error! Bookmark not defined. 追加连接条件向导 (3) 追加查询字段:与追加表同时使用,参数为追加字段的表达式、显示名和别名。 图 三Error! Bookmark not defined. 追加字段向导 (4) 按参数追加条件:根据参数取值的不同追加不同的筛选条件,参数为参数名和筛选字段。 图 三Error! Bookmark not defined. 按参数追加条件向导 4.2 数据加工 · 查询结果集(ResultSet):由二维数据集合(数据体)及其列信息(元数据,包括列名、列数据类型等信息)构成的一个数据载体。 · 数据加工(Data Process):数据加工是指某个(或某几个)结果集在经过一系列加工算法的变换后得到另一个结果集,而后者通常是业务上要求的展现结果。相关的算法又称为加工滤镜,滤镜通常支持输入多个结果集和输出一个结果集,并可以嵌套使用。 数据加工与SQL整理的区别在于:前者在SQL查询之后进行,作用的对象是结果集;后者在查询之前进行,作用的对象是SQL定义。 在数据加工中把新的数据集设置为加工成果的方法是: setDataSet(StorageDataSet ds); 在数据加工的编码向导中,提供了多种实用加工滤镜。图示的数据加工代码把ID分别为“male”和“female"的两个结果集按照deptname字段为键进行了左外连接,并在连接结果中保留了“deptname”、“mpsnnum”、“fpsnnum”三列。 图 三Error! Bookmark not defined. 数据加工代码 以下简单介绍几种数据加工算法的编码向导使用方法: (1) 由查
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服