由于要做多维报表的展现,需要使用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刚学不久,对于上面总结的不对的地方希望可以指出来!
By the way,
供大家交流Pentaho的圈子,里面可以共享有关pentahoBI平台学习的资料,期待您的加入!
http://pentahofrends.group.iteye.com/
分享到:
相关推荐
mondrian ROLAP MDX 经典资料打包。 MDX的基本语法及概念.ppt ROLAP的概念.ppt 如何将Mondrian用于web项目.ppt MDX的基本语法及概念.ppt doc_cn jpivot
《Mondrian异常处理与MDX查询学习笔记》 在数据仓库和商务智能领域,OLAP(在线分析处理)引擎Mondrian是广泛使用的工具,它支持多维数据集的快速查询和分析。MDX(多维表达式)是与OLAP数据库交互的主要查询语言,...
在数据分析领域,多维数据集(Multidimensional Datasets)的查询语言MDX(MultiDimensional eXpressions)是处理OLAP(Online Analytical Processing)操作的重要工具。MDX提供了一种强大的方式来探索和分析复杂的...
通过这个"Mondrian实例",你可以学习到如何在Java应用中集成Mondrian,以及如何利用MDX查询语言对数据立方体进行操作。这将有助于提升你在数据驱动决策和商业智能方面的技能。记住,实践是掌握知识的关键,尝试运行...
在这个"Mondrian+Oracle 实例"中,我们将深入探讨如何配置和使用Mondrian与Oracle数据库的集成,以及如何解决可能出现的问题。 1. **Mondrian概述** Mondrian是一个基于Java的OLAP服务器,它解析多维数据模型...
Query类是mondrian处理MDX查询的核心,它负责解析MDX语句,生成查询计划,并与执行器交互以获取结果。 2.5. 包mondrian.rolap 这个包主要处理与关系数据库的交互,实现ROLAP功能。 2.5.1. 成员读取包MemberReader ...
3. MDX查询:在Web应用中,用户可以通过MDX查询语言向Mondrian发送请求,获取特定的数据分析结果。开发人员需要编写MDX查询语句,封装在Web服务接口中,供前端调用。 三、报表开发 1. 报表设计:报表是展现Mondrian...
Mondrian通过解析MDX查询,将它们转化为SQL语句,进而从关系数据库中获取数据。这种设计使得Mondrian能够灵活地与各种RDBMS(关系型数据库管理系统)集成。 二、Mondrian的工作原理 Mondrian的核心组件包括元数据...
mondrian是一个开源的在线分析处理(OLAP)服务器,它主要用Java编写,适用于构建数据仓库和商业智能应用。在本资源"mondrian-api.zip"中,包含的是mondrian 4.0版本的API,这对于开发者来说是一个宝贵的参考资料,...
通过学习这个教程,你将能够熟练地运用mondrian进行数据分析,创建自定义的OLAP Cube,理解和使用MDX查询语言,以及将mondrian集成到Web应用中,从而提升数据驱动决策的能力。不断实践和深入理解这些知识,你将成为...
3. 使用API或JPivot等表现层组件来构建用户界面,处理MDX查询并展示结果。 4. 配置连接到RDBMS的JDBC连接。 5. 根据需要优化Mondrian的配置,如集合缓存策略。 通过以上内容,我们可以看到Mondrian作为OLAP解决方案...
### Mondrian介绍及配置知识点详解 #### 一、Mondrian概述 **Mondrian** 是一款用 Java 编写的开源 OLAP (Online Analytical Processing) 引擎,支持 MDX (Multidimensional Expressions) 查询语言。它可以将来自...
Mondrian的实现遵循了多项行业标准,包括MDX(Multidimensional Expressions,多维表达式)——一种用于OLAP系统的查询语言,类似于SQL在关系数据库中的作用;XMLA(XML for Analysis)——一种基于SOAP的协议,用于...
mondrian是一种开源的在线分析处理(OLAP)服务器,它主要负责处理多维数据,并提供快速的数据查询和分析能力。这个“基于mondrian开发的小例子”可能是为了演示如何使用mondrian进行数据分析和报表生成。 首先,...
7. **JavaScript接口**:mondrian的JavaScript库允许在浏览器环境中与 mondrian 服务器通信,执行MDX查询并接收结果。这对于构建Web应用程序来说非常有用,特别是那些需要实时数据分析的场景。 通过研究mondrian...
Mondrian是一个OLAP(在线分析处理)服务器,它支持多维数据分析和MDX查询。文档还涉及到JasperAnalysis,它可能是用来做报表分析的一个工具或库。 2. Mondrian架构与组成部分 Mondrian架构由多个层次组成,包括API...
MDX(Multidimensional Expressions)是一种用于查询多维数据集的语言,常见于OLAP(在线分析处理)系统中。本文将深入探讨MDX在JSP(JavaServer Pages)中的应用,以及如何配置不同的数据源来支持MDX查询。我们将...
而且出版社在印刷书籍时遵循了环保政策,使用了至少15%的回收纸张,且不使用氯元素处理纸张,这表明Manning Publications Co.在企业责任方面的承担。 综上所述,《Mondrian in Action》是一本针对有志于精通...
请确保按照文档中的指导逐步操作,遇到问题时查阅相关资料或社区讨论,以解决可能出现的错误和异常。 总的来说, mondrian源码运行配置是一个涉及Java开发环境搭建、数据库连接、XML配置以及日志调试等多个环节的...
例如,在生成复杂的透视表时,使用MDX可以避免在SQL中频繁使用`CASE`语句和`GROUP BY`子句。 #### 七、总结 MDX作为一种专门针对多维数据查询的语言,在OLAP系统中扮演着至关重要的角色。通过Mondrian这样的OLAP...