X5的主从报表制作
这两天学习X5平台对照着手册练习主从报表的时候出现一些问题,所以写个博客记录下来,本篇博文重点放在创建主从报表上,对于其他步骤一代而过,所以如果有人看到的话不要喷我写的不详细,嘿嘿~~
首先我们要进行数据建模,这是必须的,这里我用商品表作为主表和商品价格表(商品不同日期的价格)作为从表,以fGoodsID作为外键,关联主从表,进行数据建模。
这里需要你自行创建功能模块去输入一些信息,这里我就不浪费文字去按步骤一步一步写了(我不吝啬的其实)。
下面开始进行报表的创建了:
1、 新建action:
报表Action有两种类型,一种是KSQLAction,平台针对报表特别提供的,简单易用的Action;另一种是Action,这是通用的Action,当KSQLAction不能满足需求时使用。
打开模块中的逻辑模块中的action文件,分别添加商品信息以及商品价格的KSQLAction,然后添加相关信息,如图:
注意:这里的procedure属性要选择系统提供的“ksqlQueryProcedure”。
ksqlQueryProcedure中有四个参数:
l 参数ksql是查询报表数据的ksql语句,语句中可以使用占位符变量,即用在变量名前加冒号的方式标记;
l 参数variables指定ksql语句中的参数的值,可以从界面传入;
l 参数dataModal需要指定ksql语句中概念所在的数据模块;
l 参数fnModal指向ksql语句中使用的函数模块,如果没有使用函数,不用赋值。
2、 新建process文件:
创建一个process文件,在动作设置中添加上你上面创建的两个KSQLAction。
3、 创建w文件:
这里我创建一个空白页,一步一步进行设计,如图:
从右侧工具栏中,拖入一个名称为report的报表组件,然后设置左下角src属性,这时开发工具的左侧导航栏会生成一个xls文件。
然后拖入两个名称为reportData的数据源组件到数据模型中,分别设置其id(可以任意起一个)以及source属性设置为之前在逻辑模块中添加的两个KSQLAction(分别为goodsReportAction’和priceReportAction)。
之后就可以右键点击“切换到报表设计”进入excel进行报表的设计了:
如上图:
按照你想要的布局输入你要显示的字段名称以及根据数据源id引用对应的业务字段,上面是我设计的一个比较挫的布局,个人感觉还可以了,为了显示清晰我顺便给每个字段名加了一个背景色。
这里有几个需要注意的点:
1)、在商品颜色名称(主表)的引用字段中要使用select()函数,使其纵向循环输出数据,并且设置其属性(添加批注)is-master-dataset:true,这里文档让其添加individual-table:true,表示该区域独立成一张表,不知道为啥在我这不行,会报错,不知道是我的问题还是本来就不应该加这个批注。错误信息如下:
[ERROR] 2013-07-18 23:35:29,737 com.justep.report.controller.ReportController - 报表执行失败
null
com.justep.report.exception.ReportServerException
at com.justep.report.controller.ReportController.execute(Unknown Source)
at com.justep.report.controller.GenericControllerChain.execute(Unknown Source)
at com.justep.report.controller.DataController.execute(Unknown Source)
at com.justep.report.controller.GenericControllerChain.execute(Unknown Source)
at com.justep.report.controller.InitController.execute(Unknown Source)
at com.justep.report.controller.GenericControllerChain.execute(Unknown Source)
at com.justep.report.Servlet.a(Unknown Source)
at com.justep.report.Servlet.doPost(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NullPointerException
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:991)
at java.lang.Double.parseDouble(Double.java:482)
at com.justep.report.core.XReportHelper.a(Unknown Source)
at com.justep.report.core.XReportHelper.executeXReport(Unknown Source)
... 22 more
2)、在商品价格(从表)的 引用字段中这样写:r2.select(r2.fPrice,'fGoodsID=r1.GO_Goods'),这里select的第二个参数表示从表的外键fGoodsID关联等于主表的主键(这里KSQL语句获取主键直接用数据源.概念名,不能使用fID)。
最后添加功能,设置权限访问即可查看效果,如下图是我制作的一个效果:
在这里说明下:(当前的X5平台为5.2.4版本版本)我尝试求各个商品的平均价格,但是并没有成功,后来我解决未果,将这个问题发到X5平台的论坛里(http://bbs.justep.com/forum.php?mod=viewthread&tid=48836),X5的老师也帮我看了,说是平台的一个缺陷,已经提交到平台开发组解决。