I Like It !

Friday, September 10, 2010

Business Object 水晶报表 CRYSTAL REPORT SDK

BO报表的水晶报表是标准的C/S模式,因此首先要登陆服务端:
ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
IEnterpriseSession enterpriseSession = sessionMgr.logon(userName, password, aps, auth);
IInfoStore iStore = (IInfoStore) enterpriseSession.getService("InfoStore"); //IInfoStore应该是BO报表的一个snapshotview
session.setAttribute("InfoStore", iStore);
session.setAttribute("enterpriseSession", enterpriseSession);
登陆BO服务器后,就可以用IInfoStore来查询服务器端的数据了,通常查询的都是报表ID
IInfoStore iStore = (IInfoStore) session.getAttribute("infoStore");
IInfoObjects result = iStore.query("Select SI_ID, SI_NAME From CI_INFOOBJECTS Where SI_NAME = '"
+ "World Sales Report" + "'" + " And SI_INSTANCE = 0"); //CI_INFOOBJECTS这个应该是BO存放报表ID的表
IInfoObject infoObject=(IInfoObject)result.get(0);
int reportID = infoObject.getID();
报表ID获得了,用SDK来获取该报表ID对应的报表对象
IEnterpriseSession enterpriseSession = (IEnterpriseSession) session.getAttribute("enterpriseSession"); //现在知道之前为什么要把IEnterpriseSession缓存了
IReportSourceFactory reportFactory = (IReportSourceFactory) enterpriseSession.getService ("", "PSReportFactory");
Object reportSource = reportFactory.openReportSource(reportID, request.getLocale()); //openReportSource这个方法返回BO报表的实例
session.setAttribute("reportSource", reportSource);
另外还有一种方式获取报表对象是通过RAS的SDK(RAS的SDK提供了更加细粒度的报表操作,如增加,删除或者修改报表中的table等等)
IEnterpriseSession enterpriseSession = (IEnterpriseSession) session.getAttribute("enterpriseSession");
IReportAppFactory reportAppFactory = (IReportAppFactory) enterpriseSession.getService("", "RASReportFactory");
ReportClientDocument reportClientDoc = reportAppFactory.openDocument(reportID, 0, request.getLocale());
Object reportSource = reportClientDoc.getReportSource();
session.setAttribute("reportSource", reportSource);
从BO报表实体(*.rpt)获取报表类实例的方法在servlet或者jsp页面中经常使用
<%@ page import="com.crystaldecisions.reports.reportengineinterface.JPEReportSourceFactory" %>
<%@ page import="com.crystaldecisions.sdk.occa.report.reportsource.IReportSourceFactory2" %>
IReportSourceFactory2 rptSrcFactory = new JPEReportSourceFactory();
String report = "/reports/sample.rpt";
Object reportSource = rptSrcFactory.createReportSource(report, request.getLocale());
session.setAttribute("reportSource", reportSource);
在页面通过CrystalReportViewer来展示报表界面的方法,类似ActiveX插件的方式
CrystalReportViewer viewer = new CrystalReportViewer();
viewer.setReportSource(reportSource); //该reportSource就是上述获取的报表对象实例
viewer.setOwnPage(true);
viewer.processHttpRequest(request, response, getServletContext(), null);
另外还有几种View来展示报表界面,方法跟CrystalReportViewer大致一样,只不过类名叫CrystalReportXXXXViewer
导出报表的方法
ReportExportControl exportControl = new ReportExportControl();
ExportOptions exportOptions = new ExportOptions();
exportOptions.setExportFormatType(ReportExportFormat.PDF);
exportControl.setReportSource(reportSource);
exportControl.setExportOptions(exportOptions);
exportControl.setExportAsAttachment(true);
exportControl.processHttpRequest(request, response, getServletContext(), null);
SDK中的参数类(BO不能直接写传递sql,它的服务端把数据库底层访问都封装好了,所以你必须按它的规范传参数对象给它)
Fields parameterFields = new Fields(); //Fields为最外层的参数容器
ParameterField pfieldNum = new ParameterField(); //ParameterField为第二层参数容器
Values numVals = new Values();//value是最低层的参数容器
ParameterFieldDiscreteValue pfieldDVNum = new ParameterFieldDiscreteValue(); //ParameterFieldDiscreteValue和ParameterFieldRangeValue才是真正的参数对象
参数的设置
Integer numParamVal = new Integer(24000);
pfieldNum.setName("SalesQuota"); //报表中的参数名
pfieldDVNum.setValue(numParamVal); //参数的值
参数的包装
numVals.add(pfieldDVNum);
pfieldNum.setCurrentValues(numVals);
parameterFields.add(pfieldNum);
给报表传参
viewer.setParameterFields( parameterFields );
基本的SDK都在上面了,BO的水晶报表比较简单,上手很快,但是就是很多限制,你必须按BO定义好的规则来一步步的做,它的SDK的接口也比较少,而主要的技巧在于画报表(从商业报表的角度来讲,这样做的确是对的
,它目的就是要把我们从代码中解放出来而专注于业务逻辑,但是对于追求灵活定制的程序员来说,用它的SDK能做的事情就太少了)。

项目实践(4)--BO水晶报表SDK




BO报表的水晶报表是标准的C/S模式,因此首先要登陆服务端:
ISessionMgr sessionMgr = CrystalEnterprise.getSessionMgr();
IEnterpriseSession enterpriseSession = sessionMgr.logon(userName, password, aps, auth);
IInfoStore iStore = (IInfoStore) enterpriseSession.getService("InfoStore"); //IInfoStore应该是BO报表的一个snapshotview
session.setAttribute("InfoStore", iStore);
session.setAttribute("enterpriseSession", enterpriseSession);
登陆BO服务器后,就可以用IInfoStore来查询服务器端的数据了,通常查询的都是报表ID
IInfoStore iStore = (IInfoStore) session.getAttribute("infoStore");
IInfoObjects result = iStore.query("Select SI_ID, SI_NAME From CI_INFOOBJECTS Where SI_NAME = '"
+ "World Sales Report" + "'" + " And SI_INSTANCE = 0"); //CI_INFOOBJECTS这个应该是BO存放报表ID的表
IInfoObject infoObject=(IInfoObject)result.get(0);
int reportID = infoObject.getID();
报表ID获得了,用SDK来获取该报表ID对应的报表对象
IEnterpriseSession enterpriseSession = (IEnterpriseSession) session.getAttribute("enterpriseSession"); //现在知道之前为什么要把IEnterpriseSession缓存了
IReportSourceFactory reportFactory = (IReportSourceFactory) enterpriseSession.getService ("", "PSReportFactory");
Object reportSource = reportFactory.openReportSource(reportID, request.getLocale()); //openReportSource这个方法返回BO报表的实例
session.setAttribute("reportSource", reportSource);
另外还有一种方式获取报表对象是通过RAS的SDK(RAS的SDK提供了更加细粒度的报表操作,如增加,删除或者修改报表中的table等等)
IEnterpriseSession enterpriseSession = (IEnterpriseSession) session.getAttribute("enterpriseSession");
IReportAppFactory reportAppFactory = (IReportAppFactory) enterpriseSession.getService("", "RASReportFactory");
ReportClientDocument reportClientDoc = reportAppFactory.openDocument(reportID, 0, request.getLocale());
Object reportSource = reportClientDoc.getReportSource();
session.setAttribute("reportSource", reportSource);
从BO报表实体(*.rpt)获取报表类实例的方法在servlet或者jsp页面中经常使用
<%@ page import="com.crystaldecisions.reports.reportengineinterface.JPEReportSourceFactory" %>
<%@ page import="com.crystaldecisions.sdk.occa.report.reportsource.IReportSourceFactory2" %>
IReportSourceFactory2 rptSrcFactory = new JPEReportSourceFactory();
String report = "/reports/sample.rpt";
Object reportSource = rptSrcFactory.createReportSource(report, request.getLocale());
session.setAttribute("reportSource", reportSource);
在页面通过CrystalReportViewer来展示报表界面的方法,类似ActiveX插件的方式
CrystalReportViewer viewer = new CrystalReportViewer();
viewer.setReportSource(reportSource); //该reportSource就是上述获取的报表对象实例
viewer.setOwnPage(true);
viewer.processHttpRequest(request, response, getServletContext(), null);
另外还有几种View来展示报表界面,方法跟CrystalReportViewer大致一样,只不过类名叫CrystalReportXXXXViewer
导出报表的方法
ReportExportControl exportControl = new ReportExportControl();
ExportOptions exportOptions = new ExportOptions();
exportOptions.setExportFormatType(ReportExportFormat.PDF);
exportControl.setReportSource(reportSource);
exportControl.setExportOptions(exportOptions);
exportControl.setExportAsAttachment(true);
exportControl.processHttpRequest(request, response, getServletContext(), null);
SDK中的参数类(BO不能直接写传递sql,它的服务端把数据库底层访问都封装好了,所以你必须按它的规范传参数对象给它)
Fields parameterFields = new Fields(); //Fields为最外层的参数容器
ParameterField pfieldNum = new ParameterField(); //ParameterField为第二层参数容器
Values numVals = new Values();//value是最低层的参数容器
ParameterFieldDiscreteValue pfieldDVNum = new ParameterFieldDiscreteValue(); //ParameterFieldDiscreteValue和ParameterFieldRangeValue才是真正的参数对象
参数的设置
Integer numParamVal = new Integer(24000);
pfieldNum.setName("SalesQuota"); //报表中的参数名
pfieldDVNum.setValue(numParamVal); //参数的值
参数的包装
numVals.add(pfieldDVNum);
pfieldNum.setCurrentValues(numVals);
parameterFields.add(pfieldNum);
给报表传参
viewer.setParameterFields( parameterFields );
基本的SDK都在上面了,BO的水晶报表比较简单,上手很快,但是就是很多限制,你必须按BO定义好的规则来一步步的做,它的SDK的接口也比较少,而主要的技巧在于画报表(从商业报表的角度来讲,这样做的确是对的
,它目的就是要把我们从代码中解放出来而专注于业务逻辑,但是对于追求灵活定制的程序员来说,用它的SDK能做的事情就太少了)。