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

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

        很早以前用过VSS的人都知道,相比之下SVN的确是个好东东。他以副本式的版本管理模式很好的解决了VSS单数据源下的签入签出混乱问题。但是最近发现很多人都不会装SVN,经理在这里写个博客跟大家分享一下。
    环境:
    Win7系统
    Myeclipse 8.5GA
    JDK1.6
    一、准备工作
    首先,当然是下载软件安装包。(经理这里以svn1.6为例)这里需要2个安装程序和1个解压包。


    Setup-Subversion-1.6.6.msi这个是SVN服务器。
    (你可以在这里 http://subversion.tigris.org 下载到最新版本)

    TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi是SVN 版本控制系统的一个免费开源客户端。
    (可以在这里下载   http://tortoisesvn.net/downloads )

    site-1.6.12.zip是Myeclipse的插件包。
    (可以在这里下载 subclipse.tigris.org

    二、安装svn服务器
        首先安装svn服务器(也就是Setup-Subversion-1.6.6.msi这个),按照常规安装就OK了。然后把tortoise也安装起来(也就是TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi这个)。
    在安装tortoise的时候会提示重启,这里最好重启下。

    这是经理的安装目录
    Setup-Subversion-1.6.6.msi --> Subversion目录
    TortoiseSVN-1.6.10.19898-win32-svn-1.6.12.msi --> TortoiseSVN目录
    svnroot目录是什么呢?接着往下看

    三、建立SVN资源库(Repository)
    svnroot是经理建立的svn资源库根目录,然后在这个目录里建立了一个名为repos的目录。(这个目录是经理打算做svn资源库的目录)

    然后在这个目录点右键->TortoiseSVN->Create repository here



    当看到被建立的repos目录中多了很多文件夹后证明资源库创建成功。
    在网上也看到有用cmd命令来创建的,如svnadmin create D:\svn\repository

    四、配置用户和权限
     打开刚刚建立的资源库文件夹(repos),里面有一个名为conf的文件夹,这个文件夹里都是svn的配置信息。首先打开svnserve.conf文件
    这里行前凡是有#的都等于是被注释忽略了, 你可以把#去掉让那一行生效, 或者自己新添加行。经理对这个文件主要修改3处
    把" #anon-access = read"改为"anon-access = none"
    (他表示没有经过验证的用户无任何权限,之前的意思是没经过验证的用户可以进行读操作。经理强烈建议该成none,不然别人没有验证的人都可以看到项目文件)
    把" #auth-access = write"去掉#为"auth-access = write"
    (通过验证的用户有写操作,写操作是包含读操作的)
    把" #password-db = passwd"去掉#为"password-db = passwd"
    (密码数据存放到passwd文件中)

    打开passwd文件
    设置一个用户名如 manager=jingli
    还有一个文件authz
    这个文件主要是用来针对不同的目录给用户分配不同的权限的。
    如:
    [groups]
    team1 = manager,staff
    表示划定一个小组,组员有manager和staff用户

    [repository:/baz/fuz]
    @team1= rw
     * = r
    表示team1这个组对资源有读写权限,资源对所有人有读权限

    [/foo/bar]
    manager = rw
    * =r
    也可以像这样对个人设置权限,manager有读写权限,该资源对所有人有读权限
    这些可以根据个人需要修改

    五、运行svn服务器
    在安装的Subversion目录下有个bin目录里svnserve.exe,我们直接运行这个文件是无效的。需要在控制台来启动他。直接在cmd命令中输入svnserve -d -r D:\SVN\svnroot这样服务就启动了(注意,这里指定的是svnroot文件即资源根目录,而不是资源目录repos)。当然你关闭dos窗口的时候svn服务也就关闭了。svn的所有操作都需要在这个服务器启动的基础上进行。但是一直开着这个dos命令窗口很不爽,所以经理在这里写个程序让他开机自动启动。
    首先我们需要为svnserve创建一个系统服务。
    以经理本机的安装目录为例,在cmd命令行输入

    sc create SVNServer binpath= "D:\SVN\Subversion\bin\svnserve.exe --service -r D:\SVN\svnroot" 
    displayname
    = "SVNServer" depend= Tcpip start= auto   
    pause

    binpath指svnserve.exe的路径
    (注意:如果你的路径里有空格记得要在binpath的头尾用转义字符/"把整个个binpath框起来,D:\SVN\svnroot指svn资源库根目录)
    displayname指服务名称
    depend指协议是tcpid
    start指开机自动启动
    注意:以上的=后面的一个空格千万不要丢了

    然后我们打开服务可以看到我们的服务已经是自动启动了


    六、安装subeclipse插件
    打开之前下载的site-1.6.12.zip文件可以看到里面有features、plugins两个文件夹
    用之前我讲过的Myeclipse安装插件的方法安装就可以了
    参考:
    (http://www.blogjava.net/zhangyuan/archive/2010/07/28/327371.html)


    在这里要注意一点
    安装插件时要去掉features中的org.tigris.subversion.subclipse.mylyn_3.0.0.jar文件
    去掉plugins中的org.tigris.subversion.subclipse.core_1.6.8.jar和org.tigris.subversion.subclipse.mylyn_3.0.0.jar
    经理用Myeclipse8.5配这一套svn如果不删这些文件的话,启动Myeclipse时会报错


    这样SVN就搭建好了..



    posted @ 2010-07-28 23:27 张元Won 阅读(31290) | 评论 (13)编辑 收藏
    我们在用Myeclipse进行开发的时候会用到很多插件,比如jad、svn、properties等。经理最近发现很多同事安装问我xx插件怎么安装,觉得很惊讶,居然不会装插件。而有的同事会安装插件,但是安装的插件很零散,缺乏管理。那么经理在这里把安装插件的方法和大家分享下。
    环境
    开发工具:Myeclipse8.5
    JAVA环境:JDK1.6
    操作系统:windows7

    首先给大家看看经理的Myeclipse安装目录,经理在这个目录里建了一个myPlugin文件夹专门来管理插件。

    我这里以安装jad的插件为例讲解。我们在myPlugin目录下建立一个jad目录来存放jad的插件包,在这个目录下创建features和plugins目录,并把jad的插件包copy到里面去。

    打开Myeclipse的安装目录下的dropins文件夹,在此文件夹下创建jad.link文件

    在这个文件中写入刚才配置的myPlugin的jad地址
    path=D:\\MyEclipse 8.5\\myPlugin\\jad
    注意:这里的反斜杠需要转义,也就是用\\来表示。

    这样配置工作就完成了。

    以后我们所有的插件都可以在dropins这个文件夹中来创建对应的.link文件链接。而所有插件包夜可以在myPlugin目录中很好的管理起来,这样不是很好?..

    希望以后有好东西还是跟大家一起分享
    posted @ 2010-07-28 23:25 张元Won 阅读(32502) | 评论 (13)编辑 收藏
    昨天跟朋友一起吃饭,他说到两个Integer类型值比较是否相等的问题。经理也在这里把java的Integer值比较的问题拿出来说一说。因为在面试的时候这个是经常遇到的问题。
    首先给大家看一个例子:
     1public class Test {
     2
     3    /**
     4     * 关于Integer大小比较问题
     5     * @author 经理
     6     */

     7    public static void main(String[] args) {
     8        Integer a = 10;
     9        Integer b = 10;
    10        System.out.println("a==b : " + String.valueOf(a==b));
    11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
    12    }

    13}

    14
    运行一下,在控制台得到的结果是这样的
    a==b : true
    a.equals(b) : 
    true

    当是当我们变换一下值
     1public class Test {
     2
     3    /**
     4     * 关于Integer大小比较问题
     5     * @author 经理
     6     */

     7    public static void main(String[] args) {
     8        Integer a = 1000;
     9        Integer b = 1000;
    10        System.out.println("a==b : " + String.valueOf(a==b));
    11        System.out.println("a.equals(b) : " + String.valueOf(a.equals(b)));
    12    }

    13}

    运行一下,控制台的结果又是
    a==b : false
    a.equals(b) : 
    true

    这是什么原因呢?我当时也有点犯糊涂。有点冲动就直接开源码看了。
    实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。
    1public static Integer valueOf(int i) {
    2        if(i >= -128 && i <= IntegerCache.high)
    3            return IntegerCache.cache[i + 128];
    4        else
    5            return new Integer(i);
    6    }
    我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
    至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。

    把平时出现的问题记录下来,自己就可以一点一点进步了。
    posted @ 2010-07-24 16:03 张元Won 阅读(24783) | 评论 (12)编辑 收藏
    JAVA经常会有取properties文件的需求,因为一些host、port客户应该能自行修改。所以这些东东应该放在一个配置文件中,而不是编译成class文件。当然,这样的配置文件可以是xml文件也可以是property文件,取的方法也不一样。经理在这里介绍一个经常用的方法。
    这里写了一个例子,先给大家看看目录结构

    经理是用properties文件来做的,因为这个非常简单,而且读取properties文件的速度比读xml要快的多。
    这里的主要文件有两个:config.properties是配置文件,Test是测试java类
    config文件的内容就是一个ip一个port

    原理很简单就是首先取得config.properties的二进制流,然后用JAVA封装好的Properties类把这个流load进来,最后只需要用Properties对象中的getProperty(String key)方法就可以取值了。是不是很简单。
    给大家看看代码:

    我们来运行下结果:

    成功了~
    posted @ 2010-07-12 11:48 张元Won 阅读(2563) | 评论 (4)编辑 收藏
    看了很多Cognos建模概念性的东西,一直被‘维度’这个概念困扰。Cognos把数据看成一个立方体,例如:我们把产品、地区、时间组成一个立方体,那么维度就相当于这个立方体的坐标轴,各个维度的每个交点上面的值就是量度(即数据)

    这是对模型设计一个非常重要的概念,因为平面取值的搜索条件是2个,而三围取值的搜索条件是3个,这样一来搜索速度会很大程度的提升。
    最重要的还不仅仅如此,因为维度还可以分层的,就是说如上图的例子,时间是可以分为,年、月、日,而产品可以分为产品系列、类型、和品牌产品,地区也可以分为地域、国家和部门。这样一来就是一个多维多层级的数据模型。

    再一个概念就是类别。类别其实是维度多面性的一个体现。他相当于是在每一层上又多加了一个拓展,以地区为例。

    那么有了这些概念,我们在建模,不应该说是在建立数据库平面模型的时候就应该按照这样的概念去设计数据库。毕竟两个平面表就可以组成一个立方体的多维数据表,而表中的字段、数据可以用层和类的关系来模拟。真是受益匪浅啊~



    posted @ 2010-05-26 11:03 张元Won 阅读(1130) | 评论 (0)编辑 收藏
       最近进了新公司的数据挖掘与分析组,因公司需求开始学习Cognos,前几个星期看了下Cognos的主要设计器,没想到经理马上就要我搞Cognos的sdk,这个东西国内用的人很少,网上的资料也相当少,只能硬着头皮自己看官方的文档和例子。
       这里就把东西都记录下来。
      
       首先,根据看的一些资料,所谓sdk其实是Cognos公布了一些自己在设计产品时候留下的接口,可以让客户从程序端灵活的调用。但是Cognos本身具有的设计功能已经灰常强大了,一般会用到sdk的公司基本上都是遇到很J8的甲方。不过这次也给了我很大的学习机会。
       那么我这里写了一个用java访问Cognos建立的维度和量度,来生成报表。
       一、准备工作
          1.建立一个叫 zj_cognos_interjavaweb项目, 我这里比较熟悉用struts于是自己把struts的框架也导进来了
          2.找到Cognos自带的例子, 示例位置在cognos安装目录"c8"webapps"samples"WEB-INF"src"com"cognos"jspSample.
          在这里可以看到一些工具类
         

    我们把这些类考到项目中来

    这些类是非常重要的,很多类如API.JAVA,LogonException等都是封装的方法类,一般不需要用,不过里面有很多的方法,可供我们学习。
    在这里我们用的比较多的是CognosConnection和ReportBuilder这两个类。
    这里我用了一个配置文件来保存一些静态参数
    <?xml version="1.0" encoding="gb2312"?>
    <cognos version="8.3">
        
    <url_home>
            
    <![CDATA[
                    http://localhost/cognos8
                
    ]]>
        
    </url_home>
        
    <url_report_prefix>
            
    <![CDATA[
                    /cgi-bin/cognos.cgi?b_action=cognosViewer&ui.action=run&ui.object=
                
    ]]>
        
    </url_report_prefix>
        
    <url_report_suffix>
            
    <![CDATA[
                    &run.outputFormat=&run.prompt=true&cv.header=false&cv.toolbar=false
                
    ]]>
        
    </url_report_suffix>
        
    <url_logoff>
            
    <![CDATA[
                    /cgi-bin/cognos.cgi?b_action=xts.run&m=portal/logoff.xts&h_CAM_action=logoff
                
    ]]>
        
    </url_logoff>
        
    <url_cm>http://localhost:9300/p2pd/servlet/dispatch</url_cm>
        
    <namespace>my cognos</namespace>
    </cognos>

    ServletContext application = getServlet().getServletContext();
        HttpSession session 
    = request.getSession();
        String cfgPath 
    = application.getRealPath("/WEB-INF/cfg.xml");
        String cmUrl 
    = ConfigUtil.parseXml(cfgPath,"url_cm");
        
    //连接cognos服务
        CognosConnection conn = new CognosConnection(cmUrl,application,session);
        
    //-----如果是用匿名认证登陆就不需要这句话,如果是用的自己的认证就需要登陆一下
        
    //bb是我的表空间,zhangyuan是我本机用户名,123是我本机的密码
        conn.logon("bb""zhangyuan""123");
        
    //创建一个报表生成器的实力类
        ReportBuilder rb = new ReportBuilder(conn);
        
    //指定生成报表的包
        String packageSp =     "/content/package[@defaultName='mbase']";
        rb.createReport(packageSp);
        
    //用Cognos sql来指定生成的列
        String[] colRef =  {"[business layer].[date].[mdate].[year]","[business layer].[date].[mdate].[day]","[business layer].[measures].[psend]"};
        String[] titles 
    = {"year","day","psend"};
        rb.addColumns(titles, colRef);
        
    //指定生成的报表名
        String name  = "ReportWizardReport ";
        
    //增加报表
        rb.saveReport(name);
    posted @ 2010-05-25 12:02 张元Won 阅读(4994) | 评论 (8)编辑 收藏