随笔-15  评论-79  文章-0  trackbacks-0
  2010年8月5日
最近经常做一些数据导入的工作!做数据挖掘项目大家都懂的...
导入数据最痛苦的就是等待他导...不过如果大家没注意一些需要注意的东西,可能大家会这样反复等好多次!!
一、
首先,我也是多次吃亏的一件事情,就是老是忘记加入导入日志。因为在导入数据的时候可能会抛出很多异常,这些异常如果不记录下如果缺失了重要的数据可能要从新导入或找到原因然后重导。太可惜了。加入导入日志一切有据可查,非常重要。

它的做法可以在imp时直接加参数:
log=/oracle/log/imp.log (linux)
log=E:\log\imp.log      (windows)
指定日志的路径和文件名
例如:
imp trade/zhangy@orcl file=/test/trade.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle/log/imp.log
这样就有日志了...

二、导入单个表
可能客户给我们一个整库文件,但是我们可能只需要其中的一些表就OK了。oracle已经带有导入单独表的语法。
IMP trade/trade file=D:\2011-02-18_trade.dmp IGNORE=Y TABLES=(TOS_ContractInterval,TOS_CONTRACTMASTER) FULL=N



当然还有许多语法,我们可以通过imp help=yes来查看..


posted @ 2011-06-02 20:04 张元Won 阅读(590) | 评论 (0)编辑 收藏
因为新配置的机器,装的Oracle10g一直都没使用过。因为参与到项目,昨天突然用Oracle发现用Plsql不上Oracle了。
虾米原因?...搞的我蛋疼了一上午...
于是一直找帖纠结这个问题,终于还是解决了,在博客中留个记录以便以后忘记了翻翻。

导致这个错误的原因有很多
可能是SID配置不对,但绝大多数是因为Oracle程序本身问题。就是OracleOraDb10g_home1TNSListener这个服务对应的D:\oracle\product\10.2.0\db_1\BIN\TNSLSNR执行程序没有执行或者执行中断造成的。那么我们只要设置一个全局SID服务变量,以后就可以都以这个变量为准来查找到监听了。

解决方法如下:
打开:%Oracle_Hoem%/network/admin/listener.ora文件 在 
SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
  (SID_NAME = PLSExtProc) 
  (ORACLE_HOME = D:\Oracle\Oracle10g) 
  (PROGRAM = extproc) 
后面添加: 
(SID_DESC = 
  (GLOBAL_DBNAME = ORACLE) 
  (ORACLE_HOME = D:\Oracle\Oracle10g) 
  (SID_NAME = ORACLE) 
  ) 
最后变成: 
SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
  (SID_NAME = PLSExtProc) 
  (ORACLE_HOME = D:\Oracle\Oracle10g) 
  (PROGRAM = extproc) 
) (SID_DESC = 
  (GLOBAL_DBNAME = ORACLE) 
  (ORACLE_HOME = D:\Oracle\Oracle10g) 
  (SID_NAME = ORACLE) 
  ) 
posted @ 2011-05-27 09:17 张元Won 阅读(991) | 评论 (0)编辑 收藏
  • 第一步: 取消自动validation   
  • validation有一堆,什么xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下!   
  • 取消方法:   
  • windows–>perferences–>myeclipse–>validation   
  • 除开Manual下面的复选框全部选中之外,其他全部不选   
  • 手工验证方法:   
  • 在要验证的文件上,单击鼠标右键–>myeclipse–>run validation   
  • 第二步:取消Eclipse拼写检查   
  • 1、拼写检查会给我们带来不少的麻烦,我们的方法命名都会是单词的缩写,他也会提示有错,所以最好去掉,没有多大的用处   
  • windows–>perferences–>general->editors->Text Editors->spelling
  • 第三步:取消myeclipse的启动项   
  • myeclipse会有很多的启动项,而其中很多我们都用不着,或者只用一两个,取消前面不用的就可以   
  • windows–>perferences–>general–>startup and shutdown   启动项功能如下,可以根据自己的需要选择
  • Automatic Updates Scheduler //自动升级调度      
  • MyEclipse QuickSetup //快速启动      
  • MyEclipse Derby //derby是一个开源数据库的名字   
  • MyEclipse EASIE Geronimo 1 //同色都是应用服务器的名字      
  • MyEclipse EASIE Geronimo 2       
  • MyEclipse EASIE JBOSS 2       
  • MyEclipse EASIE JBOSS 3       
  • MyEclipse EASIE JBOSS 4       
  • MyEclipse EASIE JBOSS 5       
  • MyEclipse EASIE JBOSS       
  • MyEclipse EASIE Jetty 4       
  • MyEclipse EASIE Jetty 5       
  • MyEclipse EASIE Jetty 6       
  • MyEclipse EASIE Jetty       
  • MyEclipse EASIE JOnAS 3       
  • MyEclipse EASIE JOnAS 4       
  • MyEclipse EASIE JOnAS       
  • MyEclipse EASIE JRun 4       
  • MyEclipse EASIE JRun       
  • MyEclipse EASIE Oracle 10 AS       
  • MyEclipse EASIE Oracle 9 AS       
  • MyEclipse EASIE Oracle AS       
  • MyEclipse EASIE Orion 1       
  • MyEclipse EASIE Orion 2       
  • MyEclipse EASIE Resin 2       
  • MyEclipse EASIE Resin 3       
  • MyEclipse EASIE Resin       
  • MyEclipse EASIE Sun 8.x       
  • MyEclipse EASIE Sun 8       
  • MyEclipse EASIE Sun 9       
  • MyEclipse EASIE Glassfish 2       
  • MyEclipse EASIE Glassfish 1       
  • MyEclipse EASIE Sun One       
  • MyEclipse EASIE MyEclipse Tomcat 6 Server       
  • MyEclipse EASIE Tomcat 4       
  • MyEclipse EASIE Tomcat 5       
  • MyEclipse EASIE Tomcat 6       
  • MyEclipse EASIE Tomcat       
  • MyEclipse EASIE WebLogic 10       
  • MyEclipse EASIE WebLogic 6       
  • MyEclipse EASIE WebLogic 7       
  • MyEclipse EASIE WebLogic 8       
  • MyEclipse EASIE WebLogic 9       
  • MyEclipse EASIE WebLogic       
  • MyEclipse EASIE WebSphere 5       
  • MyEclipse EASIE WebSphere 6.1       
  • MyEclipse EASIE WebSphere 6       
  • MyEclipse EASIE WebSphere 4       
  • MyEclipse Examples //样例      
  • MyEclipse Memory Monitor //内存监控      
  • MyEclipse Tapestry Integration //插件集成      
  • MyEclipse JSP Debug Tooling //jsp调试插件      
  • MyEclipse File Creation Wizards //文件创建程序      
  • ICEfaces Integration for MyEclipse //基于Ajax的JSF开发框架()   
  • MyEclipse Backward Compatibility //后台功能      
  • MyEclipse Perspective Plug-in //透视图插件      
  • Pluse Collaboration Control Center //Eclipse的网页管理中心   
  • eclipse-cs 4.x.x -> 5.0.0 Migration Plug-in  //Eclipse插件兼容组件   
  • Mozilla Debug UI Plug-in(Incubation) //Mozilla调试插件(Mozilla是一款浏览器)      
  • Dynamic Languages ToolKit Core UI //对入PHP等动态语言支持的用户接口   
  • WTP Webservice UI Plug-in //Web 服务视图插件      
  • JavaServer Faces Tools - Core //jsf工具核心包      
  • Automatic Updates Scheduler //自动更新   
  • Service policy  //Web提供的服务性能目标定义,自动管理   
  • Atfdebug Plug-in(Incubation)  //动态语言的调试工具   
  • Auxiliary Web Module Support for MeEclipse// 辅助的Web模块支持.(可能是Struts等文件自动添加)   
  • JSF Editor Preview Support for MyEclipse//jsf编辑器 
  • 第四步:更改jsp默认打开的方式   
  • 安装了myeclipse后,编辑jsp页面,会打开他的编辑页面,同时也有预览页面,速度很慢,不适合开发。所以更改之windows–>perferences–>general–>editors->file associations   选择*.jsp,把编译器改为默认启动MyEclipse JSP Edition(在下方选择一种编辑器,然后点击左边的default按钮   )
  • 第五步: 更改内存使用文件   
  • 1、打开 eclipse.ini   
  •   
  • -startup
    ../Common/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
    --launcher.library
    ../Common/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
    -install
    D:/Myeclipse 8.5/Program
    -vm
    D:/Myeclipse 8.5/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client/jvm.dll
    -configuration
    configuration
    -vmargs
    -Xmx512m
    -XX:MaxPermSize=1024m
    -XX:ReservedCodeCacheSize=128m
    把下面的那个 -XX:MaxPermSize 调大,比如 -XX:MaxPermSize=1024M,再把 -XX:PermSize 调成跟 -XX:MaxPermSize一样大   
  • 原因:大家一定对这个画面很熟悉吧:   
  • 几乎每次 eclipse 卡到当都是因为这个非堆内存不足造成的,把最大跟最小调成一样是因为不让 myeclipse 频繁的换内存区域大小   
  • 注意:XX:MaxPermSize 和 Xmx 的大小之和不能超过你的电脑内存大小   
  • 经理比较奢侈,就调到了1024
  • 第六步: 取消Maven更新(启动更新)   
  • Window > Preferences > Myeclipse> Maven4Myeclipse > Maven>禁用Download repository index updates on startup

  • 改快捷键之类的经理就不介绍了。

    posted @ 2010-11-17 10:25 张元Won 阅读(18441) | 评论 (5)编辑 收藏

    最近发现很多朋友连拦截器都不知道,于是想写个BLOG总结一下。
    java拦截器的基本原理其实非常简单,说白了就是动态代理类。
    下面来看一个简单的例子
    首先,我建立一个拦截器的类InterceptorClass,这里的before()和after()方法是以后拦截器会执行的方法
    CODE清单一:

    public class InterceptorClass {
     
    public void before()
      System.out.println(
    "拦截器InterceptorClass方法调用:before()!"); 
     }
     
     
    public void after()
         System.out.println(
    "拦截器InterceptorClass方法调用:after()!"); 
     }

    }

     

    我们模拟一个业务组件接口BusinessInterface,和一个业务组件实现类BusinessClass
    CODE清单二:

    public interface BusinessInterface {
     
    public void doSomething();
    }

     

    CODE清单三:

    public class BusinessClass implements BusinessInterface {
     
    public void doSomething() {
       System.out.println(
    "业务组件BusinessClass方法调用:doSomething()"); 
     }

    }

     

    然后,创建一个动态代理类DynamicProxyHandler,这个类是集成InvocationHandler接口的,动态类的原理实际上是使得当你执行一个动态方

    法的时候,他可以把这个动态方法dispatch到这个动态类上来。这样,你就可以在这个方法的前后嵌入自己的一些方法。
    CODE清单四:
    //包含了业务对象绑定动态代理类的处理,并实现了InvocationHandler接口的invoke方法

    public class DynamicProxyHandler implements InvocationHandler {
     
    private Object business;//被代理对象
     private InterceptorClass inceptor = new InterceptorClass();//拦截器
     
     
    // 动态生成一个代理类对象,并绑定被代理类和代理处理器
     public Object bind(Object business) {
       
    this.business = business;
       
    return Proxy.newProxyInstance(
         
    //被代理类的ClassLoader
         business.getClass().getClassLoader(),
         
    //要被代理的接口,本方法返回对象会自动声称实现了这些接口
         business.getClass().getInterfaces(), 
         
    //代理处理器对象
         this);
     }


     
     // 代理要调用的方法,并在方法调用前后调用连接器的方法

     /**
      * 
    @param proxy  代理类对象
      * 
    @param method 被代理的接口方法
      * 
    @param args   被代理接口方法的参数
      * 
    @throws Throwable
      
    */

     
    public Object invoke(Object proxy, Method method, Object[] args)
       
    throws Throwable {
      Object result 
    = null;
      inceptor.before();
      result
    =method.invoke(business,args);
      inceptor.after();
      
    return result;
     }


    OK,我们来写个类测试一下
    CODE清单五:

    public static void main(String[] args) {
      
    //生成动态代理类实例
      DynamicProxyHandler handler = new DynamicProxyHandler();
      
    //生成待测试的业务组件对象
            BusinessInterface business = new BusinessClass();
            
    //将业务组件对象和动态代理类实例绑定
            BusinessInterface businessProxy = (BusinessInterface) handler.bind(business);
            
    //用动态代理类调用方法
            businessProxy.doSomething();
     }


    来看看结果:


    近期struts2很流行,而且拦截器是struts2里面一个比较好的功能,下面举个例子说明一下拦截器在struts2中的用法。
    struts2对拦截器实现做了一个封装,使得我们在实现的时候比较简单。
    首先我们要建一个拦截器类
    CODE清单六:

    public class AuthorizationInterceptor extends AbstractInterceptor {
     @Override
     
    public String intercept(ActionInvocation invocation) throws Exception {
      Map session 
    = invocation.getInvocationContext().getSession();
      String userName 
    = (String) session.get("userName");
      
    if ( userName != null && userName.equals("test")) {
       System.out.println(
    "拦截器:合法用户登录---");
       
    return invocation.invoke();
      }

      
    else
      
    {
       System.out.println(
    "拦截器:用户未登录---");
       
    return Action.LOGIN;
      }

     }

    }


    这个类是必须要继承struts2包中提供的AbstractInterceptor类,这个类有一个抽象方法intercept,这个方法是必须要实现的。
    那么经理在这个拦截器里面写了一个简单的实现,对url用户合法性做了一个限制。

    接下来比较关键的是过滤器在struts2中的配置,先看看代码
    CODE清单七:

    <package name="system" extends="struts-default">
      
    <interceptors>
       
    <!--  定义权限控制拦截器  -->
       
    <interceptor name="authority" 

    class
    ="com.sharesin.biz.common.intercepts.struts2.AuthorizationInterceptor"/>
       
    <!-- 定义一个包含权限控制的拦截器栈   -->
       
    <interceptor-stack name="mystack">
        
    <interceptor-ref name="defaultStack"></interceptor-ref>
        
    <interceptor-ref name="authority"></interceptor-ref>
       
    </interceptor-stack>
      
    </interceptors>
       
    <!--定义默认拦截器   -->
            
    <default-interceptor-ref name="mystack" />
       
    <!--定义全局处理结果   -->
      
    <global-results>
       
    <result name="login">index.jsp</result>
      
    </global-results>
      
    <action name="login_*" class="com.sharesin.biz.web.system.LoginAction" method="{1}">
       
    <result name="success">system/homepage.jsp</result>
      
    </action>
     
    </package>


    在interceptors节点里,我们可以定义多个拦截器,这里的名为authority的只是其中的一个。struts2的拦截器栈我是先执行struts2默认的拦

    截器defaultStack,然后再执行我的。然后只需要用default-interceptor-ref标签设置好这个system包中的默认拦截器为这个拦截器就OK了。

    struts2中引入了package这个概念,我觉得十分实用,当然这对struts2拦截器也是个实惠,我们可以根据不同的action来分包和不同的拦截器


    ok,来运行测试一下。


    结果..


     

     

     

     

     

    posted @ 2010-09-06 17:21 张元Won 阅读(4471) | 评论 (3)编辑 收藏
         摘要:  在FLEX开发中有一些小技巧,经理在这里总结下,方便以后查阅,也希望能和大家一起交流。 这些小功能在实际开发中是很经常用的。 一、在DataGrid的列中加图片 做报表的时候经常会在DataGrid中加入一些刻度条或者增减的图片表示一些API指标值,其实这个功能FLEX可以实现。 在DataGrid-colums-DataGridColumn中有个itemRenderer属性,...  阅读全文
    posted @ 2010-09-03 11:39 张元Won 阅读(3899) | 评论 (1)编辑 收藏

    在使用flex过程中经常会对调样式感到头痛,经理在这里准备把常用的一些东东总结一下,以便以后查阅。
    以后慢慢总结。
    一、公用
    1.includeInLayout:它的作用是当使用visible隐藏对象的时候,该对象不会占位。
    2.字体:fontsize:全局字体大小,推荐设置12。font-family:"ARIAL"。这些在CSS中设定好

    二、Panel
    1.headerHeight:Panel头的宽度,这里一般设置成15比较舒服。
    2.borderThicknessBottom:Panel控件下边框的粗细,一般设置成2比较舒服。
    3.borderThicknessLeft:Panel左边框的粗细,一般设置成2比较舒服。
    4.borderThicknessRight:Panel右边框的粗细,一般设置成2比较舒服。
    5.backgroundImage:如果觉得Panel的白色北京太丑,那就用这个换一个渐变背景吧。

    三、DataGrid&AdvancedDataGrid
    1.headerColors:用于绘制标题背景渐变的两种颜色的数组。推荐[#60beff,#1273ce],蓝色渐变
    2.alternatingItemColors:交替模式中行的颜色。此值可以是由多种颜色中任意两种所组成的数组。推荐[#FFFDCE, #C8ECFF],浅蓝和黄色。
    3.headerWordWrap:则指定标题文本不适合一行时将换行。(这是在AdvancedDataGridColumnGroup中设置的)。
    4.一个标志,指示当此列中各行的文本不能在一行中显示时,是否能够自动换行(这是在DataGridColumn中设置的)。

    四、Chart
    1.showDataTips:指定Flex是否显示图表的提示窗口控件。
    2.verticalAxis-CategoryAxis-Title:单位可以加在坐标轴上。
    3.GradientEntry:设置图表的渐变色。详见第..
    http://www.blogjava.net/zhangyuan/archive/2010/09/03/330847.html
    如下CODE

     1<mx:BarSeries xField="costs" >
     2                        <mx:fill>
     3                            <mx:LinearGradient>
     4                                <mx:GradientEntry color="#A6A602" ratio="0"  />
     5                                <mx:GradientEntry color="#DFDF97" ratio=".2"  />
     6                                <mx:GradientEntry color="#A6A602" ratio=".4"  />
     7                                <mx:GradientEntry color="#F5F655" ratio=".8"  />
     8                                <mx:GradientEntry color="#A6A602" ratio="1"  />
     9                            </mx:LinearGradient>
    10                        </mx:fill>
    11                    </mx:BarSeries>





    posted @ 2010-08-27 15:44 张元Won 阅读(2979) | 评论 (0)编辑 收藏

     cognos中有列表和图形,但是表和图之间总是孤立的,刷新页面也都是全页面刷新,于是经理在想,是否有个方法能在点击cognos列

    表时旁边的cognos图表能够实时的变动,类似flex中的绑定效果。在老板的强烈催促下,经理也没什么时间去网上去找去问,觉得凭自己以前

    的一些J2EE老底子加上report studio中强大的HTML项目貌似可以搞定,于是开搞了...
     首先给大家看看数据库

    一、先用report studio建立一个带参数的cognos饼图报表(这里可以随便是什么图),报表灰常简单

    设置参数名为par3,并把此报表保存为a1
    二、再用report studio建立一个列表,如图

    经理在这里多用了html项目,因为cognos在页面上封装的太好了,只能这样拼凑脚本。
    基本的原理就是在列表旁边放置一个html项目,其内容是一个iframe,其连接也就是刚刚做好的那个带参数的饼图报表。
    然后在列表中放置一个label,在label中设置点击事件出来iframe链接(其实这样就换了一个参数)及重新载入。

    其中
    1的代码如下,他主要是点击的列表触发的事件

    1<script type="text/javascript">
    2    function changeframe(par)
    3    {
    4        sname="http://localhost/cognos8/cgi-bin/cognos.cgi?b_action=cognosViewer&ui.object=/content/package[@name='aa']/report[@name='a1']&ui.action=run&run.prompt=false&p_par3="+par;
    5        frameChart.location.href=sname;
    6    }

    7</script>

     

    2到6主要就是定义一个含有点击事件的label
    2的代码为

    1<u><label onclick="changeframe('


    3其实是一个报表表达式,它是参数

    1[query1].[arr2]


    4的代码为

    1');"  style="width:100%;height:100%" >


    5也是一个报表表达式,他是设置该列显示的内容

    1[arr2]


    6的代码为,他收个尾

    1</label ></u>


    7的代码主要是iframe,然后就是刷新等待时候的一个等待提示
    7的代码为

     1<iframe frameborder="0" id="frameChart" src="" scrolling="no" height="450" width="100%"></iframe>
     2<div id="loading" style="display:block; padding:100px 0 100px 0;text-align:center;color:#999999;font-size:12px;">
     3      页面加载中
     4    </div>
     5<script type="text/javascript">     
     6     var  a  = document.getElementById("frameChart");   
     7     var b  = document.getElementById("loading");   
     8     a.style.display =  "none";                     
     9     b.style.display = "block";                     
    10     
    11        if  (window.ActiveXObject)   {   
    12
    13
    14     a.onreadystatechange =  function()     
    15     {   
    16        if (this.readyState=="complete")   
    17         {                                                                   
    18             b.innerHTML  =   "";   
    19              b.style.display = "none";   
    20             a.style.display  = "";   
    21          }
       
    22     }
     
    23     }
    else
    24     a.style.display =  "block";                     //隐藏 
    25     b.style.display = "none"
    26     }

    27  </script>


    拼滴我累死了.....

    OK,我们来看看效果
    我先点击一下第一个单元格

    再点击第二个

    注意,列表不会刷新哦,有点像ajax的效果。


    后来想想,其实功能挺简单的。
    例子比较简陋,只是想传达一个思想,希望以后大家有好东西能一起交流。

    posted @ 2010-08-20 17:37 张元Won 阅读(4292) | 评论 (4)编辑 收藏

        对COGNOS有一定了解以后,经理逐渐发现COGNOS的强大之处,特别的立方体模型使数据仓库更有条理而且访问速度更快。但是也了解到了COGNOS的劣势,应该说是IBM整体的劣势,也就是界面太丑。虽然COGNOS也包含了几乎所有的图表,样式也可以调整。但是对COGNOS的界面调整太复杂,几乎看的比较好的COGNOS显示界面都要有HTML对象来调,更或者无论你怎么调也是基于HTML,在色彩和动画方面不会有很大的空间了。
        于是经理在想,是不是可以把只用COGNOS对数据的抓取优势而在显示层用别的方式呈现呢(比如flex或者别的)?如果COGNOS能开发更多的前端显示接口固然好,但这是不可能的,当然,经理知道这样做会损失一部分性能,但是对现在大多对界面都很挑剔的客户,这肯定是一条比较好的路。
        OK,那么现在经理把做的一个java调用cognos端直接返回XML字节流的例子和大家分享下。
    一、环境
        硬件环境:主屏2.0Hz+内存3gb+系统32位
        软件环境:cognos 8.41+Myeclipse8.5ga+sqlserver2000sp4

    二、IBM Cognos Connection部分
        首先,我用framework做了了一个灰常简单的包(所谓非常简单就是里面完全没有维度和亮度,直接隐射的数据库表列),并把他发布到公共文件夹,名为test_sdk_paser

    然后在这个包下用report studio做了一个灰常简单的报表,名为test

    这个报表就是我们之后要在java中获取其数据的报表。
    三、COGNOS SDK调用程序
        0.准备步骤.
    我们先要把sdk所需要的包考到项目中来。必要包的位置在D:\cognos\c8\sdk\java\lib\下,先给大家看看我的目录结构

        1.我建立了一个config.properties文件用来存放congos服务器的ip和端口

        在java中对应写一个从properties中获取数据的方法

        2.弄清楚报表的xpath
        这个xpath我们可以在报表的 设置属性-->常规 找到

        xpath是十分重要的,其实报表ID也十分重要,这个经理以后会跟大家写。
        3.连接cognos服务器
    经理这里用ReportService_ServiceLocator对象的getreportService方法来获得一个ReportService_Port对象。
    getreportService需要一个参数,是cognos服务器地址,http://localhost/p2pd/servlet/dispatch
    ReportService_Port是报表操作对象,我们就是用这个对象的run方法来运行cognos端报表。


        4.设置cognos认证信息
    经理这里的cognos设置了NTML认证,那么是需要在sdk代码中设置认证信息的。

    用CAM方式进行登陆


        5.设置report的参数
    本例中用HashMap来传递report的参数,用循环的方式把外界的参数从HashMap中取出来,设置到ParameterValue的value中去。

        6.cognos运行报表设置
    每项代表什么经理已经把注释写的很清楚了。


    这里尤其提醒大家注意的一点是,RunOptionEnum.prompt这个参数一定要设置,设置这个参数是当cognos运行有参数的report时候,不弹出html提示窗口。经理之前就是没有设置这个参数,所以在测试带参数报表的时候搞了一天都没搞出来。
    那么这个option到底还有多少参数呢?经理给大家看啊看你cognos sdk的官方API

    大家看到了吧,官方的API只是把枚举值做了一个罗列,具体他们是做什么的?有什么作用?什么都没说。经理当然也看了sdk的源码,希望能在源码中找到一点注释,结果是:sdk的java文件没有一行注释代码。
    经理在这里不想骂人,现在终于知道为什么cognos sdk这个领域这么弱了。
        7.运行cognos报表并返回xml数据
    经理在这里统计了一下用sdk返回数据的时间。
    之前讲过用ReportService_Port的run方法可以让report运行,然后返回一个叫AsynchReply的对象,这个对象中有details[]属性,这个里面基本上包含了report返回的所有信息。而他的status属性则标识了此次请求是否成功。


    OK,现在代码都解释完了,现在来测试下。

    经理在这里写了一个简单的测试例子,用之前讲到的test_sdk_paser包中的test进行测试


    下面再测试一个带参数的报表

    把之前的那个报表加一个参数

    然后在这里输入一个1

    得到这样的数据

    稍微改动下代码,然后run一下

    然后得到结果是这样的

    正好和刚刚的结果一样~~


    sdk取数据关键的也就是上面说的7个步骤。最后依然要BS一下cognos的开发者,居然在源码中一行注释都没有,帮助文档也不全面。
    所以还是集结大家的力量一起研究一起分享研究后的成果。
    欢迎大家一起来博客上讨论。

    谢谢~

     

     

     

     

     

     

     

     

     

     


     

    posted @ 2010-08-05 21:41 张元Won 阅读(6152) | 评论 (16)编辑 收藏