1.先点VB许可注册MSFLEXGRID这个控件,然后再解压baobiao这个文件。
2.打开baobiao项目,将计算机名改为本机计算机名,就可以运行项目
3.在全局脚本里建立起与数据库的连接,通过定时整点触发脚本,把变量写到数据库。WINCC里全局脚本触发定时器设定是每小时整点触发。
4.在月,年,班月,班年报表画面属性里,定义了打开画面执行的VB程序,用于显示选择年月日,以及画面其他显示,比如记录的条数,系统时间
5.在主画面,第一次运行时要按“添加数据库”按钮,这样就在SQL2005里建立baobiao1数据库,打开SQL Server Management Studio,点Connect,在Databases目录下可以看到baobiao1数据库文件,在tables下面有建立好的ribao表,打开表,在Columns里可以看到在WINCC里建立的变量。如果不需要做报表记录,点“分离数据库”旋钮。
6.在日报表中,显示的列数为8列,编号0-7,显示的行数为oRs.Recordcount+6,也就是查询到的记录数+6,第一行用来显示报表标题,第二行显示“编号”,“日期”,一直到“速度”。
从第三行开始显示查询到的记录,包括记录的编号,记录时间,记录值。oRs.Recordcount+3行显示最大值,oRs.Recordcount+4行显示最小值,oRs.Recordcount+5显示平均值,oRs.Recordcount+2用来显示查到的每个记录总和,程序里注释掉了,就没显示。
7.统计查询记录最大值,最小值,平均值是在SQL数据库里完成的,通过max,min,avg函数完成的
8. 将第一行8列合为一列
MSFlexGrid1.Row = 0’选中第一行。注意第一行,或者是第一列都从0开始
For z = 0 To 7
MSFlexGrid1.Col = z
MSFlexGrid1.Text = “R980履带式布料机日报表"通过FOR,NEXT操作,将8列内容都显示为"R980履带式布料机日报表”
Next
MSFlexGrid1.MergeCells = 4设置一个值4表明如何及何时将有相同内容的记录进行合并
MSFlexGrid1.MergeRow(0) = True设置将0行内容合并
9. MSFlexGrid1.Rows = oRs.RecordCount + 6’显示的行数为查询到数据数目+6
MSFlexGrid1.ColWidth(0) = 800’第一列宽度
MSFlexGrid1.ColWidth(1) = 2100’第二列宽度
MSFlexGrid1.ColWidth(2) = 1000’第三列宽度
MSFlexGrid1.ColWidth(3) = 1000’第四列宽度
MSFlexGrid1.ColWidth(4) = 1000’第五列宽度
MSFlexGrid1.ColWidth(5) = 1000’第六列宽度
MSFlexGrid1.ColWidth(6) = 1000’第七列宽度
MSFlexGrid1.ColWidth(7) = 1000’第八列宽度
MSFlexGrid1.TextMatrix(1, 0) = "编号"设置某个选定行,列的单元的文本内容
MSFlexGrid1.ColAlignment(0) = 4设置当前列的对齐方式
MSFlexGrid1.ColAlignment(1) = 4
MSFlexGrid1.ColAlignment(2) = 4
MSFlexGrid1.ColAlignment(3) = 4
MSFlexGrid1.ColAlignment(4) = 4
MSFlexGrid1.ColAlignment(5) = 4
MSFlexGrid1.ColAlignment(6) = 4
MSFlexGrid1.ColAlignment(7) = 4设置当前列的对齐方式
For i = 1 To oRs.RecordCount第一列显示每条记录编号
MSFlexGrid1.TextMatrix(i + 1, 0) = i
Next
10. Sql = “SELECT CONVERT(char(19), riqi, 20) AS riqi, yali, wendu, liuliang, zhongliang, dianya, sudu FROM ribao WHERE riqi BETWEEN '” & BeginDate & “’ and’” & EndDate & “'ORDER BY riqi” SELECT CONVERT(char(19), riqi, 20) AS riqi,其中CONVERT(CHAR(19), CURRENT_TIMESTAMP, 20)为定义的显示日期格式,如2006-02-22 16:26:08。按照起始,结束时间查询记录。Select From,为查询语句标准格式,FROM后面是表名,本例表名为ribao
sql1 = “select avg(yali)as ylp,avg(wendu)as wdp,avg(liuliang)as llp,avg(zhongliang)as zlp,avg(dianya)as dyp,avg(sudu)as sdp,min(yali)as ylx,min(wendu)as wdx,min(liuliang)As llx,min(zhongliang)As zlx,min(dianya)As dyx,min(sudu)As sdx,max(yali)As yld,max(wendu)As wdd,max(liuliang)As lld,max(zhongliang)As zld,max(dianya)As dyd,max(sudu)As sdd from ribao where riqi between '” & BeginDate & “’ and’” & EndDate & "'"数据库支持SQL查询语言,用函数AVG,MIN,MAX对列求平均,最小,最大值。
11.从WINCC访问sql2005数据库步骤:
1) 创建一个到数据库的 ADO 连接
2) 打开数据库连接
3) 创建ADO记录集
4) 从记录集提取你想要的数据,在表格显示出来
5) 关闭记录集
6) 关闭连接
ADO有三个主要对象,connection,Recordset,Command,通过这三个对象完成对数据库操作
strcn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog=baobiao1;Data Source=.\wincc"创建一个ADO连接,连接运行数据库baobiao1
Set conn = CreateObject(“ADODB.Connection”)创建ADO连接对象,对数据库操作
conn.ConnectionString = strcn
conn.CursorLocation = 3
conn.Open 打开数据库连接
Set oRs = CreateObject(“ADODB.Recordset”)读取数据库的数据,那么其中的数据必须首先被载入一个记录集中。ADO连接创立后,就可以创建一个ADO记录集了。
Set oCom = CreateObject("ADODB.Command")创建一个ADO.Command对象。该查询用于取回数据,此数据将以一个 RecordSet 对象返回。这意味着被取回的数据能够被 RecordSet 对象的属性、集合、方法或事件进行操作
oCom.CommandType = 1返回一个 Command 对象的类型
Set oCom.ActiveConnection = conn返回包含了定义连接或 Connection 对象的字符串。
oCom.CommandText = Sql设置或返回包含提供者(provider)命令的字符串
Set oRs = oCom.Execute Execute 是方法,执行 CommandText 属性定义的Sq1定义查询、SQL 语句或存储过程,是按时间条件查询到的riqi,yali,wendu, liuliang, zhongliang, dianya, sudu记录值
n = oRs.RecordCount’查询到的记录数目
Text2.Text = n
Set oCom1 = CreateObject(“ADODB.Command”)
oCom1.CommandType = 1’ors1是记录平均,最小,最大值
Set oCom1.ActiveConnection = conn
oCom1.CommandText = sql1
Set oRs1 = oCom1.Execute执行 CommandText 属性定义的Sq11定义查询、SQL 语句或存储过程,是按时间条件查询到的riqi,yali,wendu, liuliang, zhongliang, dianya, sudu的各个最大,最小,平均值记录值
n1 = oRs1.RecordCount n1为1,
ylp = oRs1(“ylp”): wdp = oRs1(“wdp”): llp = oRs1(“llp”): ylx = oRs1(“ylx”): wdx = oRs1(“wdx”): llx = oRs1(“llx”): yld = oRs1(“yld”): wdd = oRs1(“wdd”): lld = oRs1(“lld”)
zlp = oRs1(“zlp”): dyp = oRs1(“dyp”): sdp = oRs1(“sdp”): zlx = oRs1(“zlx”): dyx = oRs1(“dyx”): sdx = oRs1(“sdx”): zld = oRs1(“zld”): dyd = oRs1(“dyd”): sdd = oRs1(“sdd”)
oRs.Requery Requery的作用是:通过重新执行对象所基于的查询语句,更新Recordset[记录集]对象中的数据。
提示:适用这个方法可以刷新记录集的所有内容。
Do While Not oRs.EOF
'n = n + 1这句我给删掉了,程序可以运行
ylp = Int(ylp * 10 ^ 3 + 0.5) / (10 ^ 3)
wdp = Int(wdp * 10 ^ 3 + 0.5) / (10 ^ 3)
llp = Int(llp * 10 ^ 3 + 0.5) / (10 ^ 3)
zlp = Int(zlp * 10 ^ 3 + 0.5) / (10 ^ 3)
dyp = Int(dyp * 10 ^ 3 + 0.5) / (10 ^ 3)
sdp = Int(sdp * 10 ^ 3 + 0.5) / (10 ^ 3)
a1 = CStr(oRs.Fields(1).Value)取第一条记录的值。ADO Field 对象包含有关 Recordset 对象中某一列的信息。Recordset 中的每一列对应一个 Field 对象
b1 = CStr(oRs.Fields(2).Value)
c1 = CStr(oRs.Fields(3).Value)
d1 = CStr(oRs.Fields(4).Value)
e1 = CStr(oRs.Fields(5).Value)
f1 = CStr(oRs.Fields(6).Value)
a1 = Int(a1 * 10 ^ 3 + 0.5) / (10 ^ 3)
b1 = Int(b1 * 10 ^ 3 + 0.5) / (10 ^ 3)
c1 = Int(c1 * 10 ^ 3 + 0.5) / (10 ^ 3)
d1 = Int(d1 * 10 ^ 3 + 0.5) / (10 ^ 3)
e1 = Int(e1 * 10 ^ 3 + 0.5) / (10 ^ 3)
f1 = Int(f1 * 10 ^ 3 + 0.5) / (10 ^ 3)
MSFlexGrid1.TextMatrix(i + 1, 2) = a1’第三行开始显示第一条记录值
MSFlexGrid1.TextMatrix(i + 1, 3) = b1
MSFlexGrid1.TextMatrix(i + 1, 4) = c1
MSFlexGrid1.TextMatrix(i + 1, 5) = d1
MSFlexGrid1.TextMatrix(i + 1, 6) = e1
MSFlexGrid1.TextMatrix(i + 1, 7) = f1
oRs.MoveNext
Loop
oRs.close’这是后加的,退出程序前,关闭与数据库,记录集的连接
ors1.close’这是后加的
conn.close’这是后加的
注意,所有报表源码执行完,最后都添加关掉连接的代码,即
oRs.close
ors1.close
conn.close