前面的博客介紹了如何使用MSHFGrid和DataGrid把查詢到的數據顯示出來,有些情況下我們還需要對這些數據進行修改,並且把SQL Server相應記錄也進行修改。本文就記錄一下這兩種控件如何進行數據修改以及sql數據表更新。
1. 我們還是以用戶歸檔那張表為例子。假設用戶歸檔名字為UA,已經有了一些基礎數據如圖:
2. 寫一個全局項目模塊vbs腳本,用於查詢數據:
Sub SearchTable(report,DBName,ssql)
Dim ors,ocom,scon,conn
Dim PCName
Set PCName=HMIRuntime.Tags("@LocalMachineName")
scon="Provider = SQLOLEDB.1;Integrated Security=SSPI;Persist SecurityInfo=False;Initial Catalog ='" _
& DBName & "';Data Source = " & PCName.Read & "\WINCC"
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
Set report.datasource=ors
End Sub
3. 新建一個管理員賬戶SysAdmin,修改數據必須是這個用戶才行。設置ctrl+L快捷鍵進行用戶登錄。
4. Wincc新建畫面,放入MSHFGrid控件,名字修改為Report1,放置DataGrid控件,名字修改為Report2。本例簡單化不做條件查詢,控件里面顯示所有的結果。在畫面的打開事件中添加以下vbs腳本:
Sub OnOpen()
Dim DBName,ssql,scon,conn
Dim Report1,Report2
Set Report1=ScreenItems("Report1")
Set Report2=ScreenItems("Report2")
Set DBName=HMIRuntime.Tags("@DatasourceNameRT")
ssql="select Curdate as '日期',Curtime as '時間',FT101 as '流量1',FT102 as '流量2',FT103 as '流量3'," _
& "PT101 as '壓力1',PT102 as '壓力2',PT103 as '壓力3',TT101 as '溫度1',TT102 as '溫度2',TT103 as '溫度3'," _
& "LT101 as '液位1',LT102 as '液位2',LT103 as '液位3' from UA#UA"
SearchTable report1,DBName.Read ,ssql
SearchTable report2,DBName.Read ,ssql
End Sub
運行后,兩個空間會自動的顯示sql數據表的數據。
5. Report1控件的點擊事件中添加以下vbs腳本
Sub Click(ByVal Item)
Dim username,DefaultValue,ModifyValue,CurRow,CurCol
Dim Report,DBName,ssql,FieldName,CurID
Set Report=ScreenItems("Report1")
Set username=HMIRuntime.Tags("@CurrentUserName")
Set DBName=HMIRuntime.Tags("@DatasourceNameRT")
If Ucase(username.Read) <> "SYSADMIN" Then '判斷是不是有修改權限
Msgbox "權限不足,請先登錄"
Else
CurRow=Report.Row
CurCol=Report.Col
DefaultValue=Report.TextMatrix(CurRow,CurCol)
If CurCol=1 Or CurCol=2 Or CurCol=3 Then
Msgbox "前三列不允許修改"
Else
ModifyValue=Inputbox("輸入想修改的數值","修改數值",DefaultValue,300,300)
If (Not IsNumeric(ModifyValue)) Or (ModifyValue="") Then
Msgbox "輸入的不是數字且不為空,請重新輸入"
Else
Report.TextMatrix(CurRow,CurCol)=ModifyValue
'更新數據表相應數值
Select Case CurCol
Case 4
FieldName="FT101"
Case 5
FieldName="FT102"
Case 6
FieldName="FT103"
Case 7
FieldName="PT101"
Case 8
FieldName="PT102"
Case 9
FieldName="PT103"
Case 10
FieldName="TT101"
Case 11
FieldName="TT102"
Case 12
FieldName="TT103"
Case 13
FieldName="LT101"
Case 14
FieldName="LT102"
Case 15
FieldName="LT103"
End Select
CurID=Report.TextMatrix(CurRow,1)
ssql="update UA#UA set " & FieldName & "='" & CStr(Report.TextMatrix(CurRow,CurCol)) & "' where ID='" & CurID & "'"
SearchTable report,DBName.Read ,ssql
End If
End If
End If
End Sub
6. Report2控件的單擊事件添加以下vbs腳本
Sub Click(ByVal Item)
Dim username,DefaultValue,ModifyValue,CurRow,CurCol
Dim Report,DBName,ssql,FieldName,CurID
Set Report=ScreenItems("Report2")
Set username=HMIRuntime.Tags("@CurrentUserName")
Set DBName=HMIRuntime.Tags("@DatasourceNameRT")
If Ucase(username.Read) <> "SYSADMIN" Then '判斷是不是有修改權限
Msgbox "權限不足,請先登錄"
Else
CurRow=Report.Row '當前行號,從0開始的數值
CurCol=Report.Col '當前列號,從0開始的數值
DefaultValue=Report.Columns.Item(CurCol).Text
'Msgbox DefaultValue
If CurCol=0 Or CurCol=1 Or CurCol=2 Then
Msgbox "前三列不允許修改"
Else
ModifyValue=Inputbox("輸入想修改的數值","修改數值",DefaultValue,300,300)
If (Not IsNumeric(ModifyValue)) Or (ModifyValue="") Then
Msgbox "輸入的不是數字且不為空,請重新輸入"
Else
Report.Row=CurRow
Report.Text =CStr(ModifyValue)
'更新數據表相應數值
Select Case CurCol
Case 3
FieldName="FT101"
Case 4
FieldName="FT102"
Case 5
FieldName="FT103"
Case 6
FieldName="PT101"
Case 7
FieldName="PT102"
Case 8
FieldName="PT103"
Case 9
FieldName="TT101"
Case 10
FieldName="TT102"
Case 11
FieldName="TT103"
Case 12
FieldName="LT101"
Case 13
FieldName="LT102"
Case 14
FieldName="LT103"
End Select
' 取得ID數值
report.Row=CurRow
report.Col=0
CurID=Report.Text
ssql="update UA#UA set " & FieldName & "='" & ModifyValue & "' where ID='" & CurID & "'"
SearchTable report,DBName.Read ,ssql
ssql="select ID,Curdate as '日期',Curtime as '時間',FT101 as '流量1',FT102 as '流量2',FT103 as '流量3'," _
& "PT101 as '壓力1',PT102 as '壓力2',PT103 as '壓力3',TT101 as '溫度1',TT102 as '溫度2',TT103 as '溫度3'," _
& "LT101 as '液位1',LT102 as '液位2',LT103 as '液位3' from UA#UA"
SearchTable report,DBName.Read ,ssql
End If
End If
End If
End Sub