建模者可为模型中的维度、查询对象添加业务规则,以改进数据检索并确保查询的信息准确。创建业务规则并存储到模型(而不是报表中)中有很多优势,如报表开发者没必要每次都去创建同样的计算下或过滤器,从节省开发时间。同时业务规则确保模型的一致性因为所有报表开发者使用同样的定义,如我们在模型中定义 一个计算项[退货总值]:total([GO Sales].[sales].[quantity] * [GO sales].[sales].[sales price] for report),如下图:
若建模者在模型中修改了表达式或[退货总值]的数据格式等,所有引用了该计算项的报表将会自动更新。同时业务规则还促进了安全保障,如在模型中定义filter(过滤器)限制相关用户所看到的数据。建模者可在模型中添加以下业务规则:
2.3.7.1、添加calculations(计算项)
2.3.7.2、新建并应用filters(过滤器)限制数据检索
2.3.7.3、添加prompts(参数提示)
2.3.7.4、使用session参数、参数宏映射创建动态表达式
2.3.7.5、添加security设置控制用户对query item、query object的查看权限
2.3.7.1 calculations
创建计算项是为用户提供已经计算的常规值,我们可以引用query item,parameters,variables,expresss函数,表达式亦可在报表里定义。这里强调calculations的表达式里可以包含字符,如'?'、'>',但这些字符必须符合7位ASCII字符代码,关于更多信息大家可以参考ASCII表。另外,表达式可以用引用user-defined function,该函数名称不能和相应数据库供应商的函数库名称一致,否则表达式会出错,如DB2有库函数year(),week(),value()。
在查询中,Framework Manager将会为任何calculation返回一个non-null值,当然'除零'错误除外。模型里支持两种计算项:embedded内嵌、stand-alone独立。
1、独立计算项适合重复使用该表达式
建模者可应用一个独立计算项到一个或多个维度或查询对象,为报表提供已经计算的值,创建方法:
选中任意命名空间/文件夹-->右键创建'calculation'.
如图(2.3.7 退货总值),退货总值的表达式:total([GO Sales].[sales].[quantity] * [GO sales].[sales].[sales price] for report),该计算项可以复制到任何维度或查询对象,或创建shortcuts到某个namespace或folder里重复使用。该模式一般适合创建整个模型都通用的值,如当前时间、当前年已过天数、公司名称等,如下:
[currentdate]:current_date
[daysofyear]:_day_of_year ( current_date)
[companyname]:'IBM Cognos Business Intelligence' //返回字符串
[Margin]:(Revenue - Product cost ) / Revenue ,并聚合属性设置为Caculated,避免将百分比汇总。
如下图
2、内嵌计算项仅用于某个维度或查询对象
如下图
收入]、[毛利润]并非直接来自数据库,而是通过添加计算项产生的新数据项。在创建内嵌计算项时,必须确保当前查询对象和被引用查询项的查询对象有关联(relationship),如[库存][员工]表之间没有relationship,若为[库存]创建内嵌计算项引用了[员工]表的某个查询项,显然是无法成功的。若非要在非关联关系的查询对象之间创建计算项,必须确保一下操作:
2.1、确保当前查询对象和被引用查询项所在的查询对象之间有间接或直接的关联路径
2.2、组成计算项的查询项必须符合业务逻辑规则
2.3、转换内嵌计算项为独立计算项
2.4、创建一个包含了内嵌对象的独立计算项,和上面的原理是一样的
内嵌计算项可以转换为独立计算项,如下图
通过上面1、2的比较,不难看出它们之间的区别,比如图标。在Analysis studio里就不支持stand-alone calculations,必须使用embedded calculation(上次论坛的一个vip就提到了这个问题,如果您看到本篇文章就找到了答案)。和stand-alone calculation不同,它不能复制或创建shortcut被其它维度或查询对象引用。
如果说caculation是为了给模型添加数据库中不存在的数据项,丰富模型业务逻辑,那么filter则是限制模型检索的数据内容,那么如何创建filter呢?请关注下一篇 2.3.7.2 Filters(过滤器)。