贝克汉姆
作者贝克汉姆·2012-10-27 22:33
软件开发工程师·IBM

2.4 剖析Query Macro的函数和应用(续)

字数 3056阅读 3278评论 20赞 14
2.3、有提示输入的变量使用方法
  通过引用查询宏,我们可以为FM模型查询主题创建强制或可选带参数值提示。这两个查询宏就是大家广为熟悉的prompt和promptmany。前者为单个值提示,后者为多个值提示。这俩宏可以被引用到查询主题的SQL语句的任何位置。当宏被引入到一个表达式中,如计算项,则必须指定数据类型,默认情况下数据类型是字符串'string',如prompt('P_UserName')。在完全掌握prompt,promptmany宏函数的使用方法之前,首先来逐步了解他们的使用语法,即可接受的自变量和规则。
使用规则表达式语法为
           prompt('{参数名称}','{数据类型}','{默认值}','{前缀文本}','{查询项}','{后缀文本}')
   promptmany('{参数名称}','{数据类型}','{默认值}','{前缀文本}','{查询项}','{后缀文本}')

(图2.4 完整的prompt函数用法)
  1、参数名称,强制自变量,如
  where country.country_code = #prompt('P_CountryCode')#
  where country.country_code IN (#promptmany('P_CountryCode')#)

  2、数据类型,可选自变量
  在不指定数据类型的情况下,默认为string类型,返回的值结果带单引号,如'Cognos中国'。
  当用于过滤表达式的数据项为非字符类型,在不指定数据类型的情况下则默认和过滤数据项类型一致。如
  where country.country_id=#prompt('P_CountryID')#
  指定数据类型的引用方法为:prompt('{参数名称}','{数据类型}'),如prompt('P_CountryID','integer')。
  除了我们常见的数字、字符或日期三种数据类型之外,可引用的还有
  boolean
  date,datetime,time,timeinterval,timestamp
  decimal,double,float,int,integer,interval,long,real,numeric,real,short
  memberuniquename,当数据源为ROLAP或MOLAP时,引用维度层(MUN)的数据类型,如
    #prompt('WhichLevel', 'memberuniquename')#
  token,该类型不传递参数值,如select * from table #prompt('Sort column','token','group by COUNTRY','group by ')#
  3、默认值,可选自变量
  当用户没有输入任何参数值的情况下,返回指定的默认值,如
  [gosales].[COUNTRY].[COUNTRY] = #prompt('countryPrompt','string','''Canada''')#
  返回结果为[gosales].[COUNTRY].[COUNTRY] = ‘Canada’
  4、前缀,可选自变量
  用户指定的值将会作为前缀和变量值组合,如报表界面显示提示用户输入语言来查看不同语种内容,则我们
  prompt('P_LangV','string','en','product_type_'),返回product_type_en。
  对于过滤器,通常用于控制可选提示,如
  select * from country #prompt('P_CountryCode','integer',' ','where Country.Country_Code =')#
  当值提示输入值为空,则整个prompt为空,即没有任何过滤条件,因此该参数是可选参数
  5、查询项,可选自变量,该自变量可以很好的利用FM中定义的prompt info(请参考博客2.3.1.6.Prompt Info)
   如 #prompt('P_CountryCode','integer',' ',' ','[gosales].[COUNTRY_MULTILINGUAL].[COUNTRY_CODE]')#
  也就是国家代码参数的值来源于查询项[gosales].[COUNTRY_MULTILINGUAL].[COUNTRY_CODE]的prompt info定义。
  6、后缀,可选自变量
  该自变量一般用于promptmany函数使用,亦可用于可选的prompt且SQL语句里的过滤器为hardcoded。它将会作为结果的后缀一起返回。在论坛有人提到过promptmany怎么实现可选参数输入,看看下面的代码就得到了答案。
  #promptmany('P_CountryCodes','integer',' ','where COUNTRY_MULTILINGUAL.COUNTRY_CODE IN( ','',')')#
  因为多选值过滤器会有左括号和右括号,当没有为国家代码参数输入值,则返回
  where  COUNTRY_MULTILINGUAL.COUNTRY_CODE IN (),即过滤器无效。
  有时候,一些过滤条件必须结合起来使用已达到业务意义,如输入国家代码参数值又必须确保该结果是最新的,我们称这种模式为级联过滤。于是我们想出了以下表达式:
  #prompt('P_CountryCodes','integer',' ','where COUNTRY_MULTILINGUAL.COUNTRY_CODE =','',' and IsUpdated=1')#
  当没有为国家代码参数输入值,我们的结果就不关注查询主题返回的结果是否是最新的。至于其它用途,想必各位已经遇到过,那么现在就结合它来试试效果吧。

  注意:必须按语法顺序输入自变量值,如prompt('P_MonthName','201211') ,当FM运行时则提示错误,正确的写法为prompt('P_MonthName','string','201211')。在我们所指定自变量值的前一个自变量在不指定值时就用空格代替,如:prompt('P_MonthName','string',' ','where Sales.Month=')。
  对于Framework Manger的宏函数使用,远不止该文章所涉及内容,本博客只作为学习引导,抛砖引玉。比如宏函数库提供了很多函数列表,有助于我们实现很多功能,那么剩下的任务就留给读者去实践,记得有好的经验一起分享哦,谢谢!下一节将会讲述FM教程的 2.5 DMR的开发

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

14

添加新评论20 条评论

cognossulirongcognossulirong软件开发工程师新大陆软件工程有限公司
2014-11-13 09:32
xieixexie
pjlopjlo数据库管理员银行
2013-11-15 16:46
太棒了,解决了我的需求
okierokier软件开发工程师it公司
2013-06-18 14:34
多谢!
freemanolfreemanol软件开发工程师信和
2013-01-14 16:51
多谢分享
凉菜小妹凉菜小妹软件开发工程师厦门金融
2013-01-09 23:55
zhenqingshinianzhenqingshinian软件开发工程师国际商业机器
2013-01-09 14:16
多谢分享
贝克汉姆贝克汉姆软件开发工程师IBM
2013-01-08 09:22
凉菜小妹: 贝哥结婚啦,新婚快乐哦!啥时候继续更新呀?
就这几天
凉菜小妹凉菜小妹软件开发工程师厦门金融
2013-01-04 17:06
贝哥结婚啦,新婚快乐哦!啥时候继续更新呀?
贝克汉姆贝克汉姆软件开发工程师IBM
2012-12-29 20:26
zzphapy: 小贝,非常感谢你的文章啊! 另:新婚快乐!
thank you
zzphapyzzphapy软件开发工程师Arvato
2012-11-13 13:25
小贝,非常感谢你的文章啊! 另:新婚快乐!
gulangduhugulangduhu软件开发工程师普瑞邦克
2012-11-08 17:57
贝克汉姆: 已发
谢谢贝壳,如果我在建一个项目的时候,误删除某一个项目自带的session parameters,比如account.personaInfo.userName, 如何恢复它呢?是重建还是怎么处理?
贝克汉姆贝克汉姆软件开发工程师IBM
2012-11-07 09:46
gulangduhu: zenghy@primb.com,谢谢贝壳
已发
zhangzhangzhangzhangBI主管赛维LDK
2012-11-06 11:27
谢谢
gulangduhugulangduhu软件开发工程师普瑞邦克
2012-11-06 10:34
贝克汉姆: 给个你邮箱,到时发给你
zenghy@primb.com,谢谢贝壳
贝克汉姆贝克汉姆软件开发工程师IBM
2012-11-05 10:07
gulangduhu: 贝壳有做过Custom Java provider这种认证方式吗?能否给几个例子学习一下?
给个你邮箱,到时发给你
gulangduhugulangduhu软件开发工程师普瑞邦克
2012-11-02 17:20
贝克汉姆: 一样的,cookies传cognos能接受的变量,根据第三番认证程序所支持的变量而异。
如LDAP可以传用户名、邮件地址等
贝壳有做过Custom Java provider这种认证方式吗?能否给几个例子学习一下?
贝克汉姆贝克汉姆软件开发工程师IBM
2012-10-31 14:23
gulangduhu: 就是通过HTML头或者Session来实现
一样的,cookies传cognos能接受的变量,根据第三番认证程序所支持的变量而异。
如LDAP可以传用户名、邮件地址等
gulangduhugulangduhu软件开发工程师普瑞邦克
2012-10-30 17:46
贝克汉姆: 不知阁下所指的自动输入是什么,若不须用户输入值就填充变量,就用session变量
就是通过HTML头或者Session来实现
贝克汉姆贝克汉姆软件开发工程师IBM
2012-10-30 17:20
gulangduhu: 有提示输入的,是否可以实现自动输入?
不知阁下所指的自动输入是什么,若不须用户输入值就填充变量,就用session变量
gulangduhugulangduhu软件开发工程师普瑞邦克
2012-10-30 15:06
有提示输入的,是否可以实现自动输入?
Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广