??xml version="1.0" encoding="utf-8" standalone="yes"?> 在用模拟器开发时Q可以通过盘来模拟SD卡。具体做法是Q?/p>
1.创徏一个SD卡镜像文?/strong> 打开cmdQ我是进入到c盘根目录下,输入如下命oQmksdcard 1024M sdcard.img 2.兌SD卡和模拟?/strong> 是让模拟器知道它的SD卡是谁,路径是什么?/p>
在eclipse中用了ADT插g。eclipse -> windows->Android AVD Manager Q弹Z个窗口, 在SDCard后面的框中输入:cQ\sdcard.img Q即是第一步创建的SD卡镜像文件的位置。先点击create avdQ?/p>
然后点击 finish l束?/p>
3、向SD卡中导文?/strong> 在cmd中,命o如下Qadb push test.mp3 sdcard/test.mp3 q会本地当前目录下的test.mp3文g拷到sdcard中,文g名不变。前一个test.mp3是本地文件的路径Qsdcard是目的sd卡镜像的文g名(L后缀Q?/p>
4、在模拟器中使用SD卡中的文?/strong>
导入文g后,如果要在模拟器中讉KQ还需要在模拟器中的Dev tools里面Media scanner scan 一下媒体文件?br /> 5、说?/strong>
默认时adb.exe在platform-tools路径下?br />
该命令会在当前目?我即是c盘根目录)下生成一个sdcard.img文gQ该文g是Android模拟器的SD卡镜像文件?br />
1024M表示1024兆,卌SD卡有1个G的容量,也可用K做单位(1M=1024KQ,K,M必须大写?br />
目前Android支持8M~128G的SD卡?/p>
q一步需要把模拟器运行v来?/p>
转自Q?a >http://www.iteye.com/topic/396263
]]>
<head>
<title></title>
<script>
function showLeftFrame() {
if (document.all.leftTd.style.display == 'none'){
document.all.middleTd.innerText = '3';
document.all.leftTd.style.display = '';
} else {
document.all.middleTd.innerText = '4';
document.all.leftTd.style.display = 'none';
}
}
</script>
</head>
<body>
<table width="800" height="423" align="center">
<tr>
<td height="100" colspan="3">
<iframe name="top" src="top.htm" scrolling="no" frameborder="0"
marginheight="0" marginwidth="0" width="100%" height="100%"></iframe>
</td>
</tr>
<tr>
<td id="leftTd" width="150" height="500">
<iframe name="left" src="left.htm" scrolling="no" frameborder="0"
marginheight="0" marginwidth="0" width="100%" height="100%"></iframe>
</td>
<td id="middleTd" width="10" onclick="showLeftFrame()"
bgcolor="#ddeeff" style="font-family:Webdings;cursor:hand;">
3
</td>
<td height="500">
<iframe name="content" src="content.jsp" scrolling="no"
frameborder="0" marginheight="0" marginwidth="0" width="100%"
height="100%"></iframe>
</td>
</tr>
</table>
</body>
</html>
打开报表文g.rptQ在字段资源理器里Q右d敎ͼ》新?/font>
在下面的选项属性里可以讄参数的名UͼcdQ提C文本,是否允许多个|D围类型(如果是字W串用离散,日期或数字用范围Q?/font>
注意Q上面都是比填的Q如果参数是用来对应某个字段的,cd必需跟该字段一栗?/font>
在值属性里可以Z个值的列表Q点上去Q然后点双的按钮就q入值列表编辑框了;是否提示时仅昄说明Q编辑掩码,可以l参数的指定一定的格式Q最长度;最大长度;
现在你可以给q个报表创徏一个查看器jspQ加viewer标签的就行了?/font>
注意q个jsp的页面编码设|ؓUTF-8.
? 参数所需包跟相关对象
1. 需要的javacd?nbsp;
com.crystaldecisions.sdk.occa.report.data.*
com.crystaldecisions.reports.sdk.DataDefController
2. 创徏一个存储参数字D늚 Fields 对象?参数对象都是攑֜q个里面Q通过Fields对象可以d、删除和查找参数对象
Fields fields = new Fields();
3. ParameterField 参数字段对象?
ParameterField paramField1 = new ParameterField();
4. 为想讄的每个参数字D创Z?Values 对象。Values对象是用来存储ParameterFieldDiscreteValue 对象?ParameterFieldRangeValue 对象
Values newVals1 = new Values();
5. L值对象ParameterFieldDiscreteValue 对象
ParameterFieldDiscreteValue newDiscVal1 = new ParameterFieldDiscreteValue();
ParameterFieldDiscreteValue[ ] newDiscVals = new ParameterFieldDiscreteValue[ ];
范围值对象ParameterFieldRangeValue 对象
ParameterFieldRangeValue newRangeVal1 = new ParameterFieldRangeValue();
ParameterFieldRangeValue[ ] newRangeVals = new ParameterFieldRangeValue[ ];
他们的大概关p:一个FieldsQ》多个ParameterField
一个ParameterFieldQ》一个Values
一个ValuesQ》多个ParameterFieldDiscreteValue 或ParameterFieldRangeValue
? 后台讄参数
1. 参数的管理都是通过 报表DataDefController 来控制的?/strong>
DataDefController dataDefController Q?new DataDefController();
对于L?dataDefController = reportClientDoc.getDataDefController();
对于子报?/p>
dataDefController = clientDoc.getSubreportController().getSubreport(reportName).getDataDefController();
2. 参数的设|信息是通过 IDataDefinition 来获取的?/strong>
IDataDefinition dataDefinition = dataDefController.getDataDefinition();
?Fields fields = dataDefController.getDataDefinition().getParameterFields() ;
而对参数的设|改动是通过 ParameterFieldController 来控制的
ParameterFieldController paramfieldcontroller= dataDefController.getParameterFieldController( );
? l主报表参数字段讄单个?/p>
paramFieldController.setCurrentValue("", "StringParam", new String("Hello")); //字符串类?br />
paramFieldController.setCurrentValue("", "BooleanParam", new Boolean(true)); //布尔cd
paramFieldController.setCurrentValue("", "CurrencyParam", new Double(123.45));//货币cd
paramFieldController.setCurrentValue("", "NumberParam", new Integer(123)); //数字cd
l某个参数字D设|多个离散?/p>
Object [] multiVals = {"String1", "String2", "String3"}; //注意要对应参数字D늚cd
paramFieldController.setCurrentValues("", "StringMultiParam", multiVals);
3. 取得Fields
Fields fields = dataDefController.getDataDefinition().getParameterFields() ;
4. 对已l徏立的参数字段Q通过Fields的在知道名字的情况下通过FindҎ取得
ParameterField paramField = (ParameterField)dataDefController.getDataDefinition().getParameterFields().findField(parameterName, FieldDisplayNameType.fieldName, Locale.getDefault());
参数字段七个基本cd
布尔(Boolean) 、货?Double)、数?Integer)、字W串(String)、日期、日期时间、时?Date)
参数的值必跟参数的类型符合才?
5. 如果是新建的参数字段Q那必需讄参数字段的报表名U设|ؓ与参数关联的报表名称。如果参数字D는于主报表Q则使用I白字符?("")。?setReportName Ҏ讄报表名称?/strong>
paramField1.setName("Country"); //讄名字
paramField1.setReportName(""); //如果?" "是用于L?如果子报表,要设|字报表?/p>
如果是已l在rpt中存在的参数Q就不用讄名字和报表名UCQ也不用d到Fields中?/strong>
newDiscVal1.setValue("China"); //讄L|后面添加到参数值列表中
newDiscVal1.setDescription("The country is China.");//q个要不要都没关p?/p>
参数字D值添加到 Values 集合对象?nbsp;
newVals1.add(newDiscVal1); //可以d多个
为参数字D设|?Values 集合?/p>
pfield1.setCurrentValues(vals1);
?Fields 对象d每个参数字段?Fields 对象现在可用于查看器
fields.add(pfield1); //非新建参C?/p>
下面是重点啦。虽然很单,但是折磨了我三天
6. 改动查看报表JSP面的参数字D늦散值列表或范围值列?/strong>
先用取得paramField对象Q这个前面有说怎么取得Q这里不多说?/p>
要添加的L?/p>
ParameterFieldDiscreteValue newDiscValue = new ParameterFieldDiscreteValue();
newDiscValue.setValue(newValue);
取得原来的Values集合Q在把Values集合克隆C个新的Values集合。我原来是用paramField.getValues()Q不知道是JRC中出错还是什么,q个Ҏ竟然完全没用QparamField.getDefaultValues().才能真正的取得参数对象的Values集合
Values newVals = (Values)paramField.getDefaultValues().clone(true);
在原来的Lg再添加多个离散?/p>
newVals.add(newDiscValue);
为参数字D设|新的Values集合。这里原来是用paramField.setCurrentValues(newVals)Q也是不行,要用下面?nbsp; paramField.setDefaultValues(newVals);
paramField.setDefaultValues(newVals);
7. 用用户提示Q自动用设|的参数字段倹{这在以下情况中特别有用Q所讄的参数字D值对于用户ؓ未知Q例如系l生成的参数Q?/strong>
通过boolean multiValue = paramField.getAllowMultiValue();判断报表是否允许多倹{?br />
不允许多值的情况下:
clientDoc.getDataDefController().getParameterFieldController().setCurrentValue(reportName, parameterName , newValue);
如果是用于主报表,reportName? ",否则为子报表名称?/p>
允许多值的情况下:
①如果不考虑原来的离散值列?/p>
String[] newValues = new String[]{"China","USA",..........};
clientDoc.getDataDefController().getParameterFieldController().setCurrentValues(reportName, parameterName ,newValues);
②在原来L值列表的基础上添加新的离散|q设|?/p>
DataDefController dataDefController = null;
if(reportName.equals(""))
dataDefController = clientDoc.getDataDefController();
else
dataDefController = clientDoc.getSubreportController().getSubreport (reportName).getDataDefController();
ParameterField paramField = (ParameterField)dataDefController.getDataDefinition().getParameterFields().findField(parameterName, FieldDisplayNameType.fieldName, Locale.getDefault());
ParameterFieldDiscreteValue newDiscValue = new ParameterFieldDiscreteValue();
newDiscValue.setValue(newValue);
Values newVals = (Values)paramField.getDefaultValues().clone(true);
newVals.add(newDiscValue);
clientDoc.getDataDefController().getParameterFieldController().setCurrentValue(reportName, parameterName ,newVals);
查看器的讄
crystalReportPageViewer.setParameterFields(fields);//q个感觉用不用都没关p?/p>
crystalReportPageViewer.setEnableParameterPrompt(false);
报表的参数设|好后,则调用查看器的刷新方法以应用新的参数?/p>
if(session.getAttribute("refresh")==null){
crystalReportPageViewer.refresh();
session.setAttribute("refresh","true");
}
调用 processHttpRequest Ҏ以在当前的浏览器H口中启动此查看器?nbsp;
crystalReportPageViewer.processHttpRequest(request, response, getServletConfig().getServletContext(), null);
注意不要在查看器里面讄h按钮Q一按就会丢失参数设|。页面编码UTF-8。如果不行就tomcat profectQ》reload this context
<%@ taglib uri="/crystal
<crviewer:viewer viewerName="CrystalViewer" reportSourceType="reportingComponent" >
此标记指定要昄的报表以及要用于~存报表源的会话变量?/p>
? 自定义报表源?/strong>
1. 一个指向查看器标记库描q符文g的引用添加到 JSP 面的顶部?同时必须保相应?JAR 文g和附加支持文仉存在?
<%@ import="com.crystaldecisions.reports.sdk.ReportClientDocument">
<%@ taglib uri="/crystal-t ags-r eportviewer.tld" prefix="crviewer" %>
注意Q?nbsp; 可以?prefix 属性指定Q何名U。prefix 定要用什么标记前~来访问标记库的标记?/font>
2. 创徏报表源,讄报表源的属性,把报表源~存于session变量中(必需的)
<%
final String reportName="rpt/Sample.rpt";
ReportClientDocument crDoc = new ReportClientDocument();
crDoc.open(reportName,0);
crDoc.getDatabaseController().logon("sa","");
session.setAttribute("reportSource",crDoc.getReportSource());
%>
注意Q如果viewer标记的reportSourceVar属性的默认值是crystalReportSourceQ如果用q个做session变量的名Uͼ那可以不用设|reportSourceVar?/font>
3. 创徏一个开?viewer 标记?在此标记中,指定查看器名U和报表源的cd?
<crviewer:viewer viewerName="CrystalViewer" reportSourceType="pageServer" reportSourceVar="reportSource">
4. l束 viewer 标记?JSP 面现在卛_查看名ؓ Sample的报表?/font>
</crviewer:viewer>

]]>
首先Q应该就是要建立一个实体类了?/p>
我这里用一个OrderItems.java做例子,代码
如果你还没徏好报表,新徏一个报表如Report.rptQƈ打开q个报表
在项目资源管理器中,点击OrderItems.java前面? Q发不了囄Q,可以看到 “l点 OrderItems”Q就是这个了Q右击-》crystal reportsQ》添加到当前crystal报表。或者你可以直接?#8220;l点 OrderItems”拉到报表?/p>
q样OrderItems在报表的数据中了,在报表数据中再添加一个数据库表,如productsQproduct_idQproduct_name,product_price,....,Q?/p>
如果没出什么问题,那Report.rpt报表数据中有了OrderItems表和products表,左键按紧OrderItems表的idQ把他拉到products表的products_id上,你可以发C们中间有条线?/p>
q样OrderItems.idpproducts.products_id兌h了。中间的UK认属性是{于Q你也可以改成其他的?/p>
叛_ Report.rptQ》Crystal ReportsQ》创建查看器JSP—》选择查看器API代码插入Q》选中 使用POJO填充报表、连接Crystal报表面查看器-》确?/p>
一个新的Report-viewer.jsp面出来了。不q现在很不能用,你要E微改下里面的一丁点东西才行?/p>
注意:Report-viewer.jsp中用到JRCHelperSamplec,q个在(一Q中建立的CR目中有Q是非常非常好的工具c,没事把它拷C的项目下吧,有很多地方要用到q个cR这个类在包com.businessobjects.samples里面
你可以用OrderItems的构造函数添加数据集,你可以用到很多方法来ddataSet数据集的Q只要添加的是准有效的OrderItems实体对象p?/p>
注意要把里面?* */q些L
启动tomcatQ运行Report-viewer.jsp?/p>
q里是我做的单用sql语句qo数据的例子?/p>
目q是用?├锩娴膖omcat目?/p>
Z个实现这个功能的c?/p>
JRC_ResultSet_DataSource.java
q里要注意数据库查询l果集的字段数目要跟报表里面的字D|目一Pcd也要一P不然׃出错?/p>
sql语句中的表的名字要完_如数据库?dbo.数据库表Q最好做个别?/p>
昄面
Result_viewer.jsp
注意上面几点应该没问题?/p>
PSQSnippets视图最下面有Crystal reports的一些实用代码段
CR查看器标记、打开q查询报表、打开报表、查看报表、查看报表ƈ讄数据库登录、将报表导出为pdf、将报表导出为rtf {的代码D,单易?/p>
q篇文章教你如何自己写代码来享受水晶报表?/p>
report_source.jsp
上面的可以封装到javabean里面
讄数据库的登陆用户,如果览q个报表的用户需要设|不同的权限的话,那就需要设|上面这个了
CrystalReportViewer.jsp
W二U方法直接用一个页?/p>
CrystalReportViewer.jsp
个h感觉W一U方法好,报表源跟昄分开,安全,重用方便
新徏一?Crystal reports web目
在Target runtime选择apache tomcat v5.5
下一步中crystal reports java reporting component、dynamic web module、java是默认选中的,q三个是必需的,你也可添加strutsQ后面的讄会要求你dstruts的类库。在最后面默认加入CZ的数据库和报表?/p>
q样一个Crystal Reports web目徏立了Q上面的步骤应该是地球h都可以完成吧Q?/p>
在里面有个CrystalReport1.rpt和CrystalReport_viewer.jsp
右键CrystalReport_viewer.jspQ?gt;q行方式->Run on Server,点击完成?/p>
你应该就可以看到一个空的水晶报表了吧(Z么空的,当然啦,CrystalReport1.rpt本n是空的)
在看看sample reports文g多w面,?个示例的.rpt报表文gQ右d中Q何一个,选中Crystal ReportsQ》创建查看器JSPQ就会创Z?Qviewer.jsp文g。运行这个文Ӟ你应该可以看C个水晶报表了吧?/p>
我想q对大部分h应该都是没有问题的,剩下的事情就是好好分析这个项目里面所有的东东?/p>
-------------------------------------------------------------------------------------------------------------------------------------------------------
上面什么东西是在Q何项目中实现都必ȝ?为此我特意徏立一个新的tomcat目,最好徏一个简单的jsp面试下你的tomcat目是否可以正常q行.
通过本h的实?在其他项目中JSPq行水晶报表的话,需要的cL件跟配置.
1. d一个用户库?CrystalReports Libraries,把下面的*.jardq去
commons-collections-3.1.jar,commons-configuration-1.2.jar,
commons-lang-2.1.jar,
commons-logging.jar,
Concurrent.jar,
CrystalCharting.jar
CrystalCommon.jar
CrystalContentModels.jar
CrystalDatabaseConnectors.jar
CrystalExporters.jar
CrystalExportingBase.jar
CrystalFormulas.jar
CrystalQueryEngine.jar
CrystalReportEngine.jar
CrystalReportingCommon.jar
derby.jar
icu4j.jar
jrcadapter.jar
jrcerom.jar
keycodeDecoder.jar
log4j.jar
MetafileRenderer.jar
msbase.jar
mssqlserver.jar
msutil.jar
rasapp.jar
rascore.jar
ReportPrinter.jar
rpoifs.jar
serialization.jar
URIUtil.jar
webreporting.jar
webreporting-jsf.jar
xercesImpl.jar
xml-apis.jar
Xtreme.jar
(d36个jar,里面有一些在其他的库已经有的?在项目中dq个自定义库p?
2. 把上个例子中的crystalreportviewers文gҎ在WEB-INF文g夹同一目录下。这个就是你能看到水晶报表的基本框架Q相当于.net里面的水晶报表控件了的源代码了?/p>
3. 把crystal-tags-reportviewer.tld攑֜WEB-INF?主要标签
4. web.xml ?lt;web-app>中间dQ主要是dcrystalreportviewers
5. 把CRConfig.xml攑֜src文g夹下,水晶报表的配|文?如果你有注册,注册码也会在q文仉?/p>
CRConfig.xml
利用 感觉像在?net里面的水晶报表控件一?不只viewer,qpartviewer也可以的.CRConfig.xml
文g中设|?
<%@ taglib uri="/crystal-tags-reportviewer.tld" prefix="crviewer" %>
<crviewer:viewer reportSourceType="reportingComponent" viewerName="rcname-viewer" reportSourceVar="rcname" isOwnPage="true">
<crviewer:report reportName="rcname.rpt" />
</crviewer:viewer>
]]>