由于要做多维报表的展现,需要使用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 &apos;Parameter(<String>, <Dimension>)&apos;

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>

也许还要进行其他设置,目前我还没找到解决的方法。

异常:8

[JPivot] 21 七月 2010 23:26:31,109 ERROR [Session 3DA5B31A164F01E50C42D796D221BC2F] com.tonbeller.jpivot.tags.OlapModelTag#doEndTag:

mondrian.olap.MondrianException: Mondrian Error:Named set in cube &apos;Sales&apos; has bad formula

.

Caused by: mondrian.olap.MondrianException: Mondrian Error:No function matches signature &apos;<Level>.prevMember&apos;

解决方法:这个异常可以参看异常15。

%***************************************************************************

异常:9

33031 [http-8088-2] ERROR com.tonbeller.wcf.controller.RequestFilter  - Error handling request

javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:Syntax error at line 1, column 59, token &apos;EOF&apos;

Caused by: mondrian.olap.MondrianException: Mondrian Error:Syntax error in MDX expression &apos;IsAncestor([Sale Region].CurrentMember,[Sale Region].[suzhou]&apos;

at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)

解决方法:待解决

%***************************************************************************

异常:10

Caused by: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:Tuple contains more than one member of dimension &apos;[Product Category]&apos;.

at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)

解决方法:

由于我粗心,将“.”误写成了“,”,才会报上面异常。修改方法为将“[Product Category],[All Products]”改为“[Product Category].[All Products]”。

select {[Measures].[ROI],[Measures].[Number],Measures.[Number Proportion],[Measures].[Average UnitPrice],[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns, NON EMPTY

{([Product Category],[All Products],[Customer Sex].[All Sex])} ON rows from [Sales]

%***************************************************************************

异常:11

2474343 [http-8080-2] ERROR com.tonbeller.jpivot.tags.OlapModelTag  -

mondrian.olap.MondrianException: Mondrian Error:Internal error: Error while creating SQL dialect

at mondrian.resource.MondrianResource$_Def0.ex(MondrianResource.java:785)

at mondrian.olap.Util.newInternal(Util.java:1340)

at java.lang.Thread.run(Thread.java:619)

Caused by: java.sql.SQLException: Network error IOException: Connection refused: connect

解决方法:

由异常信息可看出出现此异常是由于连接数据库出错,我仔细检查了是由于将mysql数据库连接成了SqlServer数据库。

%***************************************************************************

异常:12

154157 [http-8080-1] ERROR com.tonbeller.wcf.controller.RequestFilter  - exeption

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: OlapModel/Query ${paramquery01} not found

at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)

解决方法:

错误原因是以下代码中:

<jp:setParam query="${paramquery01}" httpParam= "param" mdxParam= "ProductMember">

<jp:mondrianQuery id="query01"

jdbcDriver="com.mysql.jdbc.Driver"

jdbcUrl="jdbc:mysql://localhost:3306/tezz?user=root&password=sys"

catalogUri="/WEB-INF/queries/tezz.xml" >

select

{[Measures].[Number],[Measures].[Average UnitPrice],[Measures].[Total Sale]} ON columns,

{Parameter("ProductMember", [Product Category],[Product Category].[All Products])} ON rows

from [Sales]

</jp:mondrianQuery>

</jp:setParam>

jpivot的setParam标签的query属性值就是mondrianQuery标签的id属性值,应一致。将query01改为paramquery01即可。

%***************************************************************************

异常:13

信息: SessionListener: contextInitialized()

2010-7-23 8:44:12 org.apache.catalina.session.StandardManager doLoad

严重: IOException while loading persisted sessions: java.io.EOFException

java.io.EOFException

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)

at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)

at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)

at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)

at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)

解决办法:重建项目换个项目名称。

%***************************************************************************

异常:14

 

87875 [http-8088-1] ERROR com.tonbeller.wcf.controller.RequestFilter  - exeption

页面异常

org.apache.jasper.JasperException: An exception occurred processing JSP page /testpage.jsp at line 44

41: <form action="testpage.jsp" method="post">

42:

43: <%-- include query and title, so this jsp may be used with different queries --%>

44: <wcf:include id="include01" httpParam="query" prefix="/WEB-INF/queries/" suffix=".jsp"/>

45: <c:if test="${query01 == null}">

46:   <jsp:forward page="/index.jsp"/>

47: </c:if>

Caused by: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature &apos;(<Set>, <Member>)&apos;

at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)

at com.tonbeller.jpivot.olap.model.OlapModelDecorator.initialize(OlapModelDecorator.java:132)

解决方法:

我的mdx查询语句如下:

select {[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns,

{([Product Category].[All Products].children,[Customer Sex].[All Sex])} ON rows

from [Sales]

改为:select {[Measures].[Total Sale],[Measures].[Product Percentage]} ON columns,

{([Product Category].[All Products],[Customer Sex].[All Sex])} ON rows

from [Sales]

即可。

%***************************************************************************

异常:15

1317609 [http-8088-1] ERROR com.tonbeller.wcf.controller.RequestFilter  - cause

javax.servlet.ServletException: javax.servlet.jsp.JspException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature &apos;{<Level>}&apos;

at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)

Caused by: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature &apos;{<Level>}&apos;

at com.tonbeller.jpivot.mondrian.MondrianModel.initialize(MondrianModel.java:550)

at com.tonbeller.jpivot.olap.model.OlapModelDecorator.initialize(OlapModelDecorator.java:132)

解决方案:

我的mdx查询语句:

select {[Sale Time].[quarterName] } ON columns,

{[Product Category].[All Products].CHILDREN} ON rows

from [Sales]

由于[Sale Time].[quarterName]只是到了级别(level),而集合set中只能是member或者tuple,

故只需将{[Sale Time].[quarterName]}改为{[Sale Time].[quarterName].AllMembers}

效果图为:

{[Sale Time].[quarterName].AllMembers}与{[quarterName].AllMembers}得出的效果一样。

若改为:{[Sale Time] },则效果图为:

若改为:{[Sale Time].[quarterName].children},则报异常:

Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: com.tonbeller.jpivot.olap.model.OlapException: Mondrian Error:No function matches signature &apos;<Level>.children&apos;

at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)

同样,{[Sale Time].[quarterName].children}与{[quarterName].children}效果是一样的。

故我得出的结论是:

1. level下面不能调用children,只能用allmembers来获得子集所有成员。Children可以用在层次hierarchy下面如:[Product Category].[All Products].children(注意的是这里的”All Products”是层次的allMemberName属性,而非name属性,用name属性的写法是[Sale Time.OnlyQ].children,此时也可以用allmembers);也可以直接在维度下面,如[Sale Time].children,显示效果图为:

同时,allmembers也可以用在直接维度下面如[Sale Time]. allmembers,显示效果图为将成员全部列出,不是下钻(drill-down)形式,操作只能是上卷(drill-up):

结论2:两个嵌套的level的(name属性)不能同时用,即[yearName].[quarterName]会报找不到的错误,但涉及到具体的members就可以用,如[2007].[Q1].

涉及到具体member值如[2007],或[2007].[Q1]等的member,后面就不能使用member,allmembers,currentmember,都会报上面的同样的错,但可以使用如下术语:

Children,firstchild,parent,prevmember, nextmember。

Mondrian异常相关推荐

  1. Mondrian 3.14.0 服务配置说明(限功能使用验证)

    Mondrian3.14.0 服务配置 准备 #1 下载mondrian 3.14 war包 该压缩包含mondrian 3.14及tomcat8.5.9,详细见如下分享链接: 链接:https:// ...

  2. 配置Mondrian源码

    一,配置 前一阶段对mondrian和jpivot的测试主要建立在jar与war包的基础上面,若要对mondrian源码进行跟踪调试,需要导入mondrian源码包到ide(eclipse)环境中,在 ...

  3. Mondrian Schema设计教程

    文章目录 1 什么是模式? 2 模式文件(Schema files) 2.1 注释 3 逻辑模型(Logical model) 3.1 多维数据集(cube) 3.2 度量(Measures) 3.3 ...

  4. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  5. JS Uncaught SyntaxError:Unexpected identifier异常报错原因及其解决方法

    最近在写ajax的时候,调用js方法,遇到了Uncaught SyntaxError:Unexpected identifier异常报错,开始搞不清原因,很苦恼. 以为是js方法参数个数和长度的问题, ...

  6. JVM 常见异常及内存诊断

    栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存. 栈帧过多导致栈内存溢出 下述示例代码,由于递归 ...

  7. java通过异常处理错误,java基础之通过错误处理异常

    我们在编程过程中,通常需要时刻关注可能遇到的问题,此时可以把问题分为两类:普通问题与异常问题.普通问题:我们可以通过从当前环境中获取到的信息来解决这个问题:而异常问题:在当前环境中获取到的信息并不能解 ...

  8. Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常

    我的servlet代码是 try{ //something response.setStatus(201); out.print("Data successfully saved" ...

  9. 消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

    消除安卓SDK更新时的"https://dl-ssl.google.com refused"异常的方法 消除安卓SDK更新时的"https://dl-ssl.google ...

最新文章

  1. 动态DNS——本质上是IP变化,将任意变换的IP地址绑定给一个固定的二级域名。不管这个线路的IP地址怎样变化,因特网用户还是可以使用这个固定的域名 这样看的话,p2p可以用哇...
  2. 使用com.sun.imageio.plugins.png.PNGMetadata读取图片的元数据 1
  3. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(Anaconda软件介绍)
  4. 每天一个小异常——Excel的导出报类型转换异常
  5. mysql安装过程遇到的问题_个人在mysql安装过程中遇见的问题
  6. 显示墙 显示服务器地址,云墙怎么看服务器地址
  7. 1 恢复MySQL误删数据
  8. STL 算法接口及用法说明
  9. 如何在本地运行jar文件
  10. 千万级数据清洗ETL设计方案
  11. python处理页眉_【python-docx 05】操作页眉和页脚
  12. 生成二维码如何制作二维码
  13. UART嵌入式通信协议(以AVR单片机为例)
  14. 蓝桥网算法提高 学霸的迷宫
  15. C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
  16. 用html制作chm,用HTML Help Workshop制作chm.doc
  17. 特征值和特征向量的理解
  18. Docker更改镜像源
  19. 计算机三级网络app,‎App Store 上的“计算机三级网络技术题库”
  20. 氨基/请加/羧基/生物素功能化水溶性CdSeQds,CdTeQds,CdSe/ZnSQds,ZnOQds,CuInS/ZnSQds量子点

热门文章

  1. 多益网络 专业面试 2020 12 22
  2. 博客-Blog开发,追踪现在的潮流
  3. 硬科技的时代之路,镁客网与你一起见证!
  4. 折半查找画ASL判定树
  5. 小鼠瘦素ELISA试剂盒实验原理流程亮点
  6. JEECMS开发问题汇总
  7. 连接Access2007数据库
  8. Matplotlib 找不到系统安装的字体
  9. 小米科技联合创始人兼副总裁黎万强:玩出来的小米品牌
  10. 派森诺群体遗传进化专题之进化树