FameView 数据库操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
24.
数据库操作
24.数据库操作
数据库操作
序号 内容 页码
24.1 数据查询 24-02
24.2 曲线查询 24-05
24.3 表格显示 24-08
24.4 字段列表 24-09
24.5 删除数据表内容 24-11
24.6 数据库脚本编程 24-12
24.7 存储过程脚本编程 24-13
24.8 数据库记录平均统计 24-14
24.9 把数据库记录导出到Excel中 24-15
24.10 使用ADO访问数据库 24-16
24.11 数据库转发 24-17
24.12 查询数据库某表中最近时间段数据 24-21
24.13 获得某字段最近某时间段内统计值 24-21
24.1数据查询
提供了通过表格查看数据库内容的方法,用“数据查询”组件实现:
增加组件对象,在设置对话框中添入数据库的有关信息,如下图所示:
执行<数据源>按钮,通过出现的对话框来选择数据源(如FameView Userdata Source):
执行<记录表>按钮,出现下面的对话框,其中列出数据源中所有数据表:
从中选择要查询的记录集(如demo):
此组件主要根据时间字段进行查询,执行<时间字段>按钮,出现下面的对话框,其中列出记录集中所有的字段,从中选择要使用的时间字段(如dt):
如果希望把查询结果进行打印或浏览,要先根据数据库利用Crystal水晶星建立报表格式,执行<报表格式>按钮,选择报表格式文件(*.rpt);
如果希望把查询结果进行特殊排序,在<排序字段>处添入排序字段的名称及排序方法;
根据字段f3按照升序排列:
根据字段f3按照降序排列:
通过查询对象,可根据对某些字段的过滤实现分组查询:
查询对象的格式如下[f为字段名称、n为数值、s为字符串]:
数值查询 字符串查询
预定义查询 Fn=n//描述 F1='s'//描述
手动查询 F1=?//描述 F1='?'//描述
手动查询时,会出现输入对话框,提示输入查询内容:
用鼠标双击字段列表,会出现选择字段对话框,从中选择需要查询后显示的字段:
不需要再选择时间字段,能自动的识别字段的类型,但要正确设定字段内容的字符长度;
在查询显示表中,可能不希望直接显示字段的名称,请修改字段描述即可;
用“Del”键可以从列表删除选错的字段;
画面运行后,执行按钮查询,界面如下:
如果不希望执行组件按钮来查询数据,而希望通过其他事件来执行,按照下列步骤来实现:
(1)给按钮组件命名:选中组件,点击右键,弹出菜单,选择执行“对象属性”中的“脚本名称”,给
对象命名,例如BTNOBJ;
(2)隐藏按钮组件:选中组件,点击右键,弹出菜单,选择执行“隐藏对象”,使组件在运行画面显示
时不可见:
(3)编写脚本,然后被其他事件触发,例如在图标按钮中选择脚本执行,脚本内容如下:
UserDbSQLObj.ShowWindow "BTNOBJ"
24.2 曲线查询
组态系统提供了通过曲线查看数据库内容的方法,用“曲线查询”组件实现;
假设要查询的数据表的内容为;
F1(罐号) F2(液位) dt(时间)
1 10 2006-5-5 1:00:00
2 10 2006-5-5 1:00:00
1 100 2006-5-5 2:00:00
2 200 2006-5-5 2:00:00
1 110 2006-5-5 3:00:00
2 220 2006-5-5 3:00:00
… … …
增加组件对象,在设置对话框中添入数据库的有关信息,如下图所示:
通过<数据源>按钮弹出对话框,选择ODBC数据源,如fameView userdata Source;
通过<记录表>按钮弹出对话框,选择要查询的数据表,如demo;
通过<时间字段>按钮弹出对话框,选择进行查询所依据的时间字段,如dt;
在<查询对象>处输入查询内容:
查询对象的格式如下[F1为字段名称、n为数值、s为字符串]:
数值查询 字符串查询
预定义查询 F1=n//描述 F1='s'//描述
手动查询 F1=?//描述 F1='?'//描述
通过<曲线字段>选择字段,作为曲线字段,并修改曲线的范围,输入曲线的描述;
画面运行后,执行按钮查询,界面如下:
如果不希望执行组件按钮来查询数据,而希望通过其他事件来执行,按照下列步骤来实现:
(1)给按钮组件命名:选中组件,点击右键,弹出菜单,选择执行“对象属性”中的“脚本名称”,给
对象命名,例如BTNOBJ;
(2)隐藏按钮组件:选中组件,点击右键,弹出菜单,选择执行“隐藏对象”,使组件在运行画面显示
时不可见:
(3)编写脚本,然后被其他事件触发,例如在图标按钮中选择脚本执行,脚本内容如下:
SQLCurveObj.ShowWindow "BTNOBJ"
24.3 表格显示
组态系统提供了在线显示数据库内容的方法,通过“表格显示”组件实现:
此组件可以在画面上以列表的方式直接显示某个数据库的内容,还可以与变量相关联;
组态对话框如下:
通过<对象名称>为组件命名,否则不能进行脚本操作,如“DBLIST”;
执行<数据源>按钮,选择数据库对应的数据源;
执行<数据表>按钮,选择要显示的数据表,数据表中的字段数量要小于100:
如果希望在列表中只显示数据表中的某部分数据,请<过滤条件>处填写缺省SQL语句,否则显示数据库中的所有记录;
如果希望列表中的内容根据某字段进行排序,请输入此排序字段的名称,便实现了按此字段的升序排序,在字段的后面加入DESC,便实现了按此字段的降序排序;
用鼠标双击字段列表,会出现选择字段对话框,从中选择需要查询后显示的字段;
能自动的识别字段的类型,但要正确设定字段内容的字符长度;
在查询显示表中,可能不希望直接显示字段的名称,请修改字段描述即可;
用“Del”键可以从列表中删除字段;
还提供了3组变量:增加变量、读取变量、修改变量;使系统变量(AI/AO/AR/DI/DO/DR/VA/VD /VT)与数据库之间建立联系;
画面运行后,数据库列表界面如下:
允许编写脚本操作数据库:
要把增加变量组追加至数据库,请使用如下脚本:
UserDbListObj.AddNewFromVarValue "DBLIST"
要从数据库中读取第10个记录至读取变量组,请使用如下脚本:
UserDbListObj.SetVarValueFromField "DBLIST",10
要通过修改变量组修改数据库中的第10个记录,请使用如下脚本:
UserDbListObj.EditFromVarValue "DBLIST",10
24.4字段列表
组态系统提供了在线选择数据库中某字段内容的方法,通过“字段列表”组件实现:
此组件有以下功能:[1]通过下拉列表或选择框的方式供用户进行数据选择;[2]选择框内容可以数据库中的某个字段的内容,也可是手动输入的内容;[3]选择的内容能够与变量关联;
组态对话框如下:
缺省列表,手动输入多行文本(用回车换行),作为缺省列表内容;
关联数据库,通过设定数据源、数据表、使用字段、过滤条件,能够在画面运行时,把数据库某表中的某字段的部分记录添入到选择框中;
过滤条件的格式为SQL查询语句,例如:f2>1000、f2="ABC";
对应变量,在画面运行后,当使用选择框选择数据时,能够把所选择的内容对应到变量中:
[1].索引变量可以是AO/AR/VA变量,对应的是选择框中当前文本的索引号,以0为基数;
[2].数值变量可以是AO/AR/VA变量,对应的是把选择框中当前文本转换为浮点数后的数值;
[3].文本变量可以是VT变量, 对应的是选择框中的当前文本;
选择<自动排序>,则列表中的内容进行排序处理;
选择<下拉选择框>,并选择了<自动更新>时,当下拉列表框时,会自动更新列表中的内容;
选择<唯一记录>,可以过滤掉列表中重复的内容;
不选择<下拉选择框>,组件显示的界面为:
选择<下拉选择框>,组件显示的界面为:
允许用脚本更新选择框中的内容:
更新数据选择框的内容
DataboxObj.Update ObjName,OdbcName,TableName,FieldName,FieldType,Filter
例:DataboxObj.Update "AAA","myODBC","myTable","myField",3,"f1>1000"
得到当前数据选择框的文本内容
n=DataboxObj.GetCurText(ObjName)
例:n=DataboxObj.GetCurText("AAA")
24.5 删除数据库内容
某数据库中存储了大量数据,经过一段时间后,想把某个时间之前的数据删除;
本节以例子的方式说明如何通过组态系统删除数据库中的某些数据;
假设现有数据库,其ODBC数据源的名称为db1,其中有一个数据表名为T1,其中有一个日期时间字段为F1,根据F1来删除数据;
增加2个文本变量(VT):VT1、VT2;
在画面中各增加一个日期拾取器和时间拾取器,分别把内容保存在VT1和VT2中;
再在画面中增加一个按钮,当执行按钮时,执行脚本来删除选择时间以前的数据;
画面的界面如下:
如果数据库的类型为Access,则脚本内容如下:
'打开DB1,允许通过SQL访问
SQLObj.OpenSQLConnect "DB1","",""
'得到删除日期、时间
s1=RunSys.GetVTtext("VT1",-1)
s2=RunSys.GetVTtext("VT2",-1)
'组成格式文本"Delete * From T1 Where F1<= #2002-1-1 0:0:0# "
s="Delete * From T1 Where F1<= #" : s=s+s1 : s=s+" " : s=s+s2 : s=s+"#"
'执行SQL语句,删除数据
SQLObj.SQLExecute s
'关闭DB1
SQLObj.CloseSQLConnect
如果数据库的类型为SQL Server,则脚本内容如下:
'打开DB1,允许通过SQL访问
SQLObj.OpenSQLConnect "DB1","",""
'得到删除日期、时间
s1=RunSys.GetVTtext("VT1",-1)
s2=RunSys.GetVTtext("VT2",-1)
'组成格式文本"Delete * From T1 Where F1<= ‘2002-1-1 0:0:0# ’
s="Delete * From T1 Where F1<= '" : s=s+s1 : s=s+" " : s=s+s2 : s=s+"'"
'执行SQL语句,删除数据
SQLObj.SQLExecute s
SQLObj.CloseSQLConnect
往记录集中加入记录;
UserDB.OpenConnect "My Database","",""
UserDB.OpenRecordset "t1",2,2,2
UserDB.AddNew
UserDB.SetFieldValue "f1",7, "AAA"
UserDB.SetFieldValue "f2",1,1000
UserDB.Update
UserDB.CloseRecordset
UserDB.CloseConnect
得到数据库中字段的值;
UserDB.OpenConnect "My Database","",""
UserDB.OpenRecordset "t1",2,2,2
UserDB.MoveFirst
UserDB.Move(10)
Value=UserDB.GetFieldValue "f2",1,1000
UserDB.CloseRecordset
UserDB.CloseConnect
执行SQL语句:
SQLObj.OpenSQLConnect "TestDB","",""
SQLObj.SQLExecute "DELETE FROM demo"
SQLObj.CloseSQLConnect
数据查询
UserDB.OpenConnect "FameView UserData Source","",""
UserDB.SetFilter "f1>=1000"
UserDB.OpenRecordset "demo",2,2,2
If UserDB.IsEmpty()=0 Then
retValue=UserDB.GetFieldValue("f2",4)
End If
UserDB.CloseRecordset
UserDB.CloseConnect
通过脚本编程可以执行数据库服务器端的存储过程;
假设存储过程内容如下:
CREATE PROCEDURE [test]
(@f1 [real], @f2 [real], @f3 [datetime], @f4 [real] output) AS INSERT INTO [UserDatabase].[dbo].[demo] ( [f1],[f2],[f3])
VALUES ( @f1,@f2,@f3)
if @@error=0
set @f4=12.11
else
set @f4=0.12
GO
过程调用如下:
n=StoredProc.OpenConnect("FameView UserData Source","","")
If n=1 Then
StoredProc.SetCommandText "test"
StoredProc.SetInputParamCount 3
StoredProc.SetInputParam 1,"f1",4,1.23
StoredProc.SetInputParam 2,"f2",4,2.34
StoredProc.SetInputParam 3,"f3",7,"2005-12-11 05:00:00"
StoredProc.SetOutputParamCount 1
StoredProc.SetOutputParam 1,"f4",4
StoredProc.Execute
m=StoredProc.GetOutputValue(1)
RunSys.SetVarValue VA,"%VA1",-1,m
StoredProc.CloseConnect
End If
24.8 数据库记录平均统计
把某个表中某天的数据求平均,存入另一个表中
假设t1和t2有相同的结构,分别有3个字段:
字段名称 类型
F1 Real
F2 Real
F3 Datetime
针对t1中近30天的数据,把每天的数据求平均,存入t2中,并删除t1中的数据;
在SQL Server中编写存储过程test如下:
CREATE PROCEDURE [test]
as
Declare @n int
Declare @ct datetime
set @n=-30
while @n<0
begin
set @ct=DATEADD(DAY,@n, GETDATE())
INSERT INTO t1
SELECT AVG(f1) AS f11, AVG(f2) AS F12, @ct AS F13
FROM demo
WHERE (YEAR(f3) = YEAR(@ct) AND (Month(f3) = MONTH(@ct) AND (Day(f3) = DAY(@ct)
set @n=@n+1
end
delete from demo
GO
在组态软件中调用过程的脚本如下:
n=StoredProc.OpenConnect("FameView UserData Source","","")
If n=1 Then
StoredProc.SetCommandText "test"
StoredProc.Execute
StoredProc.CloseConnect
End If
24.9 把数据库数据导出到把数据库数据导出到Excel Excel Excel中中
'允许输入查询的年/月
MyYear = InputBox ("请输入查询年份","") MyMonth = InputBox ("请输入查询月份","") MyDay = 1
'检查时间是否合法
If IsDate (MyMonth & "/" & MyDay & "/" & MyYear) = True Then NOW_DATE = MyYear + "年" + MyMonth + "月" '得到开始时间
StartTime = MyMonth & "/" & MyDay & "/" & MyYear & " 00:00:00" '得到结束时间 If MyMonth < 12 Then MyMonth = MyMonth + 1
EndTime = MyMonth & "/" & MyDay & "/" & MyYear & " 00:00:00" Else
MyYear = MyYear + 1 MyMonth = 1
EndTime = MyMonth & "/" & MyDay & "/" & MyYear & " 00:00:00" End If
'打开数据库及数据表demo,dt为时间字段
UserDB .OpenConnect "FameView UserData Source","","" UserDB .SetFilter "dt>='"+StartTime+"' And dt<'"+EndTime+"'" UserDB .OpenRecordset "demo",2,2,2 '打开记录集;
'检查查询内容是否为空 If UserDB .IsEmpty ()=0 Then '打开Excel文件
Set ExcelObj = CreateObject ("Excel.Application") ExcelObj.Visible = True
ExcelFile = "C:\组态系统\ExcelFile\test.xls" ExcelObj.Workbooks.Open ExcelFile ExcelObj.Sheets("Sheet1").Select ExcelObj.Worksheets(1).Select ExcelObj.Cells(1,3) = NOW_DATE '导出记录到Excel中 row=2
While UserDB .IsEOF ()=0
ExcelObj.Cells(row,1).Value=UserDB .GetFieldValue ("dt",8)
ExcelObj.Cells(row,2).Value=UserDB.GetFieldValue("f1",4)
ExcelObj.Cells(row,3).Value=UserDB.GetFieldValue("f2",4)
row=row+1
UserDB.MoveNext
Wend
ExcelObj.ActiveWorkbook.SaveAs "C:\组态系统\ExcelFile\"&NOW_DATE&".xls" ExcelObj.Quit
Set ExcelObj=Nothing
End If
'关闭数据库
UserDB.CloseRecordset
UserDB.CloseConnect
End If
数据库
24.10 使用ADO访问
访问数据库
'与数据库(tempdb)建立连接
Set conn = CreateObject("ADODB.Connection")
strConn="Driver={SQL Server};Server=(local);Database=tempdb;Uid=sa;Pwd=;" conn.Open strConn
'打开记录集(t1)
Set rs= CreateObject("ADODB.Recordset")
strSQL="SELECT * FROM t1"
rs.Open strSQL,conn,2,2
'添加记录
rs.AddNew
rs("f1")="222"
rs("f2")=222
rs.Update
'得到记录
f1=rs("f1")
f2=rs("f2")
'关闭连接与记录集
rs.Close
conn.Close
Set rs=Nothing
Set conn=Nothing
24.11数据库转发
目的和功能:
本地计算机(A)和远程计算机(B)同时工作,当A发现B不工作时,A则开始存储数据,或者带标志存储数据;
当A发现B恢复工作后,则把存储的数据或带标志的数据补发给B;
A补发完成后,把数据进行删除或清除标志;
远程计算机(B)的数据库(SQL Server 2000)设置:
允许其他计算机访问:
设置访问用户ID和口令:
设置远程计算机(B),使远程计算机具有启动/工作标志:
在本地计算机(A)建立远程计算机工作标志变量:
假设远程计算机的IP地址为<192.168.1.208>;
增加一个名称为“#IP192.168.1.208”的内部开关变量(VD);
远程计算机启动并开始工作后,变量状态为1,否则为0;
定制和启动本地计算机的数据库补发功能:
定制数据库补发:
启动数据库补发任务:
使本地计算机的数据库连接,根据远程计算机的状态决定是否存储:
使本地计算机的数据库连接,把远程计算机的状态作为标志进行存储:
在本地计算机设置数据库补发功能:
选择数据库补发功能,执行设置数据补发:
出现管理界面:
执行<新建>:
输入补发名称,执行确定,出现设置界面,组态后的界面如下:
选择要使用的转发:
24.12查询数据库某表中最近时间段数据
查询最近3分钟数据:
Select * from demo where dt>DateAdd(MINUTE,-3,GetDate()) 查询最近3小时数据:
Select * from demo where dt>DateAdd(HOUR,-3,GetDate()) 查询最近3天数据:
Select * from demo where dt>DateAdd(DAY,-3,GetDate())
24.13 获得某字段最近某时间段内统计值
'[1]得到分钟时间段
x=0
bValue=RunSys.OpenDatabase(3000)
If bValue=1 Then
x=RunSys.GetVarValue(VA,"%VA1",-1)
RunSys.CloseDatabase
End If
'[2]打开数据库
Set conn = CreateObject("ADODB.Connection")
strConn="Driver={SQL Server};Server=(local);Database=UserDatabase;Uid=;Pwd=;"
conn.Open strConn
Set rs= CreateObject("ADODB.Recordset")
'[3]进行统计查询
strSQL="SELECT Avg(f1) as f11 FROM demo where dt>=DateAdd(Minute,-"&CStr(x)&",GetDate())"
rs.Open strSQL,conn,2,2
If rs.EOF=False Or rs.BOF=False Then
x=rs("f11")
End If
'[4]关闭数据库
rs.Close
conn.Close
Set rs=Nothing
Set conn=Nothing
'[5]取得统计值
bValue=RunSys.OpenDatabase(3000)
If bValue=1 Then
RunSys.SetVarValue VA,"%VA2",-1,x
RunSys.CloseDatabase
End If。