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