最近在帮助客户解决技术问题的时候,遇到一个这样的需求,客户从数据集中选出的字段是通过宏动态改变的,而报表中的某个列所对应的字段也是动态改变的,这种需求在报表中直接实现不是很方便,下面就用动态宏和动态参数来实现这个需求。

第一步,新建一张报表,连接demo数据源。

新建一张空白的报表,这个报表的数据集有些特殊,里面的sql不是直接写字段的,而是用到了宏,这样做可以根据自己的需要,设定需要的字段,sql为:SELECT 订单.订单ID,${macro1} FROM 订单 ,而宏macro1为:订单.订购日期,订单.货主名称,订单.货主地区,订单.货主地址,订单.货主城市,这个宏是普通宏。

报表的样式和宏的写法如下图所示:

 

第二步:写动态宏,实现列动态显示某个字段。

新建一个参数agr1arg1的内容与宏macro1相同,内容为:订单.订购日期,订单.货主名称,订单.货主地区,订单.货主地址,订单.货主城市,参数的类型为普通参数。然后再新建一个动态宏,名字为macro2,宏的内容为:“ds1.”+mid(valueat(@arg1,2),3),这个宏的作用是动态取宏macro1的某字符串(也就是数据库里面的字段),然后在报表中展现出来。

其中valueat()函数的作用是截取到参数arg1某个位置的字符串(字段),如valueat@arg1,2)取到的内容就是订单.货主地区,而valueat@arg1,0)取到的就是订单.订购日期。

mid()函数的作用是去掉字段前面的订单.”,只有去掉这个内容报表才能正确解析出字段的内容,否则报表会把订单.”解析成一个数据集函数,从而产生错误。

macro2的内容如下图所示:

 

 

 

 

第三步:在报表中使用宏macro2

B1单元格中写入${macro2},具体的报表样式如下图所示:

 

 

点击浏览报表,就可以看到如下的内容了:

 

然后我们修改宏macro2的内容为:“ds1.”+mid(valueat(@arg1,1),3),然后浏览报表,可以看到如下结果:

 

 

 

这样在报表中的某个列所对应的字段能够动态改变的需求就实现了,这样做可以使报表更加灵活,一张报表模板可以根据不同的需求展现不同的,报表数据集取数也更加灵活,不必将字段写死也不必将所有字段全部取出