用户中心
· 企业空间 首页 | 资讯 | 技术 | 产品 | 企业 | 直播 | 专题 | 智能制造 | 论坛| 在线研讨会
紫金桥软件技术有限公司
企业空间 > 案例应用 > 正文
  • 紫金桥组态软件基于内置SQL查询历史数据的方法
  • 发布时间:2014/7/11 16:19:51   修改时间:2014/7/11 16:19:51 浏览次数:1445
  • 一、引言


      在项目中,经常会涉及到查询历史数据,通常情况下都是使用查询历史的专用组件,或者利用系统函数GetHisDataEx()以及相关的函数进行查询,但是上述两种方法都有一定的局限性,现在紫金桥推出一种全新的查询方法:基于内置SQL查询历史数据的方法


    二、功能实现


      1.功能页面布局


      首先,创建个窗口,窗口中如下图所示布局。放置两个“起始时间”控件用来控制查询历史数据的时间范围,分别命名为_StartTime_EndTime;放置一个“文本框”,用来输入时间间隔,命名为_INTERVAL;放置一个“按钮”,用来控制查询脚本;在下面放置一个“自由报表”,用来显示已经查询出来的历史数据,命名为RPT_Data。并在窗口导航树下选择:画面\查询\内置SQL查询,新建一个查询命名为ObSql1



      2.脚本实现


    所有的脚本均写在查询按钮中,方法比较简单,首先要在设置时间范围与时间间隔,然后在查询按钮中选择所要查询的数据点,并按照设置的数据进行查询,最后将查询到的数据放置到自由报表中。下面来分析查询按钮中的脚本。

    ObHost Host1;

    ObDataTable& ReturnTable;

    string StrPar[];

    string StrWhereCmd = ""; //Select查询时的Where语句

    string StrNameCmd = ""; //Select查询时的Where语句中存放点名的字符串

    string StrQuery = ""; //总的查询语句

    string StrTableText = ""; 

    int i,j;

    int nTagCount; //所要查询数据点的个数

    int nEveryTagCount; //每一个数据点返回历史数据的个数

    int nTableVal = 0;


    上述部分为定义的一些临时变量,方便下面写程序时使用。


    if  Host1.TagParSelMulti("",StrPar,-1) then


    If语句用来判断是否在点选择器中选择了数据点,如果选择了点,才会执行下面的脚本


    nTagCount = StrPar.GetCount();

    for i = 0 to nTagCount-1 step 1

    StrNameCmd = StrNameCmd + "'" + StrPar[i] + "',";

    next

    StrNameCmd = StrNameCmd + "'" + StrPar[nTagCount-1] + "'";


    上述语句是将在点选择器中选择的数据点按照SQL语句的形式拼接成字符串。


    StrWhereCmd = "INTERVAL="+IntToStr(#_INTERVAL.Val*1000,10)+"";

    StrWhereCmd = StrWhereCmd + " and DATETIME >= #"+#_StartTime.GetStringDateTime()+"#";

    StrWhereCmd = StrWhereCmd + " AND DATETIME< #"+#_EndTime.GetStringDateTime()+"#";

    StrWhereCmd = StrWhereCmd + " AND NAME IN ("+StrNameCmd+")";


    上述语句是拼写SQL查询语句中的Where子句,其中第一句是设置时间间隔;第二句是设置查询的其实时间;第三句是设置查询的结束时间;第四句是设置所要查询的历史数据的数据点。


    StrQuery = "SELECT Name,DATETIME,VALUE FROM HISDATA WHERE "+StrWhereCmd+"";


    上述语句是拼写整体的SQL查询语句,按照Where字句中的设置信息,从历史数据库中查询历史数据,并返回Name,DATETIME,VALUE三个字段的信息,这三个字段分别表示点名,历史数据的时间和历史数据。


    #ObSql1.Connect("本地");

    #ObSql1.Query(StrQuery,ReturnTable);


    上述语句是执行SQL查询,并将查询到的结构返回到通用数据表ReturnTable中。


    nEveryTagCount = ReturnTable.GetRowCount()/nTagCount;

    #RPT_Data.AddCol(nTagCount-1);

    #RPT_Data.AddRow(nEveryTagCount-1);


    上述语句是按照查询返回的数据个数及数据点的个数,设置显示报表的大小,在报表中增加相应的列和行。


    for i = 2 to #RPT_Data.RowCount() + 1 step 1

    #RPT_Data.SetTxt(i,0,StrPar[i-2]); //设置表头,内容为点名

    for j = 0 to nEveryTagCount step 1

    ReturnTable.Get("VALUE",j,StrTableText);

    #RPT_Data.SetTxt(i,j+1,StrTableText); //按照数据点向报表中放置查询到的数据

    if #RPT_Data.Txt(1,j+1) == "" then 

    ReturnTable.Get("DATETIME",j,nTableVal);

    #RPT_Data.SetVal(1,j+1,nTableVal); //向报表中放置历史数据点时间,放置之前要 判断时间是否已经存在

    endif

    ReturnTable.RemoveRow(0);

    next

    next

    endif


    上述语句是将查询到的结果放置到显示报表中。


      3.运行效果


     

     

    三、结束语


      通过该方式增加了查询历史数据随意性,且加快了数据查询的速度同时,查询到的数据可以根据自身需要进行多种形式的展示,方便数据的后期处理。

  • 企业介绍
紫金桥软件技术有限公司(RealSoft)是由中石油出资成立的专门从事计算机软件产品开发的高新技术企业,是中国石油天然气集团的软件开发基地。公司专注于自主知识产权软件产品“实时数据库系统”和“监控组态软件”的开发与推广工作,以为企业集团及客户…  更多>>
  • 联系方式

紫金桥软件技术有限公司

联系人:李磊

地址:黑龙江省大庆市高新区服务外包产业园C1-817室

邮编:163316

电话:400-6996-515

传真:0459-8151391-808

公司网址:http://www.realsoft.cc

  • 该空间手机版

扫描此二维码即可访问该空间手机版

  • 在线反馈
1.我有以下需求:



2.详细的需求:
姓名:
单位:
电话:
邮件:
您还没有登录,请登陆,
如果您还没有注册,点击这里注册.
  • 网友反馈
  • 戴永铁 在2024/6/11 14:51:00留言
  • 留言类型:贵公司产品销售人员联系我,贵公司技术支持人员联系我,
  • 详细留言:需要制药工业领域的实时库报表,包含矩阵配?、参数配方、数据(统计和历史)、曲线、事件、报警、审计追踪,这些内容可以组态化
  • 晓同 在2024/5/16 11:06:00留言
  • 留言类型:我让贵公司产品销售人员联系我,
  • 详细留言:紫金桥组态软件V6.5,512点授权
  • 在2023/10/21 16:03:00留言
  • 留言类型:贵公司技术支持人员联系我,
  • 详细留言:OPC
  • 郑鑫汶 在2023/6/1 14:58:00留言
  • 留言类型:我想得到贵公司产品详细资料,我想得到贵公司产品的价格信息,我让贵公司产品销售人员联系我,我让贵公司技术支持人员联系我,
  • 详细留言:需要咨询贵公司软件的价格功能
  • 吴吉校 在2023/3/15 7:45:00留言
  • 留言类型:我想得到贵公司产品详细资料,我想得到贵公司产品的价格信息,我让贵公司产品销售人员联系我,我让贵公司技术支持人员联系我,
  • 详细留言:组态软件咨询
更多请进入空间管理中心查看
关于我们 | 网站地图 | 联系我们
© 2003-2018    经营许可编号:京ICP证120335号
公安机关备案号:110102002318  服务热线:010-82053688
我要反馈