通过ChinaExcel.ExportSaveDBData()获取在数据录入模式修改完成之后的文本串(新增、修改或删除的数据内容,是xml格式的),调用官方自带的ReportEngine.SaveCellData(con, StrXmlData)进行增删更新处理。
/** * 保存或修改报表记录的功能 * * @returns {Boolean} */ saveTabData : function() { var strData; strData = ChinaExcel.ExportSaveDBData(); if (strData == "") { alert("没有发现被提交的数据"); return false; } var jsonObject = this.createJosnObject(); jsonObject.StrXmlData = strData; Ext.apply(jsonObject, this.objParameter); $.ajax({ url : ‘RptFrmSave_saveRptFrmToDB‘, type : ‘POST‘, async:false, data : { jsonObject : Ext.encode(jsonObject) }, dataType : ‘json‘, success : function(data) { return sucFn(data,true); }, error : function(XMLHttpRequest, textStatus, errorThrown) { errorFn(XMLHttpRequest, textStatus, errorThrown); } }); }
function sucFn(data,isTip) { if(data.success == "true"){ if(isTip) { ChinaExcel.FormProtect = true; Ext.Msg.alert("提示信息",data.msg,function(){ChinaExcel.FormProtect = false}); } return true; }else{ Ext.Msg.alert("错误信息",data.msg,function(){ChinaExcel.FormProtect = false}); return false; } } function errorFn(XMLHttpRequest, textStatus, errorThrown) { ChinaExcel.FormProtect = true; Ext.Msg.alert("服务器异常信息",textStatus,function(){ChinaExcel.FormProtect = false}); return false; }
action层
/** * 把超级报表控件返回的数据,更新提交到数据库中(单表操作,基本存储方法) * @throws IOException */ public void saveRptFrmToDB() throws IOException { JSONObject jsonObj = JSONObject.fromObject(this.jsonObject); String rslt = tabDataSrv.saveRptFrmToDB(jsonObj.getString("StrXmlData")); saveRtnRslt(rslt); }dao层
/** * 存储更新报表数据到数据库中 * * @param StrXmlData * 【新增、修改或删除的数据】格式为【文本串】 */ public String saveRptFrmToDB(final String StrXmlData) { this.rslt[0] = ""; if (StringUtils.isEmpty(StrXmlData)) { return ""; } this.getSession().doWork(new Work() { @Override public void execute(Connection con) throws SQLException { // TODO Auto-generated method stub int nReturn = ReportEngine.SaveCellData(con, StrXmlData); // System.out.println(StrXmlData); if (nReturn != 0) { System.out.println("你的错误是:" + ReportEngine.GetLastError()); rslt[0] = ReportEngine.GetLastError(); } } }); return this.rslt[0]; }
更新测试
保存测试
当使用官方的ReportEngine.SaveCellData进行数据操作时,会抛出【不支持此游标类型/并发组合 】的错误(仅对sqlserver2005,其他数据库不存在此问题)
上图530行的代码等同于
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
总上,所以sqlserver2005会报错。(出错的根本原因是数据库变化时,结果集不变,查询就查询不到刚刚新增加的数据)
2:在不更改官方源代码的情况下,可以通过设置表自动增长列来解决
3:在不允许更改表结构的情况下,先根据主键新增加记录集,再调用报表函数保存数据(就是做更新操作)。
最终采用方案1解决问题。
下一节将要介绍保存处理(多表保存的设计思路),请期待。
ChinaExcel报表平台搭建(四基本保存-单表),布布扣,bubuko.com
原文:http://blog.csdn.net/soars/article/details/19976699