关注老董,学习更多电气自动化知识!
组态软件要往数据库里存数据,各个品牌的实现方法不同,但是其实实现的思路基本相同,而且所有组态软件都有这个功能!我就不讲怎么存的了,根据组态软件不同,各位自己去搜索如:“WINCC存数据到SqlServer”,”InTouch存数据到SqlServer”等等。。
今天我们主要讲数据库的规划以及将数据存储进数据库后如何展示出来和导出成为Excel或PDF的一种实现方法。另外集合了一些SqlServer,RDLC的知识点。
文章很长,建议收藏,转发、点赞~效果图如下,如果做上位机相信会用到:
一、数据库规划
打开数据库,建立各种表:
1、变量表
建立一个TAGDESC表,用于存放需要的变量,TAGID用于与其它表映射关系,TAGNAME用于标示变量名称,TAGDESC用于存放变量注释,Locate用于存放归属位置。
这个表是自己建的,用于存放注释,以及变量名和ID对应值。以及Locate的区域注释。
2、数值记录表
建立一个数值记录表示例中的表名qd_data_temp,记录时间,记录值,区域值,后面会将ID和变量映射、区域和区域注释映射。
3、区域对应表
本例中不使用
二、VS——RDLC 表建立, 表展示方式
打开
SQLServerBusinessIntelligence
1、新建项目
2、选择数据源
3、定义数据集
数据集选项
SELECT N.Tagid_d AS 序 , T.TagDesc AS 注释, CONVERT(VARCHAR, N.Sampletime_d, 111) AS 日期, DATEPART(hh,
N.Sampletime_d) AS 时间, AVG(N.Samplevalue_d) AS 值
FROM qd_data_temp AS N INNER JOIN
TagDesc AS T ON N.Tagid_d = T.TagID
WHERE (CONVERT(VARCHAR, N.Sampletime_d, 111) = CONVERT(VARCHAR, @查询日期, 111))
GROUP BY N.Tagid_d, T.TagDesc, CONVERT(VARCHAR, N.Sampletime_d, 111), DATEPART(hh, N.Sampletime_d)
ORDER BY 日期, 序
(简单方式
SELECT N.Tagid_d AS 序 , N.Sampletime_d, N.Samplevalue_d, T.TagDesc as 注释
FROM qd_data_temp AS N INNER JOIN
TagDesc AS T ON N.Tagid_d = T.TagID
)
SQL语句说明:
SELECT 表代 .表列名 AS 列别名……
FROM 数据表1名 AS 表代 INNER JOIN 数据表2名AS表代 表1.关联项=表2.关联项
选择矩阵
4、数据展示样式
下一步,直到完成
5、参数设置
设置参数数据类型为日期型。
6、最终效果
效果如下,可以导出为EXCEL,也可以是导出 PDF
三、SQL常用语句
1、其他可用语句:
SQL SELECT INTO 选取一部分创建一个新表
实例:
SELECT A表.列,B表.列
INTO 新表名
FROM A表
INNER JOIN 表1 ON 表1.列=表2.列
WHERE 条件
2、视图的使用
CREATE VIEW
CREATE VIEW DATATEST AS
SELECT N.Tagid_d AS 序 , N.Sampletime_d, N.Samplevalue_d, T.TagDesc AS 注释
FROM qd_data_temp AS N INNER JOIN TagDesc AS T ON N.Tagid_d = T.TagID
视图可以像表一样查询
SELECT * FROM [DATATEST]
删除视图
SQL DROP VIEW [DATATEST]
3、时间函数
NOW()返回当前日期和时间
CURDATE()返回房前日期时间单独部分
dateadd()日期时间加法
datediff()返回两个日期之间的时间
convert()用不同的格式显示日期时间
4、分组
按小时分组平均值
SELECT year(日期时间列名),MONTH(日期时间列名),DAY(日期时间列名),DATEPART(HOUR,(日期时间列名),AVG(值列)
FROM 表名
GROUP BY year(日期时间列名),MONTH(日期时间列名),DAY(日期时间列名),DATEPART(HOUR,(日期时间列名)
select 序 ,CONVERT(VARCHAR,Sampletime_d,111) as 日期,DATEPART(hh,Sampletime_d) as 时
,AVG(Samplevalue_d) as 值
from DATATEST WHERE CONVERT(VARCHAR,Sampletime_d,111)=’2019/10/28′
group by 序 ,CONVERT(VARCHAR,Sampletime_d,111),DATEPART(hh,Sampletime_d)
order by 日期,序
先创建视图
CREATE VIEW DATATEST AS
SELECT N.Tagid_d AS 序 , N.Sampletime_d, N.Samplevalue_d, T.TagDesc AS 注释
FROM qd_data_temp AS N INNER JOIN TagDesc AS T ON N.Tagid_d = T.TagID
再查询
select 序 ,注释,CONVERT(VARCHAR,Sampletime_d,111) as 日期,DATEPART(hh,Sampletime_d) as 时
,AVG(Samplevalue_d) as 值
from DATATEST WHERE Sampletime_d between ‘2019-5-6’ AND ‘2019-10-29’
group by 序 ,释,CONVERT(VARCHAR,Sampletime_d,111),DATEPART(hh,Sampletime_d)
order by 日期,序
时间间隔查询方式
select 序 ,注释,CONVERT(VARCHAR,Sampletime_d,111) as 日期,DATEPART(hh,Sampletime_d) as 时
,AVG(Samplevalue_d) as 值
from DATATEST WHERE Sampletime_d between ‘2019-5-6’ AND ‘2019-10-29’
group by 序 ,释,CONVERT(VARCHAR,Sampletime_d,111),DATEPART(hh,Sampletime_d)
order by 日期,序
四、RDLC查询 表的其他示例
1、全厂数据 表
1、展示
2、框架
3、查询开始时间参数
4、时间间隔参数
5、车间选择参数
6、变量选择参数
7、PVNAMES参数
=join(Parameters!变量选择.Value,”;”)
标签和值相同
8、DATASET1脚本
declare @StartTime bigint
declare @EndTime bigint
declare @intervalTime bigint
declare @TagsID Varchar(1000)
declare @st Varchar(1000)
declare @temp1 Varchar(1000)
declare @temp2 Varchar(1000)
declare @temp3 Varchar(1000)
declare @temp4 Varchar(1000)
set @temp1=CONVERT(Varchar(1000),@开始日期, 23);
set @st =’ ‘+@查询开始时间;
set @temp2 =convert(datetime,@temp1+@st);
set @StartTime =dbo.ToBigInt(convert(datetime,@temp2));
set @temp3=CONVERT(Varchar(1000),@结束日期, 23);
set @st =’ ‘+@查询结束时间;
set @temp4 =convert(datetime,@temp3+@st);
set @EndTime =dbo.ToBigInt(convert(datetime,@temp4));
set @intervalTime =dbo.IntervalToBigInt(@时间间隔);
set @tagsID=dbo.CTTagnamesToTagIDs(@pvnames);
select dbo.TagDesc.TagDesc,dbo.ToDate(SampleDateTime) AS SampleDateTime,cast(SampleValue as decimal(10,1)) as SampleValue from fn_get_samples_matrix_byinterval(@TagsID,@StartTime,@EndTime,0,@intervalTime) WA
INNER JOIN dbo.TagDesc ON TagDesc.TagID=WA.TagID
9、DATASET2脚本
select TagID,TagName,TagDesc from TagDesc
where Locate=@车间选择
10、DATASET3脚本
select chejian from qd_chejian_desc where Locate=@车间选择
2、车间数据 表
use [sql]
declare @temp1 varchar(50)
declare @temp2 varchar(100)
declare @temp3 varchar(300)
declare @temp4 varchar(100)
declare @temp5 varchar(100)
declare @temp6 varchar(200)
declare @TagsID Varchar(2000)
if (LEN(CAST(month(@查询日期) as char(100)))>1)
begin
set @temp4=CAST(month(@查询日期) AS char(100))
end
else
begin
set @temp4=’0’+CAST(month(@查询日期) AS char(100))
end
if (LEN(CAST(day(@查询日期) as char(100)))>1)
begin
set @temp5=CAST(day(@查询日期) AS char(100))
end
else
begin
set @temp5=’0’+CAST(day(@查询日期) AS char(100))
end
set @temp2=’qd_ymd’+convert(varchar(100),year(@查询日期))+rtrim(@temp4)+ltrim(@temp5)
set @temp3=’select TagDesc_d AS TagDesc,Sampletime_d AS 时间,Samplevalue_d AS 数值 from ‘+ @temp2
set @temp4=’ where Locate_d=”’+@车间选择+”’ and Jiezhi_d=”’+@介质选择+”’ and Pici_d=”’+@计量参数+”’ order by Sampletime_d’
EXEC(@temp3+@temp4)
3、一种饼图展示
USE [SQL]
declare @temp1 varchar(50)
declare @temp2 varchar(100)
declare @temp3 varchar(300)
declare @temp4 varchar(300)
declare @temp5 varchar(300)
declare @temp6 varchar(300)
declare @temp7 Varchar(2000)
if (LEN(CAST(month(@月份选择) as char(100)))>1)
begin
set @temp4=CAST(month(@月份选择) AS char(100))
end
else
begin
set @temp4=’0’+CAST(month(@月份选择) AS char(100))
end
set @temp2=’qd_ym’+convert(varchar(100),year(@月份选择))+rtrim(@temp4)
set @temp6=convert(varchar(100),year(@月份选择))+’年’+convert(varchar(100),month(@月份选择))+’月 高温水热量月用量汇总 单位:GJ’
set @temp3=’select Locate_m ,qd_chejian_desc.chejian,SUM(Samplevalue_m) as total ,”’+@temp6+”’as yuefen from ‘+ @temp2
set @temp4=’ INNER join qd_chejian_desc on ‘ + @temp2+’.Locate_m =qd_chejian_desc.Locate where ‘
set @temp5=’Jiezhi_m=”3” and Pici_m=”2” group by ‘+@temp2 +’.Locate_m,qd_chejian_desc.chejian’
exec(@temp3+@temp4+@temp5)
五、利用SQL作业进行创建,修改,删除等作业
1、创建作业
右键单击作业,选新建作业
2、修改名称等信息,点击步骤,创建脚本,以下脚本可以创建一个日 表
USE [SQL]
declare @temp1 varchar(100)
declare @temp2 varchar(100)
declare @temp3 varchar(100)
declare @temp4 varchar(80)
declare @createtable varchar(500)
set @temp1=’qd_ymd’+CONVERT(Varchar(100),getdate(),112)
IF not EXISTS (SELECT name FROM sysobjects
WHERE name =@temp1 AND type = ‘U’)
begin
set @createtable=’CREATE TABLE ‘+@temp1+'(Tagid_d int,TagDesc_d nvarchar(3000),Locate_d nvarchar(100),Sampletime_d datetime,Samplevalue_d float,Jiezhi_d nvarchar(50),Pici_d nvarchar(50))’
exec(@createtable)
set @temp2=’CREATE INDEX Tagid_d on ‘+@temp1+'(Tagid_d)’
exec(@temp2)
end
3、设置计划运行时间
4、脚本参考
1、创建日 表
USE [SQL]
declare @temp1 varchar(100)
declare @temp2 varchar(100)
declare @temp3 varchar(100)
declare @temp4 varchar(80)
declare @createtable varchar(500)
set @temp1=’qd_ymd’+CONVERT(Varchar(100),getdate(),112)
IF not EXISTS (SELECT name FROM sysobjects
WHERE name =@temp1 AND type = ‘U’)
begin
set @createtable=’CREATE TABLE ‘+@temp1+'(Tagid_d int,TagDesc_d nvarchar(3000),Locate_d nvarchar(100),Sampletime_d datetime,Samplevalue_d float,Jiezhi_d nvarchar(50),Pici_d nvarchar(50))’
exec(@createtable)
set @temp2=’CREATE INDEX Tagid_d on ‘+@temp1+'(Tagid_d)’
exec(@temp2)
end
2、创建月 表
USE [SQL]
declare @temp1 varchar(50)
declare @temp2 varchar(50)
declare @temp3 varchar(50)
declare @temp4 varchar(100)
declare @createtable varchar(500)
if (LEN(CAST(month(GETDATE()) as char(100)))>1)
begin
set @temp1=CAST(month(GET
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!