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

浏览: 3190

2.3、有提示输入的变量使用方法

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

使用规则表达式语法为 

           prompt('{参数名称}','{数据类型}','{默认值}','{前缀文本}','{查询项}','{后缀文本}')

   promptmany('{参数名称}','{数据类型}','{默认值}','{前缀文本}','{查询项}','{后缀文本}')

Clipboard Image.png

 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的开发

推荐 0
本文由 贝克汉姆 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册