NC查询引擎使用详解

上传人:沈*** 文档编号:119874102 上传时间:2022-07-16 格式:DOC 页数:53 大小:3.66MB
返回 下载 相关 举报
NC查询引擎使用详解_第1页
第1页 / 共53页
NC查询引擎使用详解_第2页
第2页 / 共53页
NC查询引擎使用详解_第3页
第3页 / 共53页
点击查看更多>>
资源描述
用友NC二次开发平台 查询引擎目 录第一章前言11.产品的前身12.产品的需求背景1第二章查询引擎的管理21.对象树管理21.1目录管理21.2对象管理31.3导入导出32.切换定义数据源4第三章查询引擎的查询模型51.参数控制52.SQL设计72.1数据字典72.2向导设计82.3手工设计123.数据交叉133.1第一类(投影)交叉133.2第二类(旋转)交叉144.代码嵌入164.1SQL整理164.2数据加工184.3穿透规则225.查询浏览255.1查询执行与展现255.2数据导出255.3创建物化表25第四章查询引擎的界面模型271.引用查询282.格式设计282.1控件管理292.2行列格式设计332.3预定义数据处理363.界面运行383.1界面初始化383.2数据处理393.3控件连动423.4报表打印433.5功能节点挂接43附录451.查询引擎FAQ之参数篇45参考文献47第 50 页第一章 前言查询引擎的功能定位:一个面向高级实施人员和专业开发人员的查询建模产品,可以全面支持复杂查询的设计和个性化的报表展现。1. 产品的前身查询引擎在功能流程和查询模型方面参考了自定义查询的理念,在界面设计方面汲取了Form Design的思路,同时融入了数据仓库的技术,并依赖于通用的NC数据字典DDC。(1) 自定义查询:NC于2000年开始研发的一个面向中级实施人员和二次开发人员的查询报表工具,由查询管理中心、报表格式设计、报表浏览、报表权限控制和数据加工厂几个模块构成,此工具首次提出了基于数据字典来管理数据并建立查询对象的思路,能够提供比较丰富的查询分析、数据加工和报表展现功能。(2) Form Design:NC于2003年开始研发的一种界面开发模式,定位于支持功能建模。(3) 数据字典:一种管理数据库逻辑结构的机制,存在于物理数据库和用户接口之间。NC于2002年开始研发数据字典,最开始只用于自定义查询,后来经过功能强化和逐步推广,成为现在的DDC(Data Dictionary Control)。其功能包括数据库对象的管理与编辑、数据字典的解析生成等。(4) 数据仓库:NC的一个独立产品,能够按照指定的入仓规则从多个业务数据库抽取数据,并通过入仓服务定期把数据加载到数据仓库。2. 产品的需求背景(1) 复杂查询报表的需求:在实际的业务查询中,开发人员经常会遇到以下一些棘手的问题复杂的SQL,从不同的查询条件得到完全不同的查询结果,查询结果的复合,业务逻辑代码和大量数据加工算法的介入,各种各样的数据交叉和数据处理手段等等;在展现格式方面,通常要求灵活、友好、可视化、个性化的设计界面,丰富的展现控件和统计图表,依据数据对单元格、列表头和行表头的格式进行设置,表单控件之间的连动等等。这一切都对早期的查询报表工具提出了艰巨的要求。(2) 二次开发的需求:随着NC对行业用户的拓展,由业务组程序员在通用软件中针对每个查询报表需求进行开发的方案已经变得不太现实,一线人员越来越频繁的面临来自用户的个性化报表实施压力。实施团队迫切要求一个强大而且易用的二次开发工具,尽管功能的强大和易用往往存在着一些矛盾。(3) 工具整合的需求:自定义查询在推出后,在实施中得到了一定的应用,但局限于出复杂程度不太高的查询报表。IUFO是公司的传统报表产品,它更偏重于报表的管理方面,比如报表的发布、审核、校验等等。数据仓库使查询的应用由单数据源拓展到了多数据源,并且提供定时同步业务数据的功能。为了有效地实现资源共享,结合发挥各个工具的优势,NC决策层一直在推动相关产品的整合。(4) 查询分析软件发展潮流的需求:近几年来,查询分析、数据挖掘、商业智能的研究不论在企业应用还是在学术领域都成为热点,ERP软件的数据建模和查询建模功能已经成为代表产品水平的重要指标。第二章 查询引擎的管理1. 对象树管理查询引擎的管理调度功能由主界面完成,主界面左侧为一棵对象树,树上挂有代表查询对象和界面对象的节点,右侧为显示当前选中对象基本属性的属性框。图 2-1 管理调度主界面 对象树(ObjectTree):对象树是一个支持层次管理的数据结构,它维护自身的加载、存储和节点的目录管理,每个节点的信息主体存储在数据库的一个BLOB字段中。对象树上的节点通常分为目录(Folder)和对象两类,并支持快速定位(在树获得焦点时用ctrl-f快捷键可弹出查找对话框,支持按编码或名称来模糊查找)。 属性框(ObjectInspector):一个自动显示对象的属性和取值的控件,取值部分会根据属性的数据类型采用不同的渲染器来展示,不同的编辑器来编辑。1.1 目录管理(1) 增加/删除/修改:在根节点或目录节点之下可以增加目录,删除目录时会删除目录下的所有对象。目录的可修改属性为目录名称。同一目录下的目录和对象不能重名。(2) 复制/剪切/粘贴:在查询子树或格式子树下,可以将一个目录及其下属内容从某位置拷贝或移动到另一个位置。1.2 对象管理(1) 增加/删除/修改:在根节点或目录节点之下可以增加查询对象或者界面对象。前者的属性为编码、名称和数据源,后者的属性为编码和名称,其中编码一经使用,就不再建议作任何修改,因为此编码可能被其它对象引用。(2) 复制/剪切/粘贴:在查询或格式子树下,可以将一个对象从某位置拷贝或移动到另一个位置。1.3 导入导出(1) 导出:选中某个对象,可将其导出为XML文件,文件里描述了对象的所有信息;也可选中某个目录,将该目录下所有的子目录和对象都导出到指定位置(保持原有的目录级次)。(2) 导入:在选中某个目录之后,导入功能可用。导出的XML文件,可以导入到当前目录下。此功能可用于对象的跨数据库复制。导入时,我们可以选择单个文件,也可以选择一组文件或目录,导入后会保留原目录的级次结构。需要注意的是:(a)在导出查询对象或界面对象时,需将其引用的查询对象一并导出才有意义;(b)导入不能违反对象主键及名称的唯一性约束。下图显示了某查询对象所导出的XML文件。图 2-2 导出XML文件2. 切换定义数据源 多数据源运作机制:查询引擎支持这样的模式NC业务在数据源A下运行,查询引擎的定义放在数据源B,通过引擎定义的查询可以到数据源C去执行。注:只有数据仓库下的查询引擎有切换定义数据源和跨库查询的功能,客户化下的查询引擎只能查询当前账套数据源的数据。图 2-3 切换定义数据源定义数据源(上面说的B)是指查询引擎自身的系统表所在的数据源,执行切换功能后,主界面上的对象树的内容会作相应改变。图 2-4 切换定义数据源效果第三章 查询引擎的查询模型查询模型的定义包括参数定义、SQL设计(含交叉定义)、SQL整理、数据加工、穿透规则等几部分,其中穿透规则描述的是本查询与外部查询的通信关系,剩余部分都用于描述查询内部的属性。查询引擎的查询模型(数据模型)设计如下:查询设计态和运行态的基本流程如下图所示:图 3-1 查询模型流程1. 参数控制参数是查询模型中代表动态信息的元素。在SQL设计、SQL整理和数据加工中,均可以根据参数的不同,对查询的定义和执行进行调整。过滤型参数:如果创建某个参数的作用是根据其取值的不同改变WHERE条件的设置,则这类参数成为过滤型参数,这是最常用的参数功能(参数的应用可以参见附录)。(1) 参数定义:用于定义本查询内部引用的所有参数,其中参数名要保证互不相同。数据类型包括自由录入、枚举、参照几种,当类型为枚举时,枚举项为用“”分隔的枚举值,或者是一个单字段的查询SQL;当类型为参照时,枚举项为基础参照名,或者是用尖括号括起的自定义参照的类名。(2) 参数引用:参数可在SQL设计的筛选条件页签引用,也可在SQL整理或数据加工的嵌入代码中利用编码向导引用。(3) 参数设置:运行态要求用户首先对参数进行设置,这与查询模板的使用类似。当报表引用了多个查询时,参数将通过多页签设置,每个页签代表一个查询。图 3-2 参数定义图 3-3 参数引用图 3-4 参数设置2. SQL设计SQL设计包括向导设计方式和手工设计方式,无论采用哪种,在完成设计时系统均会对SQL进行合法性校验,如未通过校验则不能保存设计。作为向导设计的一个重要组成环节,我们有必要先介绍一下数据字典。2.1 数据字典前面已经提到过,查询对象的属性中包含数据源信息,因此在设计查询的时候需要加载相应数据源的数据字典。我们知道,NC的数据库以DDC作为数据字典,但非NC的数据库则没有DDC,此时,系统会根据执行数据源是NC、IUFO或其它数据库三种情况分别加载不同的数据字典,而且这一机制已经预留了扩展的接口,其目的就是可以面向各种类型的数据库执行取数功能。NC数据字典提供了统一的数据建模平台,支持对各种数据库对象进行管理,维护这些物理对象的逻辑属性,并向外系统提供访问数据库逻辑信息的接口。以查询引擎为例,查询对象的定义是基于数据字典进行的,而这份数据字典来自查询对象所指定的数据源。由于多数报表的列与业务数据库的字段存在某种对应关系,因此数据字典的存在有助于提高查询定义的直观性和易用性。图 3-5 NC数据字典NC数据字典通常在安装产品时候由系统生成,如果想自己为某些数据库对象生成字典,可以采用数据字典管理界面提供的导入方法。导入方式包括三种(详细操作可参见数据字典导入说明):1、 解析PDM文件(xml格式);2、 解析NC标准建库脚本;3、 提取数据库元数据;如果需要给非NC数据库(比如用户采用的第三方数据库)生成数据字典,可以利用PowerDesigner提供的逆向工程功能将库里的物理表生成PDM文件,修改其中表和字段的中文名称,然后以xml文件格式存储,再使用上述第一种方法导入。查询引擎中用到的数据字典都以一棵对象树的形式存在,树节点包括目录、表、视图、字段、外键等信息,通过双击对象节点可以协助录入SQL语句的成分。2.2 向导设计向导设计参考典型SQL的构成规则,充分利用数据字典的功能,引导用户一步步完成SQL的设计,因此是推荐使用的方式。它由以下六个环节构成,其中最后一步“交叉属性”超出了SQL的涵义,我们在后面的专门章节中进行介绍。(1) 表定义:即SQL语句中的from部分,可以利用数据字典选择库里的数据表,也可以选择查询对象,从而实现查询的集成(基于查询结果定义新的查询)。(2) 连接定义:即SQL语句中的join部分(表间连接关系),支持单键连接和多键连接两种模式。(3) 字段定义:即SQL语句中的select部分,可以定义任何SQLSERVER语法支持的查询表达式,但要保证字段别名不重复且使用规范名称(以字母开头、由字母、数字、下划线组成的字符串,且不能使用SQL保留字)。如果使用了聚集函数,则由系统自动完成group by部分。(4) 筛选条件定义:即SQL语句中的where部分,可定义确定条件和待定条件。秘笈:如果是待定条件,在值编辑框获得焦点时双击编辑框可弹出参数界面并作引用(或者在值编辑框获得焦点时按F12键弹出参数引用框);如果是固定条件,在值编辑框获得焦点时按F11键可弹出环境变量引用框,按F12键可弹出所引用的基础数据表的参照。对于在查询字段里使用了聚集函数的SQL设计,筛选条件可能需要使用having子句。Having页签默认是隐藏的,可以在查询定义框的南部面板按Ctrl+Shift+鼠标左键弹出隐藏的Having页签。(5) 排序字段定义:即SQL语句中的order by部分。(6) 数据交叉属性:交叉是一种常用的多维数据分析手段,详见后文。 秘笈:向导设计完成后在查询定义框的南部面板鼠标双击可弹出向导生成的等效SQL(待定条件全用(1=1)代替)。图 3-6 表定义图 3-7 增加表(物理表)与临时表图 3-8 连接定义图 3-9 字段定义图 3-10 表达式生成器图 3-11 筛选条件定义(典型模式参见图3-3)图 3-12 排序字段定义2.3 手工设计手工设计是支持自由SQL的方式,由于复杂SQL在解析、适配、执行等方面的不稳定性较大,因此不推荐普通用户使用。手工设计分为以下两个环节:(1) SQL录入:用户可以在数据字典的辅助下录入SQL语句,要求遵循SQLSERVER语法。如图3-13,注意,我们在SQL定义里用到了一个替换型参数(#pk_corp#)(关于替换型参数的具体说明参见附录);(2) 字段显示名设置:系统通过对用户录入SQL的解析获得字段信息,并向用户提供输入字段显示名的机会,显示名的默认值与查询字段的物理名相同。图 3-13 SQL录入图 3-14 字段显示名设置3. 数据交叉3.1 第一类(投影)交叉 投影交叉:假定有一个查询SQL,其查询结果是单行单列的汇总值,另外还有两组WHERE条件的序列,分别为横向序列(WhereX1、WhereX2、WhereXn)和纵向序列(WhereY1、WhereY2、WhereYn),则数据矩阵A(aij)对应的结果集成为投影交叉,如果aij是WhereXi和WhereYj同时作用在上述SQL上获得的结果。比如,某查询用于某公司下各部门各民族的人数,原始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_defdocwhere bd_deptdoc.pk_corp = ?group by bd_deptdoc.deptname, bd_defdoc.docname查出的结果如下表所示:图 3-15 原始数据(无交叉)现在我们把查询字段中只保留人数count(bd_psndoc.psncode)一项,然后进行如下的投影交叉设置:图 3-16 投影交叉设置则交叉后的结果如下表所示:图 3-17 投影交叉结果3.2 第二类(旋转)交叉 旋转交叉:此类交叉用于显示表中某几个字段(称为交叉值字段)的统计值,并将其分组放置在查询结果中,一组列在数据表的左侧(称为交叉行字段),一组列(称为交叉列字段)旋转到数据表的上部成为列表头,统计值则放在对应的交叉单元。关于旋转交叉的更细节的内容,请参考李媛媛所著的交叉表使用说明。两类交叉的最大差别在于:第一类交叉属于查询行为,适用于行列设置都已在表样中固定的报表,其交叉结果严格遵循表样格式,其行列结构不会受查询数据的影响;第二类交叉属于数据加工行为,其交叉后的行列结构在查询出数据之前不可预料,多用于完全真实地对原始数据进行动态处理。沿用3.1使用的例子,假定我们进行如下的旋转交叉设置(其中交叉砝码的意义是代表交叉值字段的位置,它只能出现在交叉行字段或交叉列字段当中):图 3-18 旋转交叉设置则交叉后的结果如下表所示:图 3-19 旋转交叉结果 在旋转交叉设置界面上单击行,列,值标签(在图3-18中用蓝色框标示的位置),可弹出交叉行列复合维度设置和是否小计的设置框。图 3-20 旋转交叉结果(设置了小计)4. 代码嵌入4.1 SQL整理 SQL整理(SQL Repair):指在SQL查询之前,对SQL所作的调整。通常会根据参数的不同,对查询的表、字段或条件等信息进行增补或修改。SQL整理的具体内容由内嵌的代码片段描述(这与后面将介绍的数据加工和穿透规则一样),代码的录入可通过编码向导协助完成,尽管如此,这几种功能仍然推荐由高级实施人员或程序员使用。图 3-21 SQL整理代码在图示的SQL整理代码中,表达了这样一个整理愿望:当参数“detail”取值为“Y”时,引擎会在本查询对象已完成的SQL设计基础上多查询一张表(bd_defdoc)和两个字段(档案编码、档案名称),从而获得更明细的查询信息;如果该参数取值不为“Y”,则仍然按照SQL设计的定义去执行查询。以下简单介绍几种SQL整理算法的编码向导使用方法:(1) 追加查询表:参数为待追加的表物理名。图 3-22 追加表向导(2) 追加连接条件:与追加表同时使用,参数为连接模式、追加表物理名和追加的表间连接条件。图 3-23 追加连接条件向导(3) 追加查询字段:与追加表同时使用,参数为追加字段的表达式、显示名和别名。图 3-24 追加字段向导(4) 按参数追加条件:根据参数取值的不同追加不同的筛选条件,参数为参数名和筛选字段。图 3-25 按参数追加条件向导4.2 数据加工 查询结果集(ResultSet):由二维数据集合(数据体)及其列信息(元数据,包括列名、列数据类型等信息)构成的一个数据载体。查询引擎中使用的结果集为Borland公司开发的DataSet。 数据加工(Data Process):数据加工是指某个(或某几个)结果集在经过一系列加工算法的变换后得到另一个结果集,而后者通常是业务上要求的展现结果。相关的算法又称为加工滤镜,滤镜通常支持输入多个结果集和输出一个结果集,并可以嵌套使用。数据加工与SQL整理的区别在于:前者在SQL查询之后进行,作用的对象是结果集;后者在查询之前进行,作用的对象是SQL定义。在数据加工的编码向导中,提供了多种实用加工滤镜。图示的数据加工代码把ID分别为“male”和“female”的两个结果集按照deptname字段为键进行了左外连接,并在连接结果中保留了“deptname”、“mpsnnum”、“fpsnnum”三列。图 3-26 数据加工代码以下简单介绍几种数据加工算法的编码向导使用方法:(1) 由查询获得结果集:根据查询ID和参数变量获得查询结果集,这里的参数变量是指需要传给目标查询的参数哈希表,默认可以是当前查询的参数哈希表,见图3-27,不需修改。图 3-27 获得结果集向导(2) 公式设置:参数为公式列名、返回值数据类型和公式,如果公式列名不存在则新增一列,否则将该列的内容更新为公式返回值。一个公式也可以引用另一个公式列的计算结果。图 3-28 公式编辑图 3-29 公式定义(3) 结果集连接:指定两个结果集的连接字段、连接方式和连接后的保留字段,得到连接后的结果集。图 3-30 结果集连接向导(4) 结果集联合:指定两个列结构相兼容的结果集,得到联合(union)后的结果。图 3-31 结果集联合向导4.3 穿透规则 数据穿透:假定报表R1上存在某个区域A1,A1内部有若干业务数据,如果以A1为出发点能够切换到另一张报表R2的上的区域A2,而且A1和A2的内部数据存在着某种内在联系,则称可以从R1穿透到R2。当这种穿透行为传递下去,我们就可以了解某张报表的数据明细,甚至追溯到它的数据来源。通常我们会把上述的区域选为一个表格行或者一个表单元,而上述的内在联系就称为穿透规则。一个查询上可以定义多个穿透规则,每个规则需要指定穿透的目标查询,同时目标查询上要创建一个过滤型参数,用于接收穿透区域的取值。如我们现在定义了两个查询:公司部门和部门人员,如图3-32。我们希望在浏览公司部门的时候选中某个部门能穿透到部门人员查询查看这个部门下的所有员工。这首先需要我们在公司部门的查询列和部门人员的查询参数之间建立一个关联关系。这里我们选择公司部门的部门编码(deptcode)列;在部门人员查询里加入一个查询参数部门编码(deptcode,源查询列和目标查询参数名字不一定要相同,但是含义要一致),并在查询定义里引用该参数作为过滤条件。图3-32 公司部门(上)和部门人员(下)定义公司部门的穿透规则,选择查询间穿透向导,设置如下一个查询可以设置多条穿透规则,由本查询可穿透到的目标查询需要创建一个(或多个)过滤型参数,用于接收穿透值。下图所示的穿透规则表达了以下的穿透意愿:如果用户选中了当前查询结果的某行时,允许用户根据选中行的psncode字段取值穿透到另一个查询(即目标查询,其ID为“rygzan”),而目标查询的接收参数为psncode图 3-33 穿透规则定义向导图 3-34 穿透规则代码下图显示了一个由人员信息穿透到薪资信息再穿透到同姓员工工资信息,最后穿透到每月明细的用例,其中第一步穿透是单列等值穿透(相当于“人员=李涤非”),第二步是非等值穿透(相当于“姓名 like 李%”),第三步是多列联合穿透(相当于“人员=李屏 and 年份=2003”)。图 3-35 穿透效果示意5. 查询浏览5.1 查询执行与展现在建立好查询模型之后,系统提供预览查询执行结果的功能。用户首先输入执行查询所需要的参数取值(如果有参数的话),查询引擎会根据该查询对象的数据源去对应的数据库执行查询,在经过查询结果集评估(对于查询记录数过大的情况允许用户优化或放弃查询)之后,把结果集展现给用户。在展现之后,用户可以继续进行穿透、交叉等工作。图 3-36 查询预览5.2 数据导出导出功能支持将预览数据导出为纯文本文件,并可进而用EXCEL打开。随着产品的发展,数据导出的格式会逐步丰富。5.3 创建物化表查询引擎可以根据预览数据直接到数据库创建物化表,同时将物化表的结构注册到数据字典(物化表会注册到DDC的 物化临时表 目录下)中,以后的SQL设计就可以基于新创建的物化表进行,从而扩充了查询集成的范围。引用了物化表的查询,在执行前会提示是否同步刷新物化表,如果选择了刷新,则会按当前的参数设置传递给产生物化表的查询,重新执行得到结果并更新物化表,再在此基础上执行当前查询;如果未选择刷新,则直接基于物化表里的已有数据执行查询。 由一个查询生成物化表,该表会创建到查询定义所在的数据源(如果是数据仓库下,可通过切换定义数据源查看当前所在数据源),而不是查询取数数据源(就是选中查询后在右边属性列表里的数据源)。如果是客户化下的查询引擎,这两者是一致的,因为客户化下的查询引擎只支持单数据源,就是当前登录账套所在数据源。图 3-37 创建物化表图 3-38 在定义查询时引用创建的物化表第四章 查询引擎的界面模型界面模型节点的新建和管理参见第二章。我们可以设计新的界面模型,也可以对已有的界面模型进行修改。界面模型的设计包括引用查询,界面可视化设计,绑定数据集,数据预处理等部分。界面模型(展现模型)设计如下:界面模型设计态和运行态的基本流程如下图所示(设计态的操作并没有严格意义上的顺序限制):图 4-1 界面模型流程1. 引用查询引用查询是指将界面模型所要展现的查询结果集对应的查询定义引用到模型中来。由于同一查询定义根据不同参数设置也可以得到不同结果集,所以为了区分这种绑定基于同一查询定义的不同结果集时,我们对每一个查询结果集起一个单一的别名来标志。图 4-2 查询引用界面对于数据集之间存在的某种一对多的关系,我们还可以根据需要建立主从关系(即主子表)。查询引擎支持两个数据集之间按照多列关联建立主从关系。图 4-3 主子连接设置界面2. 格式设计界面模型的格式设计包括了控件拖放,编辑控件属性及数据绑定属性,定义列格式,列表头,行表头等行列格式以及数据预处理等几部分。分别介绍如下。图 4-4 界面模型设计界面2.1 控件管理界面模型设计工具提供了几种最常用的控件,如图4-4中控件栏中所示,分别是按钮、复选框、组合框、标签、列表、单选框、多页签、表、文本域、文本框、树、面板、分割栏、图表和参照控件,其中最重量级的控件是表和图表,绝大部分的数据集展现工作是这两个控件完成的。初始时,界面上只有一个面板,处于选中状态,布局是默认的BorderLayout。我们接下来的工作就是要在这个面板上定制我们的界面,这个过程和一般的Java可视化设计大同小异。 查询引擎的布局基本上沿用Java布局的FlowLayout,BorderLayout和GridLayout(BorderLayout和Java稍有区别),前两种是比较常用的。FlowLayout布局顾名思义,是流程式的,象字处理程序安排段落里的文本一样布局GUI元素。图4-5 FlowLayout示例查询引擎里的BorderLayout将容器分成了北、中、南三个区域,每个区域放置一个子控件(和Java的五个区域稍有不同),北区域和南区域按控件首选高度来布置,宽度都是充满这个容器,剩下的空间全部划分给中区域。如图4-6,主面板的布局就是BorderLayout,其北区域放置了一个子面板,布局为FlowLayout,中区域放置了一个分隔栏控件,左右各放了一个表格,南区域放置了一个多页签。图4-6 BorderLayout示例GridLayout按照指定的行数和列数来平均分隔容器空间,形成很多子区域,每一个区域内放置一个子控件。图4-7 GridLayout示例图 4-8 界面模型双击界面上的控件就可以打开属性编辑器,可以编辑控件的相关属性。属性编辑器上边是当前界面的控件列表,下面列出了当前选中控件的属性列表。我们可以从控件列表中选中控件,也可以在界面上双击控件来选中控件进行属性编辑。图 4-9 属性编辑器所有控件都有背景色,前景色,字体和首选大小等普通属性。其次,控件具有一些自己特有的属性,如面板具有布局属性,分割栏有分栏方向,分栏位置等特有属性。下面我们来介绍一下几个主要的控件。展现数据集的最重要的控件表的几个属性:(1) 绑定数据集:可以将表绑定到引用查询中的某一个查询定义,那么在运行态下表展现的就是该查询定义对应得到的查询结果集。当设置了表的数据集绑定属性后,该查询定义中定义的列就相应的出现在表里(此时没有数据只有表头);(2) 列格式绑定:有时候会对表中的数据展现有各种格式上的要求,如预警显示,精度设置,前缀后缀等等。这时可以设置表的列格式属性,在列格式属性里不但可以设置列绑定的列格式,也可以设置列的显示顺序,显示与否等属性(列格式的定义在后面的小节里专门讲述)。图 4-7 列格式设置(3) 列表头绑定:当表绑定了数据集之后,可以根据展现需要绑定列表头格式,在表头ID属性里绑定表头的ID之后,从界面上就可以看到表的列表头已经绑定到了表头ID对应的表头格式(列表头格式的设计在后面的小节里会专门讲述);(4) 行表头绑定:如果表绑定的查询定义里定义了第一类交叉(即投影交叉,参见第三章第3节),则表还可以设置行表头格式。关于行表头的定义和设置在后面小节中讲述。图表:图表控件在设置了数据集绑定属性之后,可以设定其数据绑定属性。在图表控件上弹出右键菜单点击数据绑定菜单项,可弹出数据绑定设置界面如图 4-8所示。在这里我们可以设置图表的类型,以及绑定的系列等属性。图 4-8 图表数据绑定设置界面图表支持的类型有三种:分类图、饼图和仪表图。分类图有2D和3D两种,还可以选择是水平方向还是垂直方向展开,如果选择了各系列单独设置图例,还可以对不同的系列设置不同的展现类型。如图4-9,显示了两个系列的数据,一个系列是直方图,一个系列是折线图。图4-9 分类图饼图也有2D和3D两种。图4-10显示了图4-9中的数据用饼图类型的展现。图4-10 饼图仪表图将每个系列的数据在一个仪表盘中显示。图4-11为同样的数据在仪表图的展现。仪表图一次展现数据中的一条记录,可以通过仪表图中的导航工具栏浏览数据。图4-11 仪表图列表,下拉框、文本框,标签,参照等简单控件提供了绑定到多种内容的属性。其中,列表和下拉框可以绑定到查询结果集中某列(导航或枚举),绑定查询结果集对应的参数(即查询参数);文本框可以绑定查询参数和环境变量;参照控件可以绑定查询参数。下面是设置一个文本框绑定到查询参数的截图。图 4-12 绑定查询参数的文本框2.2 行列格式设计行列格式设计包括列格式定义,列表头定义和行表头定义三部分,分别说明如下。l 列格式定义图 4-13 列格式定义界面我们可以定义四种类型的列格式:字符型,数值型,货币型,百分比型,后三种实际上都属于数值型数据的不同展现。格式定义包括对齐方式,文本颜色,前导符号等等。对于数值型的列格式还可以设置保留小数位数,是否加千分位等格式。列格式的一个比较重要的设置就是设置预警显示,预警显示就是将符合指定条件的数据按指定颜色来显示。如销售额这样的数据通过分段预警就很容易体现出高中低来,方便浏览数据。图4-14中所示预警设置就是将小于60的数用红色显示,60到80之间的数用蓝色显示,大于80的数用黄色显示。预警条件中除支持用常量表达式进行比较之外,也支持用含变量的表达式进行比较,其中的变量名必须是表中某列的列名。如表中有A,B,C三列,要求某行中A列中的值大于B列和C列的值之和时该行A列按某种指定颜色显示,我们可以给A列绑定列格式,在列格式的预警设置中设置预警条件为B+C(注:这里的A,B,C都是指的列名,不是列显示名,参见图4-7)。图 4-14 预警设置界面l 列表头定义图 4-15 列表头设计界面有时候为了方便归类和分组列数据,我们需要定义多表头来加强展现。如图4-15,我们可以根据自己的需要定义一个多表头用来展现,在这里,可以很方便的组合表中列,定义好的表头格式存在数据库中,并有一个表头ID与之对应。通过表头ID该列表头格式可以被表绑定(绑定了列表头的表效果参见图 4-5)。小技巧:定义对应某一查询的列表头展现时,我们可以通过参照,选中该查询来快速引入该查询定义的列,而不用手工录入。l 行表头定义如果设置表的绑定数据集属性到一个定义了第一类交叉的查询,那么表中会出现与查询中定义的列和行相对应的列头和行头。默认的列头和行头没有任何附加的格式,如图4-16所示。图 4-16 绑定到第一类交叉查询定义的表就像可以给列分组定义列表头一样,我们也可以给行分组定义行表头。如图 4-17所示,类似于列表头的定义,我们也可以合并行,还可以定义行号显示与否,行号显示的位置,甚至可以为定义好的表头绑定列表头。保存后我们可以看到界面上的表已经显示了新定义的行表头格式。图 4-17 行表头设计界面图 4-18 定义了行列表头格式的表(承图4-16)2.3 预定义数据处理界面模型中支持两种数据预定义的处理:定义公式列和定义小计合计。其中,公式列定义是基于查询结果集的,定义的公式列对于所有绑定该查询结果集的控件都是可见的。小计合计是基于表控件的,定义的小计合计只对该表起作用,不影响其他绑定到相同数据集的控件。l 公式列点击数据处理菜单下的公式列菜单项,就会弹出如图 4-19所示的公式列定义界面。图 4-19 公式列定义界面在查询结果集下拉框中选中要定义公式列的数据集,如果是添加公式列,则数据集中可选的列名会出现在可选列列表中(如果是预定义的公式列,则可选列是数据集的原始列,如果是运行态定义的公式列,可选列还包括已经定义的公式列),双击列项可将该列添加到公式表达式中,公式列中可用函数和操作符也已列出,均是通过双击可以添加到表达式中。添加公式列需要指定公式列名和公式类型,也可以给公式列指定列格式。公式列表达式只支持Ascii字符,不支持中文,如果表达式有误,则运行态下公式列内各行的值均为空。如果是删除公式列,列表中列出了当前数据集已定义的公式列,选中即可删除。修改公式列界面与添加公式列类似。l 小计合计设计界面模型时在表控件的表头上弹出右键菜单,点击小计合计菜单项可弹出设置小计合计的界面,如图 4-20。其中,根据表绑定的查询定义的不同,界面会稍有区别,分别说明如下。普通表:可以设置根据什么列分组,进行小计合计,以及分组列的升降序;可以设置小计合计计算与否,以及小计行和合计行标志展现;可以设置需要小计合计的列,以及统计运算的类型,目前支持的运算类型有求和、最大值和最小值;可以设置统计数据放置在原始数据之前还是放置在后。第一类交叉表(投影交叉表):定义了第一类交叉的查询结果集行列结构是固定的,多用在固定格式的报表中,因此,其小计合计也设计得稍有区别:在这种情况下,小计合计是根据表的行头来进行的,它根据表行头所示的树状结构中树节点的级次来小计合计,所以,对于这类表,我们设置的是小计开始级次和终止级次,而不是分组列。 a 普通表 b投影交叉表图 4-20 小计合计设置界面3. 界面运行对于已经格式设计完毕的界面模型,我们可以运行该界面来查看结果。3.1 界面初始化我们发出运行某界面的命令后,在界面呈现出来之前,系统会做一系列的初始化工作:根据界面模型引用的查询定义查询得到对应的结果集,由界面定义构造出界面,根据数据集绑定属性将控件绑定到对应的结果集,当所有的初始化工作都完成以后,界面才呈现在我们面前。图 4-21 查询参数设置界面如果界面引用的查询定义里定义了查询参数,那么在初始化界面工作去后台查询结果集之前,会要求我们输入查询参数。如当我们运行图4-5 中定义的界面模型(它引用的查询如图 4-2所示)时,因为其引用的查询定义中“部门档案”是定义了参数的,所以系统会弹出查询参数设置界面让我们输入查询参数,如图 4-21所示。图 4-22 界面模型运行结果(承图 4-5)输入相应的查询参数,运行结果如图 4-22所示。3.2 数据处理界面模型在运行态提供了几种数据处理的功能:查找,排序,过滤,公式列,小计合计,交叉和穿透。其中,查找,排序,过滤和公式列是基于数据集的,这些操作对于所有绑定到被操作数据集的控件都是起作用的,放在数据处理菜单下,而小计合计,交叉和穿透是基于表控件的,放在表控件表头右键菜单下,只对表控件本身的数据展现起作用,不影响其他控件。l 查找图 4-23 查找设置界面选中要进行查找的数据集,以及要查找的字段,输入查找值就可以进行查找,如果数据集中存在符合查找条件的记录,数据集会滚动到这一条记录,同时在界面控件上体现出来。l 排序图 4-24 排序设置界面选中要进行排序的数据集,选择排序列及升降序,可以对数据集进行排序(相当于Order By)。l 过滤过滤设置分两种类型,叠加过滤和重新过滤。叠加过滤是在前过滤结果的基础上再按指定条件进行过滤得到新的结果;而重新过滤则是去掉了之前设置的过滤条件,在原始结果集的基础上按指定条件过滤得到新的结果。过滤条件的设置有普通模式和高级模式,普通模式的条件设置类似于查找设置,而高级模式的过滤条件设置支持带参数表达式的过滤,其表达式的定义类似与公式列表达式的定义,但必须是逻辑表达式。图 4-25 过滤设置界面l 公式列,小计合计运行态公式列定义和小计合计定义类似于预定义数据处理中所述,不再赘述。l 交叉图 4-26 第一类交叉(投影交叉设置界面)图 4-27 第二类交叉(旋转交叉设置界面)数据交叉的意义和说明参见第三章第3节。界面运行态下的表控件支持交叉操作:如果绑定了定义第一类交叉(投影交叉)的查询定义,则表控件支持的是第一类交叉;如果绑定的是其他查询定义,表控件支持第二类交叉。l 穿透第 4-28 穿透规则选取界面穿透的意义和说明参见第三章第4.3小节。界面运行态上如果某表控件绑定到定义了穿透规则的查询定义,则该表控件支持穿透操作。l 回退/恢复界面还提供了回退/恢复功能。在对数据集进行了一系列数据处理操作之后,可以利用恢复功能恢复到原始状态。表控件提供了回退功能可以撤销交叉和穿透等操作。3.3 控件连动控件连动分同步连动和主子连动两种。l 同步连动当多个控件绑定到一个数据集时,当对该数据集进行了查找,排序,过滤,公式列等操作时,数据集的变化会通知到每个控件,是它们相应的更新展现,体现出同步的连动。图4-29上的表格和图表引用了相同数据集,因此当进行排序、过滤等数据集操作的时候,表和图上的数据会出现完全同步的变化。同样,在图上点击某个系列时,表也会相应的定位到该系列。图 4-29 表-图同步互动l 主从连动如果两个数据集之间建立了主从关系,则分别绑定到这两个数据集的控件之间就形成了主从连动的关系。如图 4-22展现的就是两组建立了主从连动关系的表控件,当主表选中某行时,子表则相应的展现出与主表记录对应的所有子表记录。3.4 报表打印界面模型提供了预览和直接打印的功能,这部分的功能暂时还不完善,有待扩充。3.5 功能节点挂接定义好的界面模型并不限制在查询引擎下运行,它也可以作为独立的功能节点挂接在各业务组的功能模块下。其挂接步骤如下:图 4-30 功能节点挂接(注册功能节点)注册功能节点时需指定对应文件名为:nc.ui.pub.querymodel.QueryNodeUI,每个节点还需定义两个参数: pkQryNode:界面模型对应的编码 dsName:定义数据源这样,功能节点挂接就完成了。附录1. 查询引擎FAQ之参数篇1、参数定义中的“操作符提示”列是什么意思?是否有用?答:通常此列内容只有提示意义而无实际用处。只有对于参照型参数并且所填内容为like或in的时候有特殊含义前者会在参照出来的值后面加百分号,后者支持参照多选。2、数值型参数和字符型参数有何差别?答:数值型参数保证其在引用过程中参数值不加单引号,而字符型参数可能视引用的具体情况有所不同。3、在进行复合查询的参数定义时,是否需要列出所引用子查询的参数?答:是的,复合查询不会自动去递归提取所引用子查询的参数并集。这个并集需要通过手工引用。复合查询自身不一定使用其中的参数,但它负责把参数分发给引用的子查询。4、如何快速引用其它查询对象的参数?答:鼠标单击南部面板。5、什么是替换型参数?答:参数名以#开头和结尾的参数称为替换型参数(如#param1#),这类参数在引用时被完全字符替换为相应的参数值,而普通参数只限于在向导式设计中作为待定条件的取值。在Sql手工设计里用到的参数必须是替换型参数。6、“枚举项”列是用来设置什么的?如何设置?答:对于枚举型参数,枚举项可以用“可选项1可选项2可选项n”描述,也可以用“select distinct 字段 from 表”描述。对于参照型参数,枚举项可以选择预置的基础参照,也可以使用程序员自己开发的参照类(参见问题8),也可以使用自由参照(参见问题9)。对于字符型参数,除非枚举项中填入了自定义录入界面的类名(参见问题10),否则枚举项无实际意义,也无须填写。7、如何让参照型参数的参照支持多选?答:参见问题1,即将操作符提示设为“in”。8、如何使用程序员自己开发的参照模型?答:在参照型参数的枚举项中用“”格式填写参照类名要求该类继承自AbstractRefModel,且有无参构造子。9、如何使用自由参照?答:假定有一个非复合查询a,用户可以在另一个查询对象b的参数定义中指定一个依赖于a的参照型参数,格式为:依赖查询的ID,参照标题,主键列序号,编码列序号,名称列序号比如a,自己写的参照,0,1,2写在枚举项里面,这时浏览查询b进行参数设置的时候,对应参数弹出的参照即为自由参照。它突破了参照必须由基础数据预置或者程序员编程的限制。10、程序员如何自定义参数的录入界面?答:程序员写一个类继承nc.ui.pub.querymodel.IAdvParamDlg,实现其中的两个抽象方法,然后把“”写到字符型参数的枚举项中,参数设置的时候就能够弹出自定义界面。要求这个界面的返回值要组织成字符串形式。11、什么是参照依赖?答:假定参数1是公司参照,参数名为corp,参数2为部门参照,参数名为dept,现在希望dept参照出corp所选公司下的部门,就可以写参数依赖表达式。格式为“bd_deptdoc.pk_corp=corp”,运行时“参数名”会被替换为对应的参数取值。参数如果是字符型的,必须用单引号(英文 )括起来。另外,参照依赖表达式也可以不含参数,是个固定表达式。另外,有的树表型参照,只有一个依赖条件是不够的(因为里面的树和表分别都需要过滤条件,对应参照代码中的setWherePart和setClassWherePart),对于这样的应用,我们可以在参照依赖里输入两个表达式,中间以分号(英文分号 ;)隔开。以主体账簿参照为例,如果我们需要参照出所有的主体账簿(不受当前登录公司限制的),可以输入这样的参照依赖条件:“ISNULL(bd_glorgbook.dr, 0) = 0 and isstartuse =Y;ISNULL(dr, 0) = 0”,分别对应参照的WherePart和ClassWherePart。12、参数设置时参数的录入界面有几种?答:四种直接录入(对应一般的字符型和数值型参数),下拉框录入(对应字符枚举和数值枚举型参数),参照录入(对应参照型参数),自定义界面录入(参见问题10)。13、参数设置时将某个参数值设为空意味着什么?答:如果是替换型参数,则对应的参数值被替为空字符串;否则,该参数对应的待定筛选条件忽略(相当于1=1)。14、浏览格式与浏览查询在参数设置的时候有何差别?答:后者的设置界面只可能是单页签,前者根据所引用查询别名的数目可能会有多个页签。15、浏览格式时参数设置界面中的快捷按钮有何作用?答:快捷按钮只在多页签的设置界面中出现,用于将第一页签的设置应用到其它页签的同名参数。参考文献1朱俊彬,二次开发平台_自定义查询与数据仓库,2003;2朱振杰,报表工具详细需求,2003;3胡佑安,功能建模需求规格书,2003;4李媛媛,DDC详细设计,2003;5李惠萍,赵世春,数据仓库讲稿,2003;6朱俊彬,自定义查询的发展与开发模式的推进,2003;7李杨东,核心数据结构,2003;8朱俊彬,查询引擎交流,2003;9李媛媛,交叉表使用说明,2003;10朱俊彬,NC数据加工说明文档,2003;11李杨东,查询数据集方案,2003;12阳雄,多行头使用说明,2003;13阳雄,树表展现简单使用说明,2003;14David Gilbert,JFREECHART: Version 0.9.11,2003;15Borland,JDataStore 6.0 API Specification,2003;
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!