查詢
??前一篇中我們已經(jīng)按照需求建立了所需變量的用戶歸檔,這樣WINCC會自動將這些變量按照設定的存儲規(guī)則存放到SQL數(shù)據(jù)庫中喧伞。而對歷史數(shù)據(jù)進行查詢,就是對SQL數(shù)據(jù)庫正確操作以導出我們需要的數(shù)據(jù)插掂。通過VBS語言對按鈕對象編輯一個腳本程序就可以方便地實現(xiàn)此功能问潭,這里我們給“查詢”按鈕的事件屬性——“鼠標動作”中添加VBS腳本。
1饼暑、定義連接字符串
??我們是可以通過ODBC方便地訪問數(shù)據(jù)庫的稳析。使用VBS連接數(shù)據(jù)庫,我們要知道以下信息:數(shù)據(jù)庫名弓叛,數(shù)據(jù)源名彰居。我們打開SQL數(shù)據(jù)庫,這時候看到Databases下有很多的數(shù)據(jù)庫撰筷,WINCC建立的數(shù)據(jù)庫名是有規(guī)則的陈惰,一般是“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語句來實現(xiàn)查詢命令首先要獲取兩個DTPicker控件中的時間奴潘,分別表示起、止時間影钉,經(jīng)過比較控件日期來判斷日期查詢日期是否符合條件(起始日期 不能大于 終止日期)画髓,最后再用select語句來查詢dt1和dt2兩個日期之間的記錄。
??需要注意的是平委,系統(tǒng)短日期需要修改成“yyyy/MM/dd”格式奈虾,Win7默認的是“yyyy/M/d”格式,不然在查詢操作比較日期時,會出現(xiàn)意想不到的問題 O(∩_∩)O~肉微,可根據(jù)實際需要來更改時間和日期格式匾鸥。
Dim date1,date2,D1,D2
Set D1=ScreenItems("DTP1") 'DTP1控件獲取的為系統(tǒng)短日期/時間格式 "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勿负、連接數(shù)據(jù)庫
??定義好了連接字符串與查詢字符串,我們就可以訪問SQL數(shù)據(jù)庫了劳曹。
'建立連接
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 '創(chuàng)建查詢的命令文本
Set oRs = oCom.Execute
m = oRs.RecordCount 'm變量用于返回有效記錄的數(shù)目
4奴愉、用ListView控件顯示數(shù)據(jù)
??這里我用ListView控件來顯示數(shù)據(jù),也可以用其他控件來顯示铁孵。首先設置控件的顯示方式锭硼,設置好表頭。
'定義ListView控件
Dim olist
Set oList = ScreenItems("LT1")
oList.View =3 '設置外觀為報表形式
oList.GridLines =True '顯示網(wǎng)格線
oList.ColumnHeaders.Clear '清除原有表頭
With oList.ColumnHeaders '設置表頭,中間對齊
.add ,,"刷卡記錄編號",80
.add ,,"刷卡時間",150
.add ,,"車號",100
End With
oList.ListItems.Clear '清除原有數(shù)據(jù)
'向istView控件中循環(huán)寫入查詢數(shù)據(jù)
MsgBox "查詢結果: 共有"& m &"條記錄" '提示框
??向ListView控件中循環(huán)寫入查詢數(shù)據(jù)
If (m > 0) Then
oRs.MoveFirst
Dim i
For i=1 To m
'subitems(1)指第1列,oRs.fields(3)指數(shù)據(jù)庫表中的第3列,計數(shù)均從0開始,第0列固定為數(shù)據(jù)庫表中的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蜕劝、斷開數(shù)據(jù)庫
??向ListView控件寫完數(shù)據(jù)后檀头,要記得斷開數(shù)據(jù)庫連接,釋放資源岖沛。
'斷開數(shù)據(jù)庫
Set oRs = Nothing
conn.Close
Set conn = Nothing
??
??完成查詢的VBS腳本后暑始,保存項目,通過step7的仿真寫入部分數(shù)據(jù)烫止,然后運行WinCC畫面蒋荚,可以看到實際的效果。