Microstrategy 8.1.2 Web Universal 开发问题整理

做Microstrategy  Web Universal的二次开发已有半年多的时间了,Web Universal有着非常强大的扩展性和可管理性,Web代码结构,不管与任何系统进行集成都非常方便。

但是随着浏览器种类的增多和浏览器版本的差异,造成Web Universal中很多功能无法正常使用的问题,严重的影响了用户体验。虽然多数报表系统针对的用户群体不是很多,但是由于用户体验造成的影响是非常恶劣的,所以修复这些问题是关键。8.1.2版本的Web Universal由于时间较早,支持的浏览器比较有限,虽然升级能够解决很多问题,但是带来的影响的也是相当巨大的,所以在此版本上的开发也是重中之重。

需要说明的是,二次开发最好能够养成好的习惯,更改的位置加入自己更改的特殊标识,将原内容进行备份以便整理。并且尽量在不变原业务逻辑的基础上进行修改,因为你修改的大多数只是特殊情况和没有涉及到的情况。

1. ie8下文档中的显示相关问题,例如下图中显示的button按钮,在ie8下,最后一个按钮会覆盖前面所有按钮,致使除最后一个按钮外的所有按钮不可用。

正常显示

错误显示

debug相关js后,浏览器的反应情况

在ie8下,在获得table中的col标签的width长度,前几个按钮所在的col都为-1,最后一个为100 + 1*前几个按钮的个数。页面会有JS的报错信息。

在safari下,同样在获得table中的col标签的width长度,前几个按钮所在的col都为-1,最后一个为100 + 1*前几个按钮的个数。但是页面无任何JS的报错信息。

解决方法:在javascript/mstrRWControlImpl.js文件中的1365行,对相关代码进行修改。由于safari浏览器下不会提示js报错,因此需要对源代码进行完全调整,如下所示,如果获取的col区域宽度为负数,将所有的col区域宽度按照个数设置平均。

if(colWPercent > 0 && colWPercent < 100) {
    cols[i].style.width = colWPercent + ‘%’;
} else {
    cols[i].style.width = 100/colCount + ‘%’;
}

2. safari浏览器下无法提交报表筛选的问题,必选筛选哪怕选中后,还是提示必选的筛选未选择的问题提示。

解决问题并不是单独的去解决当前问题,而是要去总结问题的根本,将这些问题能够分成可以通用的类别进行整理再利用,像这个问题,解决后就总结出了3个safari浏览器对于JS的编写应该着重注意的地方。

通过debug后,发现safari下在提交筛选信息的时候,得不到相关的筛选信息,等于说未提交任何筛选项给服务器端。

问题解决方案:

在javascript/DHTML.js下167行有对各种浏览器类型的定义,加入对safari浏览器的定义,需要支持的浏览器类型也可以一并加入,例如ie8。

var isSafari = (navigator.userAgent.toLowerCase().indexOf(“safari”) != -1);

在javascript/PromptFunctions.js下第7行对这些变量进行限制,如果检测到safari浏览器,不要对这4个变量进行全局声明,

if(!isSafari) {
    var promptJSAnswerName = “”;
    var promptJSListBoxName = “”;
    var promptJSDimensionName = “”;
    var promptJSMaxPin = -1;
}

原因可以debug此js的相关方法function BuildUserSelections(),在提交用户筛选信息时,检测到promptJSMaxPin变量的值为0,正常情况下promptJSMaxPin应该为此报表筛选的个数。

通过debug得到的信息和以上的相关信息得到safari中JS的相关注意事项为:

a. safari中不支持的全局变量值的改变

b. safari对一些js异常不会产生报错信息,兼容这些设置。例如,区域宽度的数值范围

c. 此事项是平时做东西测试的来的,不要将js的function方法定义至body区域内,在safari中不被允许

3. 文档页面会报关于mstrRWControlImpl的相关错误

在safari中,文档页面打开后,如果文档中含有表格类的报表会出现如下图的问题

见javascript/grid.js文件的1741行,由于在safari浏览器下microstrategy.styleObj为nul引起的,将代码作如下修改,

try{
    this.gridPosition = parseInt(microstrategy.styleObj.getAttValue(rwdObj, microstrategy.HTMLATTR_GRID_POS));
    this.gridArea = parseInt(microstrategy.styleObj.getAttValue(rwdObj, microstrategy.HTMLATTR_GRID_AREA_PCT)) / 100;
} catch(e) {
    this.gridPosition = 1;
    this.gridArea = 0.5;
}

4. 筛选的时间控件显示位置问题

在点击筛选项中的时间控件时,控件出现的位置会有偏差,正常的应该是仅靠时间控件点击按钮,下图为点击第二个筛选时出现的错误显示

问题解决方案:

在javascript/DHTML.js文件中的1409行,做以下修改

if ((bIsIE4) || (!bIsIE4 && bIsW3C)) {

       <!– 判断点击的对象为点击时间控件按钮,是的话改写原方法,否的话维持原方法 –>

       if(obj && obj.name && obj.name.toLowerCase().indexOf(‘calendarbutton’) != -1) {

              <!– 由于二次开发中存在着部分报表采用筛选和结果在同一页面存在的业务,因此分2种情况分别处理 –>

              if(microstrategy.cancelPromptResize == true) {

                     <!– 合并方式显示处理 –>
                     var flagName = ‘html’;

                     <!– 浏览器对于变量的定义 –>
                     if(bIsFirefox) {
                            flagName = ‘body’;
                     }
                     for (var i=0; (obj); i++) {
                            lTop += obj.offsetTop;
                            if (obj.offsetParent && obj.offsetParent.scrollTop && obj.offsetParent.tagName.toLowerCase() != flagName) {
                                   lTop -= obj.offsetParent.scrollTop;
                            }
                            obj = obj.offsetParent;
                     }
              } else {

                     <!– 筛选页面提交方式获得按钮位置 –>
                     lTop = obj.getBoundingClientRect().top;
              }
       } else {
              for (var i=0; (obj); i++) {
                     lTop += obj.offsetTop;

                     if (obj.offsetParent && obj.offsetParent.scrollTop && obj.offsetParent.tagName.toLowerCase() != ‘html’) {
                            lTop -= obj.offsetParent.scrollTop;
                     }
                     obj = obj.offsetParent;
              }
       }
       return parseInt(lTop);
} else {
       return getObjTop(vObject);
}

目前在使用过程中发现的相关问题就是这些,二次开发不是一个短期内能够做到完美的事情,发现一个解决一个,解决一个整理一个,努力让我们使用的软件达到最好的状况。以上是开发修改的一些相关内容,如有疑问欢迎一起探讨,这个领域需要所有开发者的一起努力。

5 Responses

  1. ebay 说道:

    Ebay has same issues for MicroStrategy. But our team had updated MicroStrategy 9.0.1m version, Thanks your solution for us.

  2. 情侣空间 说道:

    仔细的看了下,不错,俺学到了不少。

  3. 优惠券 说道:

    仔细看看,确实不错

  4. 牙齿黄 说道:

    不错吗?那我再仔细看看!

  5. hideto 说道:

    哈哈,mstr web的二次开发是浮云~再怎么customization都丑的不行,而且customization capability太有限了
    俺们已经到了第二阶段了-利用SDK直接开发web ui

    正在朝第三阶段进军 - 自己完全build

Leave a Reply

*