我現在有這樣一個任務,就是統計每小時呼損和接通的數量,兩個資料表單
比如:
時間 數量 時間 數量
0 15 0 13
1 100 1 89
2 50 1 45
。。。
最后得出來的結論是用前邊表中的數量減去后邊表中的數量,再形成一張新表用來記錄每個時間段呼損的數量。這樣的結果應該如何撰寫。請高手指教,謝謝!
uj5u.com熱心網友回復:
假設你的資料視窗是有規律的,那就好辦。比如前者先得到資料,后者后得到資料。那么就在后者中寫一個事件,計算之后插入表中就好了。
uj5u.com熱心網友回復:
是有規律的就是從0點到23點,要是但是哪個事件能在資料檢索后就可以將結果統計并插入新資料視窗中呢?uj5u.com熱心網友回復:
如果不是你的程式直接接受的,二是其他設備接收,并插入到資料庫的。建議使用觸發器。
uj5u.com熱心網友回復:
時間 數量 時間 數量0 15 0 13
1 100 1 89
2 50 1 45
select a.時間 , a.數量 - isnull(b.數量,0) 數量 from tb1 a
left join
(select 時間,sum(數量) 數量 from t2 group by 時間) b
on a.時間 = b.時間
然后用動態DW實作.
uj5u.com熱心網友回復:
動態創建資料視窗在實際應用中,經常需要根據用戶需求來動態創建資料窗,一般方法是這樣的。
在一個window中加入一個資料窗控制元件,如dw_new,但是該資料窗沒有data object,(空白的)就可以用以下語法來創建:
dw_new.create(ls_syntax,ls_error) // 創建語法,錯誤資訊
ls_syntax可以用以下三種方法來形成:
一、動態由sql語法創建:
// 連接到pb的example資料庫
string ls_sql,ls_syntax,ls_error
ls_syntax = 'select * from department'
ls_syntax = sqlca.SyntaxFromSQL(ls_sql,'style(type=grid)',ls_error)
if len(ls_error) >0 then
messagebox('Error','SyntaxFromSQL Error:~r'+ls_error)
else
dw_new.create(ls_syntax,ls_error)
if len(ls_error) >0 then
MessageBox("Error", "Create have these errors: ~r" + ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
end if
二、由另一個資料窗的syntax來創建
string ls_syntax,ls_error
ls_syntax = dw_test.describe('datawindow.syntax')
dw_new.create(ls_syntax,ls_error)
if ls_error <> '' then
messagebox('Create Error',ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
三、讀取psr檔案來創建
string ls_syntax,ls_error,ls_ret
ls_ret = char(13)+char(10) //回車鍵
int li_fileNum
long li_length
li_FileNum = FileOpen("efef.psr",Streammode!, read!, shared!, Replace!)
if li_filenum >0 then
FileSeek(li_FileNum, 158, FromBeginning!)
li_length = fileRead(li_filenum,ls_syntax)
end if
fileclose(li_filenum)
if li_length = 0 then return
ls_syntax = "release 5;"+ls_ret+ls_syntax
//截掉ls_syntax中的資料部分,5.0以"sparse(names="dept_name?) "作為參考位置
//6.0以html(作為參考位置
long pos1,pos2
pos1 = pos(ls_syntax,'sparse(names="',1)
pos2 = pos(ls_syntax,'"',pos1 +16)
ls_syntax = left(ls_syntax,pos1) + mid(ls_syntax,pos1 +1,pos2 - pos1 +1)
dw_New.create(ls_syntax,ls_error)
if ls_error <> '' then
messagebox('Create Error',ls_error)
else
dw_new.settransobject(sqlca)
dw_new.retrieve()
end if
//pb6,pb7的代碼可以參照pb5自己寫,只是檔案頭和資料窗結束標記不同而已。
uj5u.com熱心網友回復:
PowerBuilder用Create()函式創建動態資料視窗,其語法格式為:dw.Create(Syntax[,ErrString])其中:dw為需創建的動態資料視窗名;Syntax為創建動態資料視窗的語法字串;ErrString為可選引數,用來存放發生錯誤時的錯誤資訊,若忽
略,發生錯誤時系統自動顯示訊息框,一般不符我們需要,所以需定義該引數。
顯然重點在Syntax, PowerBuilder提供LibraryExport()與SyntaxFromSQL()二個函式來達到這個目的:
一、 LibraryExport()函式
功能:從PowerBuilder庫中輸出一個物件,回傳該物件的語法。
語法格式:LibraryExport(LibName,ObjName,ObjType)
其中:LibName 為帶路徑的PowerBuilder庫名,若未指定路徑,則按系統標準搜索路徑搜索;ObjName為匯出物件名,現為LibName中的資料視窗
物件名;ObjType為該物件的型別,現為資料視窗,值為ExportDataWindow!。示例如下:
String ls_DwSyntax,ls_Error
ls_DwSyntax=LibraryExport("C:\PBExam\dy_dw.pbl","d_tbl1", ExportDataWindow!)
//資料視窗dw_1的產生下面將詳細討論,現暫略
dw_1.Create(ls_DwSyntax,ls_Error)
//以下陳述句與下面示例中的相同,故此處略。
LibraryExport()函式是利用已有的資料視窗物件創建動態資料視窗,有一定的使用價值,但不多見。
二、 SyntaxFromSQL()函式
功能:基于SQL的SELECT 陳述句產生創建資料視窗的語法。
語法格式:Transaction.SyntaxFromSQL(SqlString,StyleString,ErrorString)
其中:Transaction.為已連接的事務物件,一般即為SQLCA;SqlString為SQL--SELECT 陳述句;Stylestring為資料視窗的顯示風格字串,比較復
雜,一般常用"Style(Type=Grid)";ErrorString用來存放發生錯誤時的錯誤資訊。
一般來說,SyntaxFromSQL()函式靈活性高、功能強,因此創建動態資料視窗大都使用該函式,下面的示例也是使用該函式。
三、創建動態資料視窗的一般步驟
創建動態資料視窗的一般步驟如下:
1、在某視窗(如w_main)上用滑鼠點建一個資料視窗控制元件(如dw_1),其DataObject為空。
2、構造SyntaxFromSQL()函式的語法字串。這是PowerBuilder動態資料視窗的關鍵,稍為復雜一些,具體做法請見下面實體。
3、用Create()函式創建動態資料視窗dw_1,并用SetTransObject()函式為其分配事務物件,具體做法請見下面實體。
這種方法的主要缺點是必須在設計階段先建資料視窗控制元件,運行時無法增減,這對于一些較為特殊的應用(如設計階段尚不知需幾個資料視窗)
就不太適合了。那如何解決這個問題呢?經過一番摸索并查閱了一些資料,終于找到了二種解決方法,現分別介紹如下: 1、創建一個標準可視資料視窗用戶物件u_d_sample
PowerBuilder6.0/6.5中步驟為:點擊工具列上的UserObject圖示,在彈出的Select User Object視窗中點擊New按鈕,出現New User Object視窗,雙擊其中Visual下的Standard圖示, 在彈出的Select Standard Visual Type視窗中雙擊datawindow選項,即出現User Object(Untitled)視窗,點擊工具列上的Save圖示,彈出的Save User Object視窗,在User Objects: 中輸入u_d_sample回車即進入User Object---u_d_sample視窗,關閉該視窗,標準可視資料視窗用戶物件u_d_sample即告建成。
PowerBuilder7.0中步驟為:點擊工具列上的New圖示,在彈出的New視窗中選擇Object頁面,雙擊其中的Standard Visual圖示, 在彈出的Select Standard Visual Type視窗中雙擊datawindow選項,出現User Object(Untitled)inherited from datawindow視窗,將其右邊的Title欄中的none洗掉,再點擊左邊空白區,然后點擊工具列上的Save圖示,以后的操作步驟與PowerBuilder6.0/6.5大致相同。至于PowerBuilder8.0則與PowerBuilder7.0大體相同,不再贅述。
2、直接定義DataWindow型變數dw_1如下:
DataWindow dw_1
dw_1=Create DataWindow
其實第1種方法還須定義dw_1,形式如下:
u_d_sample dw_1
dw_1=Create u_d_ sample //此句可省略
這二種方法的關鍵都是使用OpenUserObject()函式,其功能即為打開一個用戶物件,語法格式:w_name.OpenUserObject(ObjName[,x,y]) 其中ObjName為需打開的用戶物件名;x、y為用戶物件的打開位置,省略時值均為0。
下面請見具體實體, 該實體在Win98、PowerBuilder8.0/PowerBuilder7.0/PowerBuilder6.5下通過,ODBC資料源已配置,為FoxPro25(可根據需要使用其他資料庫),資料表為bb.dbf。請先建視窗w_main,在其Open事件中寫入以下代碼:(注意:PowerBuilder8.0中先須創建WorkSpace(*.pbw),其他操作基本同PowerBuilder7.0)
//動態資料視窗dw_1創建實體
string lserr,lsSQLstr,lsDWsyntax,lserrC
SQLCA.DBMS="ODBC"
SQLCA.DBParm="ConnectString='DSN=FoxPro25'" //本例使用FoxPro25資料庫,可根據需要用其他資料庫
Connect;
//下面3條陳述句即為關鍵,若dw_1為滑鼠點建請洗掉這3條陳述句,否則會出錯。
DataWindow dw_1 //若采用資料視窗用戶物件u_d_sample,則可改為:u_d_sample dw_1
dw_1=Create DataWindow //若采用資料視窗用戶物件u_d_sample,此句應去除。
OpenUserObject(dw_1)
//Select…As…的As可將列標題顯示為As之后的字符,較為靈活方便。
//可根據實際情況設計生成Select陳述句及Where子句的可視化界面
lsSQLstr="Select A12 As 主管部門,A01 As 法人代碼,mc As 企業名稱,A06 From bb Where A12<'1'"
lsDwsyntax=SQLCA.SyntaxFromSQL(lsSQLstr,"style(type=Grid)",lserr) //構造SyntaxFromSQL()函式
If Len(lserr)>0 Then
//如果構造SyntaxFromSQL()函式失敗,則顯示錯誤資訊并退出
messagebox("錯誤資訊!",lserr)
Return
end if
dw_1.Create(lsDwsyntax,lserrC) //創建動態資料視窗dw_1
If Len(lserrC)>0 Then
//如果創建動態資料視窗dw_1失敗,則顯示錯誤資訊并退出
messagebox("錯誤資訊!",lserrC)
Return
end if
//以下設定dw_1的一些屬性,可根據實際需要設定。
dw_1.X=5
dw_1.Y=5
dw_1.width=1500
dw_1.height=650
dw_1.Visible=True
dw_1.Enabled=True
dw_1.HScrollBar=True
dw_1.VScrollBar=True
//為dw_1分配事務物件SQLCA
dw_1.SetTransObject(SQLCA)
//提取資料
dw_1.Retrieve()
第2種方法的優點大家一看即知,不必費勁去創建一個標準可視資料視窗用戶物件,但存在不足之處:不能在視窗w_main的其他事件或控制元件中參考dw_1。解決方法很簡單:將dw_1定義為實體變數(Instance Variable)。PowerBuilder6.0/6.5中:在視窗畫筆(w_main)的選單上點擊Declareà Instance Variables…,在彈出視窗Declare Instance Variables中輸入datawindow dw_1, 點擊Ok按鈕即告完成。PowerBuilder7.0/8.0中:打開視窗畫筆,在其下半部的視窗Declare Instance Variables中輸入datawindow dw_1, 點擊工具列上的Save圖示即告完成。
uj5u.com熱心網友回復:
都是很好的建議! 值得學習uj5u.com熱心網友回復:
都是很好的建議! 值得學習轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/112145.html
標籤:數據庫相關
下一篇:急!!pb+myodbc的問題
