# 普通宏--动态表名 ## 报表样例 通过本示例,可以了解普通宏在报表中的应用。 制作如下图所示的报表: ## 报表特点 - 用户可以在查看报表时,可以输入要查看数据的表名后缀。 - 报表根据用户输入的表名后缀可以动态地查询出不同数据表的数据进行展现。 ## 制作方法 ### 第一步 定义带有普通宏的数据集 报表数据来自复杂sql数据集,sql语句中应用了普通宏来动态控制需查询的数据表名,具体操作如下: 1)点击【添加数据集】按钮,在弹出的新建数据集页面选择【复杂SQL】 2)在SQL编辑页面输入SQL语句:select * from demo_${tableName} ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_518bd6d2b428dc1670c0d5e744d3bea9_r.png) >定义复杂sql数据集时,在sql语句from关键字后面的表名部分,于“demo_”后设置宏“${tableName}”,作用是通过宏的值来与前面的“demo_”动态地拼接成要查询数据表的完整表名。 3)切换到“宏配置”Tab页下,将自动获取刚才sql语句中设置的宏,默认类型即为普通宏,为该宏设置默认值,表示数据集默认要查询的数据表,设置如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_0e1279fcf572d64f859f6e9953ccc8c8_r.png) 4)点击【确定】,保存为“ds1”。 ### 第二步 设置单元格表达式 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_8724a67ae78f670fc16834584b8b00c9_r.png) 各单元格表达式如下: A3单元格表达式为:=ds1.select(#0) B1单元格表达式为:=to(1,ds1.colCount()) B2单元格表达式为:=ds1.fieldName(B1) B3单元格表达式为:=ds1.field(B2) ### 第三步 设置横向扩展 选中B1单元格,扩展方式设置为横向扩展。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_d76cc8829213f4bea4ad4e62f51021c0_r.png) ### 第四步 设置隐藏 选中A3单元格,勾选右侧属性栏【显示】下的【隐藏列】。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_d82ef49356fda2e377a1ba1499a104bf_r.png) 选中B1单元格,勾选右侧属性栏【显示】下的【隐藏行】。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_be78a0407874dac13900d90e51508ad0_r.png) ### 第五步 设置通用查询 点击【编辑】--【通用查询】进入通用查询设计页面,勾选宏tableName将之添加为查询条件,并设置别名为“表名后缀”。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_3e3ac5d148e3b7bfa76d3281234e8532_r.png) 点击【保存配置】按钮将通用查询设置保存。 ### 第六步 保存预览 点击【保存】按钮对报表模板进行保存,在保存页面设置报表的资源名称、保存路径 和文件名称,点击【确定】,此报表模板保存资源名称为“动态表名”。 点击【预览】按钮对报表进行查看,点击预览按钮时也会对报表进行保存。 在预览界面的查询条件处输入product,查询数据库demo_product表的数据,如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_78efb4356aac2c453faa3ec86b1e8cc3_r.png) 输入customers,查询数据库demo_customers表的数据,如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_4b560d0aafa2b86c2d46f6d972b40616_r.png) ## 功能点说明 ### 普通宏 宏是一个没有数据类型的字符串标识。宏有宏名和宏值:宏名用于唯一标识宏,便于对宏进行引用;宏值即为赋给宏的一串字符值。在表达式中可以引用宏,引用方式为${宏名},例如上面示例sql语句表达式中的${tableName}。 在报表运算之前,系统会全面搜索整张报表的表达式定义,将所有的引用宏名的地方替换成宏值。 宏有普通宏、动态宏、条件宏多种类型。其中,普通宏直接将值作为宏值传到报表中进行计算。 例如在上面的示例报表中,数据集sql语句定义为:select * from demo_${tableName}。当查看报表时传入的宏值为“product”时,系统会首先用宏值替换sql语句中的宏,即sql语句变为:select * from demo_product,所以数据集将从demo_product表取数。同理,当传入的宏值为“customers”时,sql语句变为:select * from demo_customers,数据集将从customers表取数。 数据集中定义的宏会被自动添加为报表宏定义页面,并且宏可以添加到通用查询中作为查询条件。例如上面示例报表中,就将宏tableName设为了查询条件,从而实现了可以根据用户输入的表名后缀,在sql语句中动态地拼接成要查询的完整数据表名,进行动态地表数据获取。 利用宏可以为报表的设计带来极大的灵活性,实现动态地表达式替换,根据用户传入的不同宏值,在报表中计算出不同的表达式结果,从而得到不同的报表信息或进行灵活的控制,减少报表制作的数量与工作量。例如假设某企业对销售订单数据的存储是以销售区域的划分存储在表名为“order_地区”的数据表中,当不同销售区域的员工都需要对订单数据进行查询时,不必制作多张报表,而是可以只设计制作一张统一的报表模板,在报表中利用宏实现数据集的动态表名计算。比如将数据集sql设置为:select * from order_${area}。 ### to()函数 示例报表中,B1单元格的表达式为:=to(1,ds1.colCount()) 。它的结果是生成以1为开始,表达式ds1.colCount()的值为结束,步长为1的N个连续整数。例如=to(1,5) 返回的结果是:1,2,3,4,5 。 由于数据集sql语句查询的表名并不固定,并且是查询全部字段,因此查询不同表时数据集中的数据列数也不固定。为了让报表在展现时,可以计算并展现出与数据集相同的列数,这里使用了to函数让单元格横向扩展出对应个数的格子。其中,ds1.colCount()的结果是返回数据集的数据列数。 ### 数据集函数colcount()、fieldName()、field() B1单元格的表达式=to(1,ds1.colCount()) 中应用了数据集函数colcount()。该函数的作用是可以获得数据集的列数,语法为:数据集名称.colcount()。例如当示例报表数据集查询demo_product表数据时,该表共有10个字段,因此ds1.colCount()的结果是10。这样表达式=to(1,10) 就会返回从1到10的十个整数。由于B1单元格向右扩展,从而就扩展出了十个单元格,在报表中形成十列。 B2单元格的表达式为:=ds1.fieldName(B1)。它的结果是返回列号为B1单元格的值的数据集列名。例如=ds1.fieldName(2)返回数据集第二列的列名。表达式应用了数据集函数fieldName(),该函数的作用是可以根据列号取数据集的列名,语法为:数据集名称.fieldName()。由于B2为B1的子格,将跟随B1向右扩展,因此通过表达式=ds1.fieldName(B1) ,B2单元格最终就显示出了数据集各列的列名。 B3单元格的表达式为:=ds1.field(B2)。它的结果是返回数据集当前行中B2列的数据。例如:=ds1.field("产品ID")将返回数据集当前行中的产品ID。field()是数据集函数,它的作用是获得数据集当前行或者当前组中第一行中指定列的数据,语法为:数据集名称.field()。B3左侧A3单元格的表达式为:=ds1.select(#0)。它的结果是返回数据集所有数据行的行号,因此A3单元格默认按照数据集的行数向下扩展出多个单元格。由于B3是A3的子格,同时也是B2的子格,B3将同时向下、向右进行交叉扩展,从而最终显示出数据集中各行、各列的数据。 ### 单元格的隐藏 报表中B1单元格的作用是向右扩展出与数据集相同的列数,A3单元格的作用是向下扩展出与数据集相同的行数。这两个单元格没有实际业务含义,无需在报表中显示,因此可以将B1所在行、A3所在列的单元格设置为隐藏,从而让报表只显示出需要查看的业务数据。 # 普通宏--动态字段 ## 报表样例 通过本示例,可以了解如何通过利用普通宏实现报表的字段动态查询与展现。 制作如下图所示的报表: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_5363bb5ea2be4b3ebf469c7e82e76ede_r.png) ## 报表特点 - 用户可以在查看报表时,选择需要查询的订单表的字段。 - 报表根据用户选择的字段动态地展现出订单表N列字段对应的数据。 ## 制作方法 ### 第一步 定义带有普通宏的数据集 报表数据来自复杂sql数据集,sql语句中应用了普通宏来动态控制需查询的数据表名。 点击【添加数据集】按钮,在弹出的新建数据集页面选择【复杂SQL】,在数据集编辑页面输入SQL:select ${colnums} from demo_orders ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_d190ce7e5172ac5f8580748e771f93f5_r.png) >定义复杂sql数据集时,在sql语句select关键字后面的字段部分设置宏“${columns}”,作用是通过宏的值来动态地控制要查询的字段。 切换到“宏配置”Tab页下,将自动获取刚才sql语句中设置的宏,默认类型即为普通宏,为该宏设置默认值,表示数据集默认查询的字段,设置如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_e99388adcd64b6f0de97a047fa285460_r.png) 点击【确定】,保存为“ds1”。 ### 第二步 设置单元格表达式 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_b346b51ef25fa1133ff8a4c13337b05f_r.png) 各单元格表达式如下: A5单元格表达式为:=ds1.select(#0) B3单元格表达式为:=to(1,ds1.colCount()) B4单元格表达式为:=ds1.fieldName(B3) B5单元格表达式为:=ds1.field(B4) ### 第三步 设置横向扩展 选中B3单元格,扩展方式设置为横向扩展。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_811bb6d4dc5a541ec7ebd1077712e056_r.png) ### 第四步 设置隐藏 选中A5单元格,勾选右侧属性栏【显示】下的【隐藏列】。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_8265e37f0d28c79835752e631488f049_r.png) 选中B3单元格,勾选右侧属性栏【显示】下的【隐藏行】。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_33ca3c4aacf1a6828e7dc437b893950e_r.png) ### 第五步 设置通用查询 点击【编辑】--【通用查询】进入通用查询设计页面,勾选宏colnums将之添加为查询条件。 ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_492ee5dbb49cfef8e034639ab89c07a3_r.png) 点击查询条件后的【设置】按钮,进入条件配置页面,修改别名为“查询字段”,修改编辑风格为“列表选择”,样式为下拉多选,设置如下图所示: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_6579ac94cfe08748adea499a1d9fd817_r.png) 点击【保存配置】按钮将通用查询设置保存。 ### 第六步 保存预览 点击【保存】按钮对报表模板进行保存,在保存页面设置报表的资源名称、保存路径 和文件名称,点击【确定】,此报表模板保存资源名称为“动态字段”。 点击【预览】按钮对报表进行查看,点击预览按钮时也会对报表进行保存。 在预览界面的查询条件处勾选5个字段,点击查询,如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_802fdaa3417742b547fcd4ce7e540433_r.png) 勾选8个字段,点击查询,如下图: ![](/uploads/projects/7.11_online/uploads/sjjc/images/m_ef0c512f9f23215a02cb5e7e6e081b99_r.png) ## 功能点说明 利用普通宏可实现数据集sql动态字段查询。 在上面的示例报表中,数据集sql语句定义为:select ${columns} from demo_orders。当查看报表时系统会根据传入的宏值替换sql语句中select关键字后边的宏。 宏可以添加到通用查询中作为查询条件。例如上面示例报表中,就将宏columns设为了查询条件,从而实现了可以根据用户选择的字段,在sql语句中动态地拼接成最终要查询的字段,进行动态地表字段数据获取。