﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-专注应用，关注发展，开拓创新-文章分类-数库仓库－mondrian</title><link>http://www.blogjava.net/esdsoftware/category/10780.html</link><description>&lt;-------------------------------------------------------------------&amp; 珍惜生命 . 善用时间 . 把握未来 . 创造价值。</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:20:33 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:20:33 GMT</pubDate><ttl>60</ttl><item><title>使用MDX进行环比查询</title><link>http://www.blogjava.net/esdsoftware/articles/44647.html</link><dc:creator>吴名居</dc:creator><author>吴名居</author><pubDate>Fri, 05 May 2006 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/esdsoftware/articles/44647.html</guid><wfw:comment>http://www.blogjava.net/esdsoftware/comments/44647.html</wfw:comment><comments>http://www.blogjava.net/esdsoftware/articles/44647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esdsoftware/comments/commentRss/44647.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esdsoftware/services/trackbacks/44647.html</trackback:ping><description><![CDATA[在报表查询中经常要进行本期和上期比较，比如3月销售额和2月销售额的比较！一般有绝对值和相对值之分，<br />如 本期增量=本期值-上期值；绝对值<br />   本期增幅=（本期值-上期值）/本期值；相对值<br />1：MDX本查询<br />with member [time2].[本期增量] as '[time2].[所有 time2].[1997].[Q1].[3]-[time2].[所有 time2].[1997].[Q1].[2]'<br />        member [time2].[本期增幅] as '[time2].[本期增量]/[time2].[所有 time2].[1997].[Q1].[3]'<br />select <br />    {[time2].[所有 time2].[1997].[Q1].[3],[time2].[所有 time2].[1997].[Q1].[2],<br />    [time2].[本期增量],[time2].[本期增幅]} on columns, <br />   {[Measures].[Store Sales]}on rows<br />from Sales<br />3月和2月相比销售量增量和增幅。<br />备注：1)如果无上期成员，则值为0;<br />2)MDX提供PrevMember函数表示上一个成员，[所有 time2].[1997].[Q1].[2]可以用[所有 time2].[1997].[Q1].[3].<br />PrevMember代替。<br />2：求解顺序<br />如果生成多个计算成员，某个计算成员使用其它计算成员，则使用SOLVE_ORDER 指明生成顺序<br />如：<br />with member [time2].[本期增量] as '[time2].[所有 time2].[1997].[Q1].[3]-[time2].[所有 time2].[1997].[Q1].[2]'<br />,SOLVE_ORDER = 1,<br />        member [time2].[本期增幅] as '[time2].[本期增量]/[time2].[所有 time2].[1997].[Q1].[3]'<br />SOLVE_ORDER = 2<br /><img src ="http://www.blogjava.net/esdsoftware/aggbug/44647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esdsoftware/" target="_blank">吴名居</a> 2006-05-05 16:07 <a href="http://www.blogjava.net/esdsoftware/articles/44647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>示例：数据库及文档结构</title><link>http://www.blogjava.net/esdsoftware/articles/44629.html</link><dc:creator>吴名居</dc:creator><author>吴名居</author><pubDate>Fri, 05 May 2006 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/esdsoftware/articles/44629.html</guid><wfw:comment>http://www.blogjava.net/esdsoftware/comments/44629.html</wfw:comment><comments>http://www.blogjava.net/esdsoftware/articles/44629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esdsoftware/comments/commentRss/44629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esdsoftware/services/trackbacks/44629.html</trackback:ping><description><![CDATA[2．2数据库结构<br />在这个tiny的系统中，数据库有3个表tb_employee（职员表）,tb_time（时间表）,tb_salary（薪酬表）。表结构如下：<br />drop table tb_employee;<br />create table tb_employee<br />(<br />employee_id number, --职员id <br />employee_name varchar2(10) --职员姓名<br />);<br />drop table tb_time;<br />create table tb_time<br />(<br />time_id number, --时间id<br />the_year char(4), --年<br />the_month char(2) --月<br />);<br /><br />drop table tb_salary;<br />create table tb_salary<br />(<br />employee_id number, --职员id <br />time_id number, --时间id<br />salary number(19,4) --薪酬<br />);<br />当然，为了使系统能够运行，还需要读者向数据库表中插入一些数据。<br />2．3根据数据库表的结构，书写schema文件<br />&lt;?xml version="1.0"?&gt;<br />&lt;Schema name="Mondrian"&gt;<br />&lt;Cube name="CubeTest"&gt;<br />&lt;Table name="TB_SALARY" /&gt;<br />&lt;Dimension name="Employee" foreignKey="EMPLOYEE_ID" &gt;<br />&lt;Hierarchy hasAll="true" primaryKey="EMPLOYEE_ID"&gt; <br />&lt;Table name="TB_EMPLOYEE" /&gt;<br />&lt;Level name="employeeId" column="EMPLOYEE_ID" uniqueMembers="true" &gt;<br />&lt;Property name="employeeName" column="EMPLOYEE_NAME"/&gt;<br />&lt;/Level&gt;<br />&lt;/Hierarchy&gt;<br />&lt;/Dimension&gt;<br />&lt;Dimension name="Time" foreignKey="TIME_ID" &gt;<br />&lt;Hierarchy hasAll="false" primaryKey="TIME_ID" &gt;<br />&lt;Table name="TB_TIME" /&gt;<br />&lt;Level name="year" column="THE_YEAR" uniqueMembers="false" /&gt;<br />&lt;Level name="month" column="THE_MONTH" uniqueMembers="false" /&gt;<br />&lt;/Hierarchy&gt;<br />&lt;/Dimension&gt; <br />&lt;Measure name="Salary" column="SALARY" aggregator="sum" /&gt;<br />&lt;/Cube&gt;<br />&lt;/Schema&gt;<br /><img src ="http://www.blogjava.net/esdsoftware/aggbug/44629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esdsoftware/" target="_blank">吴名居</a> 2006-05-05 14:25 <a href="http://www.blogjava.net/esdsoftware/articles/44629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简介</title><link>http://www.blogjava.net/esdsoftware/articles/44628.html</link><dc:creator>吴名居</dc:creator><author>吴名居</author><pubDate>Fri, 05 May 2006 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/esdsoftware/articles/44628.html</guid><wfw:comment>http://www.blogjava.net/esdsoftware/comments/44628.html</wfw:comment><comments>http://www.blogjava.net/esdsoftware/articles/44628.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/esdsoftware/comments/commentRss/44628.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esdsoftware/services/trackbacks/44628.html</trackback:ping><description><![CDATA[mondrian是一个olap工具，jpviot是一个显示它处理结果的taglib,使用这2个工具可以做复<br />杂的统计汇总并显示<br />OLAP:Mondrian&amp;JPviot<br /><br />olap: online analytical processing(联机分析处理),实时的分析大量数据,其操作通常是<br />只读的.online意味着即使是大量的数据,系统对查询的响应也要足够快.<br /><br />olap使用一种技术叫做multimensional analysis(多维分析),关系数据库将数据存成行和列的形式,多维数据表包含轴和单元.<br /><br />mondrian包含4层:表示层,计算层,聚集层,存储层.<br /><br />表示层:指最终呈现在用户显示器上的,以及与用户之间的交互,有许多方法来展现多维数据,<br />包括数据透视表,饼,柱,线状图.<br /><br />计算层:分析,验证,执行MDX查询.<br /><br />聚集层:一个聚集指内存中一组计算值(cell),这些值通过维列来限制.计算层发送单元请求,<br />如果请求不在缓存中,或者不能通过旋转聚集导出的话,聚集层向存储层发送请求.<br /><br />聚合层是一个数据缓冲层，从数据库来的单元数据，聚合后提供给计算层。聚合层的主要作<br />用是提高系统的性能。<br /><br />存储层:提供聚集单元数据和维表的成员,这些层可以不在同一机子上,但是计算和聚集层必�<br />朐谕惶ɑ由�.<br /><br />三种需要存储的数据:1:事实数据2:聚集3:维<br /><br />配置文件中的特定含义:<br />1:cube(立方体):是维和量的集合<br /><br />2:measure(量):一个具体的测量量<br /><br />3:dimension(维):一个属性或者一系列属性,通过维可以将量分类<br /><br />下面是我关于jpviot的修改:jpviot是显示mondrian的一个taglib<br /><br />问题1:让行和列的标题显示为中文,此问题非常简单,只需要在你的schema中设置一下编码即<br />可,例如在FoodMart中设置如下<br /><br />&lt;?xml version="1.0" encoding="gb2312"?&gt;<br /><br />然后可以这样描述Measure:<br /><br />&lt;Measure name="库存消耗" column="store_cost" aggregator="sum"<br />formatString="#,###.00"/&gt;<br /><br />所有带name属性的都可以替换成中文,jpviot会自动显示这些中文.<br /><br />问题2:关于去掉Measure标题的问题:<br /><br />默认生成的报表中会有这么一行<br />&lt;tr&gt;<br />&lt;th rowspan="1" colspan="2" class="corner-heading"<br />nowrap="nowrap"&gt;&amp;nbsp;&lt;/th&gt;&lt;th rowspan="1" colspan="3"<br />class="heading-heading" nowrap="nowrap"&gt;&lt;img height="9" width="9"<br />border="0" src="/jpivot/jpivot/table/drill-position-other.gif"&gt;Measures&lt;/th&gt;<br />&lt;/tr&gt;<br /><br />这一行有个默认的标题是Measure,如果你不想删除这一行,而仅仅想修改这个标题的话,可以<br />修改<br />WEB-INFclassescomtonbellerjpivotmondrianresources.properties.但是注意这个文件中�<br />谌菪闯捎⑽拿晃侍�,如写成中文的话应该写成unicode,例如023这样的形式.<br /><br />如果你要去掉这一行的话,修改配置文件和xsl恐怕做不到,我分析了其代码,最终在代码层次<br />上做了修改:<br />修改的代码为com.tonbeller.jpivot.table.ColumnAxisBuilderImpl:<br /><br />将其构造函数中的setHierarchyHeader的参数修改为setHierarchyHeader(NO_HEADER);这个<br />函数支持3个参数,我们修改后就不会显示那个标题行了.<br /><br />问题3:生成图表后自动生成chart表的问题:<br /><br />我测试生成图表中的中文问题都解决了,但是每次生成chart图时会报UTF编码错误,从错误判<br />断应该是某个文件的编码错误,起初根据错误判断是<br />filter的问题,可是filter那点代码中根本不涉及编码的问题.我将很多配置文件的编码都改<br />了也不行.因为那个英文例子没问题,我查看了<br />JFreechart的一个servlet(org.jfree.chart.servlet.DisplayChart),因为jpviot就是调用<br />这个servlet实现绘图的,分析这个servlet我知道它会在一个临时目录生成png文件,然后交�<br />鴖ervlet写到浏览器的响应中去,我找到那个临时目录(tomcattemp),发现里面已经生成了正<br />确的中文图形.从而判断图形生成正确,但是写到浏览器中时出了问题.最后我查看能生成英�<br />耐急淼哪歉隼�,发觉不仅仅在html中生成图形,而且生成map.而这个map的生成全是在程序<br />中做的,程序生成一个xml文件,通过chart.xsl解析生成map的最终html代码.但是在程序中生<br />成时并没有加入编码设置,因此问题出在生成map这儿.<br /><br />最终修改代码如下:<br /><br />com.tonbeller.jpivot.chart.ChartComponent:<br /><br />在render函数中修改如下:<br /><br />String desc="&lt;?xml version="1.0" encoding="gb2312"?&gt;";<br />String xchart =desc+"n"+ "&lt;xchart&gt;" + writeImageMap(filename, info,<br />false) + "&lt;/xchart&gt;";<br />这样就为xchart设置了编码.<br /><br />问题4:修改jfreechart中的默认字体:<br /><br />com.tonbeller.jpivot.chart.ChartComponent中定义了几种字体,但是这几种字体都是英文<br />字体,我将其修改为宋体:<br />把所有的字体定义都改为"SimSun"<br />注意到这儿并没有玩,如果你仅仅修改程序,仍旧会出现问题,报错说没有适合"SimSun"的ite<br />m<br />同时要修改一个配置文件:WEB-INFjpivotchartchartpropertiesform.xml<br />在这个配置文件中将SimSun加入其中,形式如下:<br /><br />&lt;listBox1 type="string" modelReference="fontName" label="Title font"&gt;<br />&lt;listItem value="SansSerif" label="SansSerif"/&gt;<br />&lt;listItem value="Serif" label="Serif"/&gt;<br />&lt;listItem value="SimSun" label="SimSun"/&gt;<br />&lt;listItem value="Monospaced" label="Monospaced"/&gt;<br />&lt;/listBox1&gt;<br /><img src ="http://www.blogjava.net/esdsoftware/aggbug/44628.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esdsoftware/" target="_blank">吴名居</a> 2006-05-05 14:19 <a href="http://www.blogjava.net/esdsoftware/articles/44628.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>