关于BI中宏的用法,了解一下

8291
3

小亿 管理员

发表于2018-6-27 09:47

楼主
宏,是一个在软件系统中经常听到的词,它是一个约定的标记,赋予该标记以特定的逻辑含义,在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的序号设置,从而产生递增的数字。

最近看过此主题的会员

esen_4Y3L5ADO80

esen_540NOI0GUW

tanxzh

esen_51WR5SHNFH

6515044qqq

蔻恬

贯佳睿

esen_542KO2E0X8

15342787675

wwwwwx

平平无奇小天才

MYoung

chenzy

zrn

hhdtest

3个回答

只看楼主

末小丸 初学数据Lv2

发表于2018-6-29 10:34

只看该作者

取消 关注该作者的回复

沙发

了解了

花街六少 初学数据Lv2

发表于2018-7-2 09:51

只看该作者

取消 关注该作者的回复

板凳

学习了~

liu20220622 数据小白Lv1

发表于2022-8-26 15:57

只看该作者

取消 关注该作者的回复

地板

受教了

登录后可回答问题,请登录注册

快速回复 返回顶部 返回列表

小时

全天响应

分钟

快速处理问题

工程师强势助力

明星产品
解决方案
联系合作

400咨询:400-0011-866

技术支持QQ:400-0011-866(工作日9:00-18:00)

产品建议邮箱yixin@esensoft.com

关注我们

扫TA学习更多干货

一对一专家交流

版权所有© 2006-2024 北京亿信华辰软件有限责任公司 京ICP备07017321号 京公网安备11010802016281号