|
一、引言
在項目中,經常會涉及到查詢曆史數據,通常情況下都是使用查詢曆史的專用組件,或者利用係統函數GetHisDataEx()以及相關的函數進行查詢,但是上述兩種方法都有一定的局限性,現在紫金橋推出一種全新的查詢方法:基於內置SQL查詢曆史數據的方法。
二、功能實現
1.功能頁麵布局
首先,創建一個窗口,窗口中如下圖所示布局。放置兩個“起始時間”控件用來控製查詢曆史數據的時間範圍,分別命名為_StartTime、_EndTime;放置一個“文本框”,用來輸入時間間隔,命名為_INTERVAL;放置一個“按鈕”,用來控製查詢腳本;在下麵放置一個“自由報表”,用來顯示已經查詢出來的曆史數據,命名為RPT_Data。並在窗口導航樹下選擇:畫麵\查詢\內置SQL查詢,新建一個查詢命名為ObSql1。

2.腳本實現
所suo有you的de腳jiao本ben均jun寫xie在zai查zha詢xun按an鈕niu中zhong,方fang法fa比bi較jiao簡jian單dan,首shou先xian要yao在zai設she置zhi時shi間jian範fan圍wei與yu時shi間jian間jian隔ge,然ran後hou在zai查zha詢xun按an鈕niu中zhong選xuan擇ze所suo要yao查zha詢xun的de數shu據ju點dian,並bing按an照zhao設she置zhi的de數shu據ju進jin行xing查zha詢xun,最zui後hou將jiang查zha詢xun到dao的de數shu據ju放fang置zhi到dao自zi由you報bao表biao中zhong。下xia麵mian來lai分fen析xi查zha詢xun按an鈕niu中zhong的de腳jiao本ben。
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.運行效果


三、結束語
通(tong)過(guo)該(gai)方(fang)式(shi)增(zeng)加(jia)了(le)查(zha)詢(xun)曆(li)史(shi)數(shu)據(ju)隨(sui)意(yi)性(xing),且(qie)加(jia)快(kuai)了(le)數(shu)據(ju)查(zha)詢(xun)的(de)速(su)度(du)。同(tong)時(shi),查(zha)詢(xun)到(dao)的(de)數(shu)據(ju)可(ke)以(yi)根(gen)據(ju)自(zi)身(shen)需(xu)要(yao)進(jin)行(xing)多(duo)種(zhong)形(xing)式(shi)的(de)展(zhan)示(shi),方(fang)便(bian)數(shu)據(ju)的(de)後(hou)期(qi)處(chu)理(li)。
|