WinCC 7.0 用户归档+Listview控件 制作报表(二)


查询

  前一篇中我们已经按照需求建立了所需变量的用户归档,这样WINCC会自动将这些变量按照设定的存储规则存放到SQL数据库中。而对历史数据进行查询,就是对SQL数据库正确操作以导出我们需要的数据。通过VBS语言对按钮对象编辑一个脚本程序就可以方便地实现此功能,这里我们给“查询”按钮的事件属性——“鼠标动作”中添加VBS脚本。

1、定义连接字符串
  我们是可以通过ODBC方便地访问数据库的。使用VBS连接数据库,我们要知道以下信息:数据库名,数据源名。我们打开SQL数据库,这时候看到Databases下有很多的数据库,WINCC建立的数据库名是有规则的,一般是“CC_工程名_年_月_日_时_分_秒R”。那么我们就可以这样定义连接字符串:

'定义连接字符串
Dim sPro,sDsn,sSer,sCon
sPro = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=false;"
sDsn = "Initial Catalog=CC_test_17_12_18_11_29_28R;"
sSer = "Data Source=ADMIN-PC\WINCC"
sCon = sPro + sDsn + sSer

2、定义查询命令
  可以通过SQL语句来实现查询命令首先要获取两个DTPicker控件中的时间,分别表示起、止时间,经过比较控件日期来判断日期查询日期是否符合条件(起始日期 不能大于 终止日期),最后再用select语句来查询dt1和dt2两个日期之间的记录。
  需要注意的是,系统短日期需要修改成“yyyy/MM/dd”格式,Win7默认的是“yyyy/M/d”格式,不然在查询操作比较日期时,会出现意想不到的问题 O(∩_∩)O~,可根据实际需要来更改时间和日期格式。

WinCC 7.0 用户归档+Listview控件 制作报表(二)_第1张图片
系统短日期格式
Dim date1,date2,D1,D2
Set D1=ScreenItems("DTP1")   'DTP1控件获取的为系统短日期/时间格式 "2017/12/28 9:00:00"
Set D2=ScreenItems("DTP2")
date1 = Split(D1.value," ",-1,1)
date2 = Split(D2.value," ",-1,1)
Dim dt1,dt2
dt1 = CStr(date1(0))&" "&"00:00:00"
dt2 = CStr(date2(0))&" "&"23:59:59"
 
'比较两个日期得大小   
If DateDiff("d", CDate(D1.value), CDate(D2.value)) < 0 Then
   MsgBox "起始日期: "& date1(0) &"   大于  终止日期: "& date2(0), vbOKOnly + vbExclamation, "警告" 
   Exit Sub
End If

'定义查询命令,查找符合条件的信息,位于两个日期之间的信息
Dim sSql
sSql = "select * from UA#test3 where act_time between '"& dt1 & "'" & "and '" & dt2 & "'"

3、连接数据库
  定义好了连接字符串与查询字符串,我们就可以访问SQL数据库了。

'建立连接
Dim oRs,oCom,conn,m

Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = sCon
    conn.CursorLocation = 3
    conn.Open
Set oRs = CreateObject("ADODB.Recordset")
Set oCom = CreateObject("ADODB.Command")
    oCom.CommandType = 1
Set oCom.ActiveConnection = conn
    oCom.CommandText = sSql  '创建查询的命令文本
Set oRs = oCom.Execute
m = oRs.RecordCount    'm变量用于返回有效记录的数目

4、用ListView控件显示数据
  这里我用ListView控件来显示数据,也可以用其他控件来显示。首先设置控件的显示方式,设置好表头。

'定义ListView控件
Dim olist
Set oList = ScreenItems("LT1")
    oList.View =3 '设置外观为报表形式
    oList.GridLines =True '显示网格线
    oList.ColumnHeaders.Clear '清除原有表头
With oList.ColumnHeaders '设置表头,中间对齐
    .add ,,"刷卡记录编号",80
    .add ,,"刷卡时间",150
    .add ,,"车号",100
End With 
    oList.ListItems.Clear  '清除原有数据    

'向istView控件中循环写入查询数据
MsgBox "查询结果: 共有"& m &"条记录"   '提示框

  向ListView控件中循环写入查询数据

If (m > 0) Then
    oRs.MoveFirst

    Dim i
    For i=1 To m
'subitems(1)指第1列,oRs.fields(3)指数据库表中的第3列,计数均从0开始,第0列固定为数据库表中的ID
        With oList.listitems.add
            .text=CStr(oRs.fields(0).value)
            .subitems(1)=CStr(oRs.fields(3).value)
            .subitems(2)=CStr(oRs.fields(4).value)
        End With
        oRs.movenext
    Next
    oRs.Close
Else
End If

5、断开数据库
  向ListView控件写完数据后,要记得断开数据库连接,释放资源。

'断开数据库
Set oRs = Nothing
conn.Close
Set conn = Nothing

  
  完成查询的VBS脚本后,保存项目,通过step7的仿真写入部分数据,然后运行WinCC画面,可以看到实际的效果。

查询

你可能感兴趣的:(WinCC 7.0 用户归档+Listview控件 制作报表(二))