1、.用友 NC报表教程(全)5X这句话返回的就是在这里定义的“数据加工默认数据源” 。V5 版本支持多种数据加工数据源,这里定义的时在默认情况下的数据源,下表列出在各种查询引擎版本下的数据加工数据源及其含义。.版本号 对应数据源及其含义LOGIN 查询引擎单数据源版本,数据源为当前登陆账套数据源Default 默认数据源,在查询引擎环境变量设置中显式定义的数据加工默认数据源DW 查询引擎的 DW 版本,数据源为查询引擎环境变量中定义的 DW 数据源BPM 查询引擎的 BPM 版本,数据源为查询引擎环境变量中定义的 BPM 数据源QMD 查询引擎多数据源版本,数据源为查询对象设计中查询对象的数据源
2、表 二-1首选项配置的内容还包括数据仓库应用的一些配置,以及界面操作过程中的与个性化或性能相关的设置,比如后面会提及的查询执行的最大行数限制等等。首选项对应的配置文件是%NC-HOME%ierpbinqueryengine.xml,是被全集团共享的。4. 资源权限单数据源版查询引擎支持对不同公司的不同用户授予全部权限或浏览权限。全部权限是指所有查询、格式对象的设计和浏览权限,浏览权限是指能够浏览指定格式对象的报表展现。图 二-8 查询引擎权限分配如果想做更细粒度的资源权限控制,比如建立基于创建者的权限体系,或者对查询设计者的可查数据字典进行限制,则需要通过下文介绍的管理插件和设计插件技术进行开
3、发。.第三章 查询模型查询模型的定义包括参数定义、SQL 设计(含交叉定义) 、SQL 整理、数据加工、穿透规则等几部分,其中穿透规则描述的是本查询与外部查询的通信关系,剩余部分都用于描述查询内部的属性。查询引擎的查询模型(数据模型)设计如下:图 三-1 查询模型示意图查询设计态和运行态的基本流程如下图所示:图 三-2 查询模型流程.1. 参数控制参数是查询模型中代表动态信息的元素。在 SQL 设计、SQL 整理和数据加工中,均可以根据参数的不同,对查询的定义和执行进行调整。过滤型参数:如果创建某个参数的作用是根据其取值的不同改变 WHERE 条件的设置,则这类参数成为过滤型参数,这是最常用的
4、参数功能(参数的 FAQ 可以参见附录) 。(1) 参数定义:用于定义本查询内部引用的所有参数,其中参数名要保证互不相同。数据类型包括自由录入、枚举、参照几种,当类型为枚举时,枚举项为用“”分隔的枚举值,或者是一个单字段的查询 SQL;当类型为参照时,枚举项为基础参照名,或者是用尖括号括起的自定义参照的类名。致开发者:在 V5.0 中 该类应该放置在 client以上的包中,对于放置在 private中的类,则会抛出 ClassNotFoundException(2) 参数引用:参数可在 SQL 设计的筛选条件页签引用,也可在 SQL 整理或数据加工的嵌入代码中利用编码向导引用。这里当筛选条件
5、是待定条件的时候,双击“值” ,文本框,就可以弹出参数选择对话框,点击选择对应的参数即可。(3) 参数设置:运行态要求用户首先对参数进行设置,这与查询模板的使用类似。当报表引用了多个查询时,参数将通过多页签设置,每个页签代表一个查询。图 三-3 参数定义.图 三-4 参数引用图 三-5 参数设置替换型参数:是指参数名以#开头并以#结尾的参数,多用于手工 SQL 设计中,也可用于向导 SQL 的非待定条件部分。这种参数通常相当于 preparestatment 中的?占位符,关于替换型参数,后面的章节中还有详细介绍。在设置替换型参数的时候,不输入值将不被认为是忽略此参数对应的条件。.2. SQL
6、 设计SQL 设计包括向导设计方式和手工设计方式,无论采用哪种,在完成设计时系统均会对SQL 进行合法性校验,如未通过校验则不能保存设计。作为向导设计的一个重要组成环节,我们有必要先介绍一下数据字典。2.1 数据字典前面已经提到过,查询对象的属性中包含数据源信息,因此在设计查询的时候需要加载相应数据源的数据字典。我们知道,NC 的数据库以 DDC 作为数据字典,但非 NC 的数据库则没有 DDC,此时,系统会根据执行数据源是 NC、IUFO 或其它数据库三种情况分别加载不同的数据字典,而且这一机制已经预留了扩展的接口,其目的就是可以面向各种类型的数据库执行取数功能。NC 数据字典提供了统一的数
7、据建模平台,支持对各种数据库对象进行管理,维护这些物理对象的逻辑属性,并向外系统提供访问数据库逻辑信息的接口。以查询引擎为例,查询对象的定义是基于数据字典进行的,而这份数据字典来自查询对象所指定的数据源。由于多数报表的列与业务数据库的字段存在某种对应关系,因此数据字典的存在有助于提高查询定义的直观性和易用性。.图 三-6 NC 数据字典NC 数据字典通常在安装产品时候由系统生成,如果想自己为某些数据库对象生成字典,可以采用数据字典管理界面提供的导入方法。导入方式包括三种(详细操作可参见数据字典导入说明 ):1、 解析 PDM 文件(xml 格式) ;2、 解析 NC 标准建库脚本;3、 提取数
8、据库元数据;如果需要给非 NC 数据库(比如用户采用的第三方数据库)生成数据字典,可以利用PowerDesigner 提供的逆向工程功能将库里的物理表生成 PDM 文件,修改其中表和字段的中文名称,然后以 xml 文件格式存储,再使用上述第一种方法导入。查询引擎中用到的数据字典都以一棵对象树的形式存在,树节点包括目录、表、视图、字段、外键等信息,通过双击对象节点可以协助录入 SQL 语句的成分。2.2 向导设计向导设计参考典型 SQL 的构成规则,充分利用数据字典的功能,引导用户一步步完成 SQL的设计,因此是推荐使用的方式。它由以下六个环节构成,其中最后一步“交叉属性”超出了 SQL 的涵义
9、,我们在后面的专门章节中进行介绍。(1) 表定义:即 SQL 语句中的 from 部分,可以利用数据字典选择库里的数据表,也可以选择查询对象,从而实现查询的集成(基于查询结果定义新的查询) 。图 三-7 表定义.图 三-8 增加表(物理表)与临时表(2) 连接定义:即 SQL 语句中的 join 部分(表间连接关系) ,支持典型模式和高级模式,典型模式实际就是关系数据库中的单键连接,连接字段只有一个,并且操作符都是常见的= ,而高级模式可以自由设置连接表达式,支持多键连接。图 三-9 连接定义典型模式.图 三-10 连接定义高级模式(3) 字段定义:即 SQL 语句中的 select 部分,可
10、以定义任何 SQLSERVER 语法支持的查询表达式,但要保证字段别名不重复且使用规范名称(以字母开头、由字母、数字、下划线组成的字符串,且不能使用 SQL 保留字) 。如果使用了聚集函数,则由系统自动完成 group by 部分。V5 中增添了这样的功能,可以在查询字段中添加 NC 的公式,但是这些公式需要特定的格式,例如取得前台数据库缓存中某表的一个或多个字段,可以使用getColvalue(xx,yy,zz),请注意单引号和大括号是必须的。这里的处理机制是先将上述公式作为一个字符串,在查出结果集之后再把公式翻译执行。所以这里的公式是基于最终结果集的。.图 三-11 字段定义图 三-12
11、表达式生成器(4) 筛选条件定义:即 SQL 语句中的 where 部分,可定义确定条件和待定条件。如果是待定条件,在值编辑框获得焦点时双击编辑框可弹出参数界面并作引用(或者在值编辑框获得焦点时按 F12 键或者双击弹出参数引用框) ;如果是固定条件,在值编辑框获得焦点时按 F11 键或者双击可弹出环境变量引用框,按F12 键可弹出所引用的基础数据表的参照。对于在查询字段里使用了聚集函数的 SQL 设计,筛选条件可能需要使用having 子句。Having 页签默认是隐藏的,可以在查询定义框的南部面板按Ctrl+Shift+鼠标左键弹出隐藏的 Having 页签。.图 三-13 筛选条件定义(
12、典型模式参见图 3-3)(5) 排序字段定义:即 SQL 语句中的 order by 部分。图 三-14 排序字段定义(6) 向导设计完成后在查询定义框的南部面板鼠标双击可弹出向导生成的等效SQL(待定条件全用(1=1)代替) 。该功能可以用来检查 SQL 语句是否有错。实际上,每次做完查询设计之后点击确定时,我们都会试执行一下您的 SQL 语句,但是并不查出数据来,如果您的查询设计最终生成的 SQL 语句有问题,那么就会有相应的出错提示。.图 三-15 由查询设计生成的 SQL 语句(7) 数据交叉属性:交叉是一种常用的多维数据分析手段,详见后文。2.3 手工设计手工设计是支持自由 SQL
13、的方式,由于复杂 SQL 在解析、适配、执行等方面的不稳定性较大,因此不推荐普通用户使用。手工设计分为以下两个环节:1) SQL 录入:用户可以在数据字典的辅助下录入 SQL 语句,要求遵循 SQLSERVER语法。如图 3-13,注意,我们在 SQL 定义里用到了一个替换型参数(#pk_corp# ) ,这里替换型参数也必须在前面参数定义中定义,并且参数名要以#开头并且以#结尾。(关于替换型参数的具体说明参见附录) ;.图 三- 16 SQL 录入2) SQL 翻译:实际上最终到数据库中执行的 SQL 语句都是经过翻译的,NC 系统有专门的 SQL 翻译器对各种 SQL 方言进行翻译,在手工
14、设计中可以选择是否启用翻译器这个功能,通常建议启用。图 三- 17 SQL 录入3) 字段显示名设置:系统通过对用户录入 SQL 的解析获得字段信息,并向用户提供输入字段显示名的机会,显示名的默认值与查询字段的物理名相同。图 三-18 字段显示名设置.3. 数据交叉什么叫做数据交叉?在怎样的场景下需要用到数据交叉?让我们来看两个应用场景:1 我们从数据库的原始数据表中经过连接得到这样一个结果集,该表共有三行三列,现在我们想得到部门的员工民族统计表,图 三-19下图是我们想要得到的最终结果:图 三-20我们知道这样的查询实际上是不能通过 SQL 语句来实现的,因为通过 SQL 语句查询出来的列中不可能存在像汉族,满族,蒙古族这样的列,这些数值是原始数据库表中某列中的值。但是这个功能我们可以通过投影交叉来实现。2 还是刚才那个例子,我们现在想要得到的结果需要按照民族列中的民族数动态扩展,也就是说,不能只有汉族,满族,蒙古族这些固定好的值,如果添加了一笔数据,民族的值为苗族,我们最终的报表能够动态的呈现出这样的变化,理想中的结果如下图所示: