首页 > Python基础教程 >
-
ASP.net教程之B/S FastReprot使用
FastReport 交流群
554714044
前言
由于公司开发新产品,前后端分离.netcore +Angular ,之前C/S项目一直使用FastReport ,考虑到员工切换比较困难,而且最最重要的是BS版少了很多内容,例如合计,函数最常用的功能都没有,所以B/S端打印控件继续沿用C/S模式。
一、逻辑视图
二、具体实现
1.Winform设计
如上图所示,这里做了一个打印模板与数据源的管理。在这里可以指定具体页面要调什么后端接口,打印什么数据,打印格式设计。全部WinForm实现。将数据源与打印格式模板存储到数据库。后端直接调取即可。
优点:1.与之前WinForm版无缝对接,开发人员不用学习即可使用。
2.做到数据源与打印格式集中化管理,而且可以根据客户需求,实施人员自己调整添加打印格式,不需要开发程序。
3.数据源多样化,可以根据特殊需求,自己拼接sql,也可以直接查询数据库表。满足客户多样化,个性化需求。
4.可以根据具体单据ID,调试打印格式。
缺点:WinForm 没有做成网络版,此设计器只能在服务器端(内网)使用。(本来设计就是要服务器设计,下面的人员用不到,缺点还可以接受
)
以下是部分代码
2.MVC端
为了将打印格式发布出去,这里特意做了一个mvc的程序,放在前端与后端之间,作为桥梁。
因为客户端只需要预览和打印,所以这里我只做了一个预览+打印的接口。设计在WinForm端处理,这里不需要。
以下是Preview的代码实现。
其中以下几点是我做了特殊化的设置
webReport.ToolbarStyle = ToolbarStyle.Small; //将原先的图标变小(太大太难看了)
webReport.ToolbarIconsStyle = ToolbarIconsStyle.Blue;
webReport.ToolbarBackgroundStyle = ToolbarBackgroundStyle.Custom;
(下拉菜单的汉化还没有找到,需要研究一下。)
webReport.PreviewMode = true;//预览模式
webReport.PrintInPdf = true;//在PDF打印
这里就是对接前端的打印接口。前端只需要调取我发布的网址,并且把我需要的参数(数据ID,打印模板ID,token传送给我即可。)
3.后端
后端接口主要是实现根据MVC端传送过来的打印模板ID,将数据源和模板传送给MVC端。由MVC端进行拼接组装。
主要代码如下:
1 public List<ReportDataSource> GetDataSource(ReportModel entitydto) 2 { 3 try 4 { 5 List<ReportDataSource> lst = new List<ReportDataSource>(); 6 IDBTransAccess sqlTrans = TransSysUtils.GetDBTransAccess(); 7 try 8 { 9 sqlTrans.OpenTrans(); 10 11 lst = this.GetDataSource(entitydto, sqlTrans); 12 13 14 sqlTrans.CommitTrans(); 15 return lst; 16 } 17 catch (Exception TE) 18 { 19 sqlTrans.RollbackTrans(); 20 throw TE; 21 } 22 } 23 catch (BaseException) 24 { 25 throw; 26 } 27 catch (Exception E) 28 { 29 throw new BaseException(E.Message); 30 } 31 } 32 33 34 public List<ReportDataSource> GetDataSource(ReportModel entitydto, IDBTransAccess sqlTrans) 35 { 36 try 37 { 38 List<ReportDataSource> lst = ReportRun(entitydto.ReportID, new string[] { "DID","DMainID" }, new string[] { entitydto.DataID,entitydto.DataID }, sqlTrans); 39 40 return lst; 41 42 } 43 catch (BaseException) 44 { 45 throw; 46 } 47 catch (Exception E) 48 { 49 throw new BaseException(E.Message); 50 } 51 } 52 53 54 55 56 57 58 59 60 61 #endregion 62 63 64 public List<ReportDataSource> ReportRun(string reportID, string[] queryName, string[] queryValue, IDBTransAccess sqlTrans) 65 { 66 List<ReportDataSource> lst = new List<ReportDataSource>(); 67 string sql = "Select * from Data_SReportManageDts where DMainID=" + SysString.ToDBString(reportID); 68 DataTable dtSource = sqlTrans.Fill(sql); 69 if (dtSource.Rows.Count > 0) 70 { 71 foreach (DataRow dr in dtSource.Rows) 72 { 73 bool findSource = false; 74 string conditionStr = string.Empty; 75 if (SysConvert.ToInt32(dr["SqlFlag"]) == 0) 76 { 77 string[] tempA = dr["QueryName"].ToString().Split(' '); 78 for (int q = 0; q < queryName.Length; q++) 79 { 80 for (int fi = 0; fi < tempA.Length; fi++) 81 { 82 if (queryName[q].ToString().ToUpper() == tempA[fi].ToUpper()) 83 { 84 if (conditionStr != string.Empty) 85 { 86 conditionStr += " AND "; 87 } 88 conditionStr += queryName[q].ToString() + "=" + SysString.ToDBString(queryValue[q]); 89 findSource = true; 90 break; 91 } 92 } 93 94 } 95 } 96 else 97 { 98 conditionStr = SysConvert.ToString(dr["QueryName"]).ToUpper(); 99 for (int i = 0; i < queryName.Length; i++) 100 { 101 string queryStr = "{" + queryName[i].ToUpper() + "}"; 102 103 conditionStr = conditionStr.Replace(queryStr, SysString.ToDBString(queryValue[i])); 104 } 105 if (conditionStr.Contains("{") || conditionStr.Contains("}")) 106 { 107 findSource = false; 108 } 109 else 110 { 111 findSource = true; 112 } 113 } 114 if (findSource) 115 { 116 117 if (SysConvert.ToInt32(dr["SqlFlag"]) == 0) 118 { 119 120 sql = "select * from (" + dr["SqlStr"].ToString() + ") a where " + conditionStr; 121 } 122 else 123 { 124 125 sql = dr["SqlStr"].ToString() + " " + conditionStr; 126 } 127 DataTable dt = sqlTrans.Fill(sql); 128 129 ReportDataSource source = new ReportDataSource(); 130 source.dtsource = dt; 131 source.TBName = dr["SqlName"].ToString(); 132 lst.Add(source); 133 134 135 } 136 else 137 { 138 if (dr["SqlStr"].ToString() != string.Empty) 139 { 140 sql = dr["SqlStr"].ToString(); 141 DataTable dt = sqlTrans.Fill(sql); 142 143 ReportDataSource source = new ReportDataSource(); 144 source.dtsource = dt; 145 source.TBName = dr["SqlName"].ToString(); 146 lst.Add(source); 147 148 } 149 } 150 } 151 } 152 153 return lst; 154 }