宏,是一个在软件系统中经常听到的词,它是一个约定的标记,赋予该标记以特定的逻辑含义,在BI中,通常用“<#=宏名#>”,来构成一个宏的引用,目前BI中的宏,应用的地方非常广泛,以下简单归纳BI4.X中宏的一些用法。
1. 报表模板中宏的使用
1.1 表头文字中使用宏
支持表头文字中使用<#=宏名#>引用参数、表元值、函数等。
1.1.1. 引用报表参数
参数面板中用户选择的值,可利用宏显示在表头、表尾文字中,使报表的显示更为直观清晰。
1.1.1.1. 日期/年月/年参数
- <#=@bbq#>
表示引用@bbq参数的实际值,显示为4、6或8位字符串;
- <#=@bbq.txt#>
表示引用@bbq参数的显示值,显示为带年、月或日的文字。
//说明:参数后加“.txt”的用法,为BI中的对象表达式的几种常用用法之一,其他对象详情还请参考对象表达式文档。
- <#=od(@bbq,’y-1’)#>
宏引用中也支持使用函数,如od、diminf等函数,假设@bbq为日期参数,则表示选择日期20170301的去年今日,即显示为20160301。
1.1.1.2. 维下拉参数
- <#=@xzqh.txt#>
表示引用@xzqh维下拉参数的显示值;
参数多选的情况下,此种写法,也会自动在多选项之间加上逗号分隔。
1.1.1.3. 枚举下拉参数
- <#=@type.txt#>
表示引用@type枚举下拉参数的显示值,即文字值显示;
- <#=@type.txt.split("|").join(",")#>
在枚举下拉参数多选的情况下,使用该种写法可在多选项之间自动加逗号分隔,如需要加上其他符号,可直接替换join括号中的值。
以上参数,具体示例如下表所示:
类型 | 参数名称 | 参数标题 | 宏示例 | 返回值 |
日期参数 | @year | 年份 | <#=@year#> | “2017” |
<#=@year.txt#> | “2017年” | |||
@month | 月份 | <#=@month#> | “201702” | |
<#=@month.txt#> | “2017年2月” | |||
@day | 日期 | <#=@day#> | “20170301” | |
<#=@day.txt#> | “2017年3月1日” | |||
维下拉参数 | @xzqh | 行政区划 | <#=@xzqh.txt#> | 单选:“上海市”; 多选:“上海市,北京市” |
枚举下拉参数 | @type | 性别 | 单选:<#=@type.txt#> | 单选:“男”; |
多选:<#=@type.txt.split("|").join(",")#> | 多选:“男,女” |
1.1.2. 引用表元值
报表表格中计算出的值,也可以利用宏进行引用。
1.1.2.1.固定表元
- <#=GRID1.B1#>
表示引用GRID1表格中B1表元的值,如下图所示:
1.1.2.2. 浮动表元
浮动表计算后会有多行数据,所以浮动表元的宏引用,需要加上$美元符号,即取出来的是一组数组值。
- <#=GRID1.A2$#>
//此处示例中,A2单元格中拾取的是主题表中的关联维表的字段
表示取主题表字段关联的维表的id值,此处是一组数组,如下图所示:
- <#= GRID1.A2$.select(true,@.txt)#>
表示取主题表字段关联的维表的文本值,此处也是一组数组,如下图所示:
1.2 参数默认值中使用宏
日期参数中经常需要动态设置默认值,此时,也需要用到宏。
- 例如,日期参数,默认要求动态显示当天前一天的日期,如何实现?
//可以在日期参数属性中【默认值】中输入<#=od(today(),"d-1")#>。
- 例如,日期参数,用户只能选择过去一年和未来一年的数据,如何实现?
//可以在日期参数属性中的【起始时间】中输入<#=od(today(),"y-1")#>,在【截止时间】中输入<#=od(today(),"y+1")#>。
1.3 分析区表格使用宏
- 表格中列头文字需要引用参数时,也可以使用宏。
例如,表中的一列指标【收入】列头文字,希望显示选择的月份参数的值作为列头指标,如何实现?
//可以在表格单元格中【默认值】中输入“<#=@bbq.txt#>收入”。
- 行/列显示隐藏
行或列右侧属性中【显示】,如需要根据条件,控制该行或列的显示隐藏,此时也需要用到宏。
//<#=if(@type=’0’,15,0)#>,意为如果@type的值为0,则该行/列显示(15=显示1+打印2+打印预览4+导出8),否则就隐藏。
- 排序类型
浮动维单元设置报表排序时,其排序类型可根据参数动态选择升降序,此时需要使用宏。
//<#=if(@px="0","asc","desc")#>,意为如果@px的值为0时,升序排列,否则降序排列。
【补充:排序依据不需要用到宏,可以直接写if表达式,如:if(@px="0",B1,C1),意为当@px为0时,按照B1排序,否则按照C1排序】
说明:大多数情况下,如果定义条件的输入框没有【公式定义向导】对话框的,大多数写法中都需要使用宏来引用。
1.4 过滤条件中使用宏
过滤条件中也可以使用宏;
- 过滤条件中带if判断的
例如,需要实现,当login.id为0000的时候,查看所有数据,不为0000时,用户只能看到userid等于当前登录用户id的数据,如何实现?
// if("<#=login.id#>"="admin","1=1",xxb.userid="<#=login.id#>")
- 使用sql语句中的like语法
例如:需要实现根据参数输入框中的文字模糊匹配option字段存储的数据,如何实现?
//XXB.option like ‘%<#=@info#>%’
1.5 特殊函数使用宏
- Mkfilter,作用是过滤掉报表参数为空的过滤条件,该函数需要配合宏来使用。
//<#=mkfilter(“xxb.bbq=@bbq and xxb.type=@type”)#>
意为,当@bbq参数为空时,xxb.bbq=@bbq过滤条件不会出现。
1.6 钻取传参使用宏
钻取在手动传递参数时,传递的值可能来自于已有的报表参数、表元值等,此时也需要利用宏来引用,写法如图所示:
1.7 SQL数据源中使用宏
SQL数据源需要跟参数联合进行报表的制作,其中对于参数在Sql语句中的引用,也是需要用到宏的。
//定义sql数据源:select * from XXB where bbq=’<#=@bbq#>’
具体使用详见Sql数据源文档。
2. 分析报告中宏的使用
除了报表模板以外,word式分析报告除了通过拾取,来引用报表内容外,还可以通过直接书写宏文本到报表中来实现相关的内容引用,以及一些文本内容的处理,例如条件显示,循环显示等。
2.1 替换宏
- 简单的内容替换,下面的宏文本计算后将被替换为1000
//<#=1000#>
- 替换宏支持BI的表达式,下面宏文本在计算后将被替换为5000
// <#=if(1>2,1000+2000, 2000+3000)#>; 等号后面可以是BI的表达式,计算后将被替换为5000
- 获取浮动分析表格中一组维表元的文字值,并用顿号分隔
// <#=djfd.GRID1.A2$.select(true,@.txt).join(‘、’)#>
2.2 表格宏
表格宏格式如下:
//<#Table(djfd,"GRID1")#>,<#Table(djfd,"GRID2")#>
2.3 条件宏
条件宏是通过条件判断来决定具体显示哪一段内容的方法;
// <#if(A>B)#>数字A要大于B<#elseif(A<B)#>数字A小于B<#else#>数字A等于B<#endif#> ;--------计算后将根据A于B的大小比较显示不同的语句
当然,word分析报告的条件宏具有不仅仅是条件显示一些文本的能力,它还能够通过条件语句控制一大段文本是否显示,这一大段文本中可以拥有多种多样的段落,图片,甚至表格。
2.4 循环宏
循环宏是word式分析报告中引入的一种新的宏,它能够通过一条循环语句控制一段文本重复出现多次,并且能够在每段文本中使用获取与循环的次数相关的变化的值。
// <#for(I in ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"])#>1.小明在<#=I#><#if(I="星期六"|I="星期天")#>不需要<#else#>需要<#endif#>上班<#endfor#>
计算后的文本为:
1.小明在星期一需要上班
2.小明在星期二需要上班
3.小明在星期三需要上班
4.小明在星期四需要上班
5.小明在星期五需要上班
6.小明在星期六不需要上班
7.小明在星期天不需要上班
循环宏的主要意义在于遍历一个数组,例如遍历某个浮动表元A1,我们便可以通过<#for i in A1$#>来依次取得A1的值来构造需要的文本内容了。循环过程中支持在需要循环显示的文本内部插入图片,表格,段落等等,也支持为循环内容加上标号,例如上例文本内容加上了数字标号,计算结果中则会自动将标号进行递增处理。
【Tips】上述循环宏示例中,每一行文字前面自动递增的数字是如何实现的呢?
这个功能借助了word的自动递增序号设置,只要我们将for和endfor之间的循环文本通过word设置好序号,那么计算后,每次循环的内容都将继续使用word的序号设置,从而产生递增的数字。
请先登录