Mondrian中MDX查询使用时收集的bug及异常处理小结
由于要做多维报表的展现,需要使用OLAP的引擎Mondrian,于是最近一直在学习MDX查询语言,在做Demo时遇到了很多bug,我认为这些异常对于初学MDX查询语言的朋友来说很常见,一般都会遇到这些bug,这里我将自己遇到的bug收集起来,同时将其解决方法一并记录下来,希望遇到同样问题的朋友可以参考一下,希望可以节省一些你调试此类bug的时间。
?
?
异常:1
?[JPivot] 15 七月 2010 10:10:36,312 ERROR [Session FC17340B57820BEB01CC6F6D86DAE1E6] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:
com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:All arguments to function '{}' must have same hierarchy.
?
解决方案:
问题是集合(Set)中的成员不在同一个层次里,比如写成
select {[Measures].[总销售额],[Measures].[贡献度]} ON columns,
? {[产品类别].[所有产品],[客户性别].[所有性别]} ON rows
from [Sales]
?
? ????由于“产品类别”和“客户性别”是两个不同的维度,而MDX的基本特性3—集合(Set),它的特点是集合里可以含有若干个Member,但是必须是同一维度上的Member,如{[Time].[1996],[Time].[1997]};
也可以是Cube上的若干个Tuple的集合,同样要注意的是,这些Tuple集合的子集之间存在严格的维度对称关系,如{([Computers].[China]),([Air_Conditioner].[Jpan])}.
?
?
小知识点说明:
?
[销售季度].[所有季度] [销售季度].children的区别:
如下面的例子:
?
?
?
select {[销售季度].[所有季度]} ON columns,
?
? {[产品类别].CHILDREN} ON rows
???? from [Sales]
?
和
select {[销售季度].CHILDREN} ON columns,
? {[产品类别].CHILDREN} ON rows
???? from [Sales]
?
的区别是:
?
首先,前者是一个Member,后者是一个集合(Set),因此在使用时,特别是放在一个Set中使用时要特别注意,否则会报我上面所说的异常1。
其次,两者显示出来的效果图也是不一样的,在页面上,前者点击“所有季度”后才会展现所有季度;而后者是直接将“第一季度,第二季度,第三季度,第四季度”依次显示在页面客户面前,不能按层次收缩。
?
?
?
?
?
?
异常:2
mondrian.olap.MondrianException: Mondrian Error:Named set in cube 'Sales' has bad formula
Caused by: mondrian.olap.MondrianException: Mondrian Error:Error while parsing MDX statement 'WITH
MEMBER [Measures].[平均单价]
? AS '[Measures].[总销售额] / [Measures].[数量]',
FORMAT_STRING = "¥#,##0.00",
[$member_scope] = 'CUBE',
MEMBER_ORDINAL = 2
MEMBER [Measures].[贡献度]
? AS '([Measures].[总销售额],[所有类别].CURRENTMEMBER) / ([Measures].[总销售额],[所有类别].[所有产品])',
FORMAT_STRING = "#%",
[$member_scope] = 'CUBE',
MEMBER_ORDINAL = 3
SELECT FROM [Sales]'
??? at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)
??? at mondrian.olap.Parser.parseInternal(Parser.java:759)
??? at mondrian.olap.ConnectionBase.parseQuery(ConnectionBase.java:74)
??? ... 59 more
Caused by: mondrian.olap.MondrianException: Mondrian Error:MDX object '[所有类别]' not found in cube 'Sales'
?
?
解决方法:
这个问题报错是由于解析MDX查询语句时发现问题解析不了。
一般遇到这个错就是MDX查询语句中的维度和schema文件tezz.xml里定义的拼写的不一致,或者就是单词拼写错误,我的错误是就是在schema文件里定义calculator时名称写的不一致。
?
?
?
异常:3
Caused by: mondrian.olap.MondrianException: Mondrian Error:Error while parsing MDX statement '
?
select {[Measures].[数量]} ON columns,
????????? {([产品类别].[所有产品]),([销售季度].[第一季度])} ON rows
?????? from [Sales]
'
??? at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)
??? at mondrian.olap.Parser.parseInternal(Parser.java:759)
??? at mondrian.olap.ConnectionBase.parseQuery(ConnectionBase.java:74)
??? ... 47 more
Caused by: mondrian.olap.MondrianException: Mondrian Error:Internal error: while building member cache; sql=[select "Quarter"."quarterId" as "c0", "Quarter"."quarterName" as "c1" from "Month" as "Month", "Quarter" as "Quarter" where "Month"."quarterId" = "Quarter"."quarterId" and UPPER("Quarter"."quarterName") = UPPER('第一季度') group by "Quarter"."quarterId", "Quarter"."quarterName" order by "Quarter"."quarterId" ASC]
?
?
解决方法:
???? 从异常信息可以看出解析MDX语句时发生错误,这个错是由于我表与表之间的关系在schema文件tezz.xml中定义的不对,以至于解析出的sql里出现了字段错位到别的表里去了。将各表间关系定义正确了就可以了。
?
?
?
?
异常:4
[JPivot] 19 七月 2010 15:19:29,656 ERROR [Session ] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:
com.tonbeller.wcf.controller.EmptyThreadLocalStackException
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.wcf.controller.EmptyThreadLocalStackException
??? org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
??? org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
??? org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
??? org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
?
?
页面报的异常为:
org.apache.jasper.JasperException: An exception occurred processing JSP page/test/param1.jsp at line 23:
?20:
?21:Click on a Region.
?22:<p>
?23:<wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>
?24:?
? 25:<from action="param1.jsp" method="post" id="form01">
? 26:
?
?
解决方案:
???? 这个异常耽误了我和同事半天的时间,从控制台和页面信息都找不出错误原因,上网查资料,是有这个异常,我是中英文的网页资料说明都看了,就是没看到解决方法。最后,还是同事的另外一个异常给了我提示,于是我去web.xml文件中查看,果然是里面配置出现了问题。
???? 将web.xml中的filter的url--pattern值由“testpage.jsp”改为“*.jsp” 即可!
?
我之前的web.xml里filter的配置如下:
<filter>
??? <filter-name>JPivotController</filter-name>
??? <filter-class>com.tonbeller.wcf.controller.RequestFilter</filter-class></filter>
? <filter-mapping>
??? <filter-name>JPivotController</filter-name>
??? <url-pattern>testpage.jsp</url-pattern>
? </filter-mapping>
?
?
?
?
异常:5
[JPivot] 20 七月 2010 13:59:00,218 ERROR [Session E2F53D86EE225E320A412091BF8E28D9] com.tonbeller.wcf.controller.RequestFilter#doFilter: Error handling request
com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature 'Parameter(<String>, <Dimension>)'
??? at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)
?
解决方案:Parameter方法有错,其参数好像不能为2个,我改成了3个异常就解决了,bug虽解决了了,但对Parameter的使用及里面的各个参数的作用和意义都不清楚,网上也没找到资料,要是哪位朋友知道的话请不惜赐教一下:
?
将下面代码中的查询:
<jp:mondrianQuery id="paramquery01" catalogUri="/WEB-INF/queries/tezz.xml"
??? jdbcDriver="net.sourceforge.jtds.jdbc.Driver"
??? jdbcUrl="jdbc:jtds:sqlserver://localhost:1433/Tezz" jdbcUser="sa"
jdbcPassword="123">
select
?{[Measures].[数量],[Measures].[平均单价],[Measures].[总销售额]} ON columns,
?{Parameter("ProductMember", [产品类别])} ON rows
from [Sales]
</jp:mondrianQuery>
?
改为:
select
?{[Measures].[数量],[Measures].[平均单价],[Measures].[总销售额]} ON columns,
?{Parameter("ProductMember", [产品类别],[产品类别].[数码])} ON rows
from [Sales]
?
?
?
?
?
异常:6
?
[JPivot] 20 七月 2010 14:05:45,781 ERROR [Session D24F8131994DE11BA5856AC44236BD90] com.tonbeller.wcf.controller.RequestFilter#doFilter: Error handling request
com.tonbeller.jpivot.olap.navi.ExpressionParser$InvalidSyntaxException: [????].[????].[??].[???]
??? at com.tonbeller.jpivot.mondrian.MondrianExpressionParser.parse(MondrianExpressionParser.java:121)
??? at com.tonbeller.jpivot.param.SetParameterTag.setQueryParam(SetParameterTag.java:93)
?
解决方案:异常原因是中文乱码,建议1:改成英文的,建议2:加个过滤器,我暂时使用的是方法1,方法2加过滤器没成功,在web.xml中加上如下代码:
<filter>
? ? <filter-name>Set Character Encoding</filter-name>
? ? <filter-class>com.tonbeller.wcf.charset.CharsetFilter</filter-class>
? ? <init-param>
? ????? <param-name>encoding</param-name>
? ????? <param-value>UTF-8</param-value>
? ? </init-param>
? </filter>
?
? <filter-mapping>
? ? <filter-name>Set Character Encoding</filter-name>
? ? <url-pattern>/*</url-pattern>?
? </filter-mapping>
?
??????也许还要进行其他设置,目前我还没找到解决的方法。
如果哪位朋友知道解决的方法希望告知!同时,由于mdx刚学不久,对于上面总结的不对的地方希望可以指出来!
?转自:http://ruinxdgzy.iteye.com/blog/718285