花了两天三个晚上,终于把那个本田车间报表系统根据要求进行了升级,虽然花的时间长了一点,但是没办法,技术不够娴熟有限;第一个版本的时候,我负责的主要是报表导出的部分,YOYO负责的数据的是数据导入;
根据客户要求,这次要在之前的月报表上添加两个汇总表,因为YOYO要当志愿者,抽不出时间,所以只能我自己来做了;暑假做完第一版的时候没有进行总结,所以重新回顾也花了小小时间,发现自己的记忆力在慢慢减退,可能进入大学脑子变懒了吧,懒得用脑去记东西了,所以在有些东西忘记之前先把他记下来,免得到要用到的时候想不起来;
感触最深的应该是数据库查询语句,像我们这种经常跟数据打交道的系统这个是非常重要的,如果能够掌握SQL那些查询函数和方法的话,功能实现就容易多了,这也是一个教训,没有认真去了解那些函数的用法,不过还是感谢谷歌百度,遇到不懂得时候,最热心的还是他们,呵呵;升级部分主要用到的语句有下面一些:
string sql1 = "select case when substring(value,2,1)='-' then '0' else substring(value,1,4) end as value from 车间冷量日志 where date='@date' and point=@point order by ptime";
这个是车间冷量月度汇总表获取行数据的SQL语句,上次我们用的‘substring’方法挺不错的,可以对字符型的一些特殊数据进行处理,比如这个substring(value,2,1)='-' then '0',如果字符串里面有‘—’号的话就可以输出‘0’,所以就算是字符型的数据也可以处理一些负数的数据了;在后面的二次泵月度汇总表求最大频率的数据里面,就有负数形式的数据,客户要求是负数的话要要显示为0;所以在这里我也采用了这个方法:
string sql1 = "select case when substring(max(value),2,1)='-' then '0' else substring(max(value),1,6) end from 环境设备运行记录日志 where point='@point' and date='@date'group by date";
当然也可以用if条件语句进行判断,但是那样比不上在数据库直接处理来的快一点,再一个是代码较为简洁,可能是编程思想的问题吧,有时候就是转不过弯来,采用一些比较便捷的函数方法,导致有时候代码比较冗长;看起来很不舒服,这方面要好好训练才行;
string sql31 = "if not exists(select top 1 * from 环境设备运行记录日志 where value like 'ON%' and point='@point' and date='@date' group by date) select 0 else select count(value) from 环境设备运行记录日志 where value like 'ON%' and point='@point' and date='@date' group by date";
这个是我跟志威哥找到的一个方法,就是对那些没有返回值或者数据不存在的地方给他返回0,这样整个表格看起来就比较顺眼,‘select top 1 * from 环境设备运行记录日志’这里用得挺好的,先对所有的数据进行select,再判断,不过有个问题就是好像isnull方法有这个功能,但不知道为什么在这里就是不能使用,疑惑中……(求解)……
sql=sql.Replace("@date", date);
DataTable tmp = sqlhelper.ExecuteSelectSQL(sql);
dr[1] = tmp.Rows[0][0];
dr[2] = tmp.Rows[0][1];
这个是获取行数据的一个方法,数据类型是DataTable型的,不过后来根据需要,改成了string型的,貌似那样更灵活一点,因为数据可以进行条件的判断与限制,制作表格更容易一些,如下:
string tmp = getCount(sql1, point[0], date);
dr[1] = tmp;
tmp = getCount(sql1, point[1], date);
dr[3] = tmp;
下面是动态添加表头,这样让查询出来的数据更直观:
DataTable dt = new DataTable();
dt.Columns.Add("时间",System.Type.GetType("System.String"));
dt.Columns.Add("日最低温度(℃)", System.Type.GetType("System.String"));
dt.Columns.Add("日最高温度(℃)", System.Type.GetType("System.String"));
dt.Columns.Add("日最低湿度(﹪)", System.Type.GetType("System.String"));
dt.Columns.Add("日最高湿度(﹪)", System.Type.GetType("System.String"));
根据所选择的开始时间和结束时间往DataTable里面添加数据:
DateTime sdt = Convert.ToDateTime(startdate);
DateTime edt = Convert.ToDateTime(enddate);
string s;
string e;
while (sdt <= edt)
{
s = sdt.ToString("yyyy-MM-dd");
dt.Rows.Add(toSQL.getTwobengRow(s, dt));
sdt = sdt.AddDays(1);
}
这个是非常重要的,因为整个系统除了数据之外,就剩下时间和日期了,如果不能很好的进行时间的判断与选择,就不能根据要求对所需要的数据进行查询和导出;
接下来是报表导出的部分,这部分之前主要是我负责,因为时间问题,这次添加的两个月报表我还是采用暑假“日报表”的那个方法,日报表包含八个车间的数据,客户要求是把这八个表同时放在一个Excel文件的八个Sheet表里,每个Sheet表存一个车间的数据;因为数据较多,表格形式也算是复杂一点的了,之前想用水晶报表去做,后来发现模板不容易做,再后来,发现直接对Excel进行操作简单多了,因为客户要导出的就是Excel文件,所以就选用Excel文件当模板了;
虽然这样说,但是他们要求的一个Excel文件里有八个表格,如果以那种形式的文件为模板进行读写Excel操作的话只能导入第一个Sheet表,其他的Sheet表不能写入,这个当然是能力问题啦,也不知道技术支不支持的,最终问题还是解决了,解决方法是用只有一个Sheet表的八个Excel文件,每个车间的数据导入一个Excel文件,最后再把其他的7个Excel文件里面的Sheet表一个个复制到第一个Excel文件中:
DataTable dt1 = ds.Tables[0].Copy(); if (dt1 == null) return;
string fileName1 = dr+"//ExcelTemp//file0.xls";
int colFirst1 = 4; int rowFirst1 = 3;
string modelfile1 = dr+"//报表模板//daymodel1.xls";
excelhelper.outReport(dt1, fileName1, modelfile1, colFirst1, rowFirst1,content ,col);
DataTable dt2 = ds.Tables[1].Copy(); if (dt2 == null) return;
string fileName2 = dr+"//ExcelTemp//file1.xls";
int colFirst2 = 4; int rowFirst2 = 3;
string modelfile2 = dr+"//报表模板//daymodel2.xls";
excelhelper.outReport(dt2, fileName2, modelfile2, colFirst2, rowFirst2,content ,col )
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook workbook1 = excel.Workbooks.Open(dr+"//ExcelTemp//file0.xls",
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
Microsoft.Office.Interop.Excel.Workbook workbook2 = excel.Workbooks.Open(dr+"//ExcelTemp//file1.xls",
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
这部分要注意一个问题,命名空间要引用一些Office的组件,Excel的,而且版本不同代码处理方法有小小变动,之前不知道,所以经常出问题;