|
導(dǎo)讀數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應(yīng)... 數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。 在通常的Server/Client方式MIS開發(fā)中,總是有沒完沒了的報表需要制作,調(diào)試報表花費(fèi)的時間也是最多而且乏味,還常常不能滿足客戶的要求。要是能夠讓用戶自己調(diào)整報表的格式和內(nèi)容,然后將它保存下來,程序下次啟動時它自動調(diào)用保存了的報表格式那有多好。本人通過如下方法最終實(shí)現(xiàn)了用的要求。 PB(PowerBuilder)有一種以PSR結(jié)尾的特殊的保存報表的文件格式(本文簡稱作PSR文件)。根據(jù)數(shù)據(jù)窗口可以直接讀取PSR文件生成報表的原理,程序通過生成PSR文件,實(shí)現(xiàn)動態(tài)報表格式的保存。 一、實(shí)現(xiàn)原理: PB中的報表其實(shí)就相當(dāng)于是數(shù)據(jù)窗口。 第一步,動態(tài)報表的實(shí)現(xiàn)。通過設(shè)置數(shù)據(jù)窗口對象(dataobject)中文本、列等的Resizeable和moveable屬性為1來實(shí)現(xiàn)對象位置的拖動控制,通過數(shù)據(jù)窗口的Modify函數(shù)實(shí)現(xiàn)對象值的更改(包括增加和刪除)。 第二步,報表格式的保存。在一個應(yīng)用當(dāng)中,數(shù)據(jù)窗口對象的名稱總是唯一的,將每一個數(shù)據(jù)窗口對象轉(zhuǎn)化成PSR文件存于數(shù)據(jù)庫表中。在窗口打開時,程序先校驗(yàn)報表格式是否存在。如果存在,先將報表格式讀取出來放在一個臨時文件當(dāng)中,然后設(shè)置數(shù)據(jù)窗口(datawindow)的數(shù)據(jù)對象(dataobject)為這個報表文件,然后提取數(shù)據(jù);如果不存在,直接提取數(shù)據(jù)即可。 二、實(shí)現(xiàn)過程: 1、建立一個數(shù)據(jù)庫表用以保存報表格式文件。 表名:dyn_report DwobjectVarchar2(20)數(shù)據(jù)窗口對象名稱Primary key RptitleVarchar2(80)報表的標(biāo)題名稱 MemoLong raw 報表格式 2、建立一個窗口w_temp。 定義實(shí)例變量如下: string is_dwtype,is_dwobject //保存報表中對象的類型及名稱 控件名稱 控件含義 Dw_print數(shù)據(jù)窗口對象 Cb_exit退出按鈕 Cb_savereport 報表格式保存按鈕 3、在窗口的OPEN事件中加入如下代碼, 校驗(yàn)報表格式是否存在,如果存在讀取定義好的報表格式到數(shù)據(jù)窗口。 blob emp_pic long ll_handle string ls_dwobject,ls_reportfile,ls_path ls_dwobject = dw_print.dataobject //判斷是否存在該數(shù)據(jù)窗口的報表格式 select count(*) into:ll_count from dyn_report where dwobject =:ls_dwobject; if ll_count>0 then //讀取報表格式文件到大文本變量 selectblob memo into:emp_pic from dyn_report where dwobject =:ls_dwobject; //創(chuàng)建psr臨時文件到硬盤 ls_reportfile = ’\temp7089.psr’ ll_handle = FileOpen(is_reportfile,StreamMode!,write!,LockWrite!,Replace!) FileWrite(ll_handle,emp_pic) FileClose(ll_handle) dw_print.dataobject = ls_reportfile dw_print.settransobject(sqlca) else Dw_print.settransobject(sqlca) End if Dw_print.retrieve() 4、報表格式的保存。通過Cb_savereport按鈕的clicked實(shí)現(xiàn)。 string ls_filename long ll_count blob Emp_id_pic ls_filename = "temp70201.psr" //保存報表格式到硬盤臨時文件 dw_print.saveas(ls_filename,PSReport! ,false) sqlca.autocommit = true select count(*) into :ll_count from dyn_report where dwobject =:is_dwobject; if ll_count =0 then insert into dyn_report(dwobject,rptitle) values(:is_dwobject,:ls_filename,:ls_path); end if //從硬盤臨時文件讀取數(shù)據(jù)保存到數(shù)據(jù)庫表中 emp_id_pic = of_readbmpfile(ls_filename)//該函數(shù)將二進(jìn)制文件內(nèi)容讀到大文本對象中 //更新數(shù)據(jù)庫 UPDATEBLOB dyn_report SET memo = :Emp_id_pic where dwobject = :is_dwobject; sqlca.autocommit = false 5、動態(tài)報表的實(shí)現(xiàn)。通過數(shù)據(jù)窗口dw_print的clicked事件捕獲數(shù)據(jù)窗口中對象,并將對象名存放在實(shí)現(xiàn)變量is_dwobject中,為下一步修改報表作準(zhǔn)備。 string ls_type,ls_dwoname //得到對象類型和名稱 ls_type = trim(upper(dwo.type)) ls_dwoname = trim(dwo.name) is_dwtype = ls_type choose case ls_type case "TEXT","CommandButton","GROUPBOX" is_dwobject = ls_dwoname //設(shè)置為可以拖動和改變大小,其它類同 this.modify(ls_dwoname+".Resizeable=’"+"1’") this.modify(ls_dwoname+".moveable="+"1") case "LINE" //直線對象不能通過設(shè)置Resizeable和moveable屬性進(jìn)行調(diào)整,必須通過其它路徑 is_dwobject = ls_dwoname case "RECTANGLE","ELLIPSE","GRAPH","BITMAP" is_dwobject = ls_dwoname this.modify(ls_dwoname+".Resizeable=’"+"1’") this.modify(ls_dwoname+".moveable=’"+"1’") case "COLUMN","COMPUTE" is_dwobject = ls_dwoname this.modify(ls_dwoname+".Resizeable=’"+"1’") this.modify(ls_dwoname+".moveable=’"+"1’") end choose 然后再通過modify()函數(shù)可以實(shí)現(xiàn)基本的動態(tài)報表操作,這一類的文章較多,PB中也有大量的例子可直接使用,在此這不再累述。 6、在cb_exit按鈕的clicked()事件中加入:close(parent)。 7、在應(yīng)用的open事件中加入: open(w_temp)。然后保存并運(yùn)行,大功告成啦! 8、本程序在PB7.0加Oracle8.05下調(diào)試通過。 全新的路由器不僅讓你更穩(wěn)定快速地連接無線網(wǎng)絡(luò),更可以讓家中的智能設(shè)備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!