9.3.上报汇总模版
硕正报表从1.0.99.0开始,支持上报汇总模式(在线演示第八部分 “报表上传汇总”)的移动端实现了,这意味着在手机上也能输入了,且数据格式和PC端无差别、上报的后端接收程序也完全通用.9.3.1 模版分析
包中的模版文件是 template_upload.txt:<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=<!--SUPCAN_REPORT_MAXWidth-->, initial-scale=1, minimum-scale=0.5"> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script src="../uploadxml.js"></script> <script> var SupcanUploadURL = "<!--SUPCAN_REPORT_UploadURL-->"; var SupcanWorksheetName = "<!--SUPCAN_REPORT_WorkSheetName-->"; <!--SUPCAN_REPORT_JS--> </script> <style> <!--SUPCAN_REPORT_STYLE prefix="dx"--> input{ width: 95%; margin: 1; padding: 0; } select{ width: 95%; margin: 1; padding: 0; } </style> </head> <body> <!--SUPCAN_REPORT_dMain--> <div style="text-align:center"> <input type="button" id="idok" value=" 提交 " style="width:100px; height:28px"> </div> </body> </html>可见,模版是基于 HTML5、借助 jquery 实现的.
9.3.2 uploadxml.js分析
... //按钮事件: ajax 上报 XML 数据 $("#idok").click(function() { var xml = Supcan_genXML(); $.ajax({url: SupcanUploadURL, data: xml, type: 'POST', contentType: "text/xml", dataType: "text", success : function(data) { if(data == "") alert("申请成功! "); else { //验证未通过 var cellname = ""; var index = data.indexOf(":"); if(index != -1) { cellname = data.substr(0, index); data = data.substring(index + 1); } alert(data); //焦点定位 if(cellname != null) $("[cellname='" +cellname+ "']").focus().select(); } }, error : function(xhr, ajaxOptions, thrownError) { alert("提交失败: " + thrownError + "状态码: " + xhr.status); } }); });...这是点击 “提交” 触发的事件,这个部分源码类似于PC端开发中的 GetUploadXML 函数功能。
9.3.3 C#源码分析
在此分析 up.aspx 中的2个功能:动态转换功能,和收集上报XML并对其验证的功能。//创建报表服务 ... //生成临时文件,同时删除1小时前的垃圾文件 String TempFilename = dll.func("CacheDirUtility", "isCreateTempFile=true;ext=htm; DeleteEarlierFile=1h"); //指定模版文件, 它位于当前目录下 String TemplateFilename = Server.MapPath("template_upload.txt"); //规定 uploadURL 参数: html 的 ajax 上传数据的URL,它将替换模版中的 <!--SUPCAN_REPORT_UploadURL--> 占位符 String uploadURL = BaseDir + "dotnet/up.aspx?func=33&uid=" +uid; //打开报表 dll.func("build", "report/uploadmobile.xml"); //转换 dll.func("callfunc", "105\r\n type=htm; Template=" +TemplateFilename+ "; uploadURL=" + uploadURL + "; filename=" + TempFilename); ...
//打开报表 dll.func("build", "report/uploadmobile.xml"); //分支:功能号33,请求验证 if(pageFunc == "33") { //取得 ajax 上传的 XML 串,它位于 http body 中 Stream postData = Request.InputStream; StreamReader sr = new StreamReader(postData); String xml= sr.ReadToEnd(); sr.Close(); //验证 dll.func("RebuildTabOrder", ""); dll.func("SetUploadXML", xml + "\r\n autoCalc=none"); String Err = dll.func("callfunc", "50 \r\n isReport=one"); //验证, 只需要返回一条错误 //关闭报表服务 dll.CloseService(); Response.Write(Err); //写错误信息到 Response, Err为空串表示通过验证 Response.End(); return; }在实际使用中,如果验证通过了,那么下一步通常就是对该XML进行解析,并分离出各个数据将其保存到数据库中。本例略去了这个过程。