使用Web Datawindow ActiveX實現Web頁面的列印功能

hljhrbsjf發表於2007-09-19
其實,使用ActiveX本身實在是沒有什麼難度,Datawindow大家都很熟悉。這也是我沒有把它寫下來的動力的原因之一。不過在實施過程中,確實 還碰到過一些問題,也有一些心得,也還有解決不了的問題存在。我就做個總結吧,今天吃的比較飽,有些絮絮叨叨,希望大家忍了,哈哈。

大家都知道,Web頁面中做列印一般就兩種方法:
首先是寫純Web的列印,也就是使用Web自己的列印功能,用ExecWB命令,直接列印頁面。說實在的我對HTML的語法是有些怵的,也只能算小半桶 水,經過一些瞭解,知道直接做Web頁面列印難度對我來說很大,尤其是你要實現多層次的分組合計等等功能。專案緊迫也沒有這個時間。

那接下來,只能選擇客戶端列印控制元件了,我還真想去買一個好的控制元件用用,那多好啊,程式碼可以寫的少些,程式碼執行效率,開發效率肯定也高,可惜我深知Boss的為人,這幾K錢就給他省了吧。

幸好我一直對PB的Web開發方案一直保持著興趣,本人在n年前從PB6.5開始起就研究Web.PB,Window ActiveX,Datawindow ActiveX,到PowerJ,再到後來的Web Datawindow,雖然說,有些東東看起來象是玩具,有些麼閉門造車,無法流行。不過勉為其難,土法上馬還是可以解決些問題的。

本來Web Datawindow還象個樣子,不過Web Datawindow需要EAServer的支援。那就罷了,只有選擇Web Datawindow ActiveX了。說實在的,它作為一個Web客戶端列印工具還是非常好的,因為Datawindow功能是太強大了,哪怕ActiveX沒有包含 Datawindow全部的功能,但是也足夠列印使用了。其缺點就是介面比較難看單調,配不上那絢麗的Web頁面效果。

進入正題。
首先要說明一下,我選擇的是PB10版本的ActiveX控制元件。因為據我測試,從PB8到10都有些問題,PB8的ActiveX不支援WinXP, PB9的ActiveX竟然是已經過期了,IE上裝不了(當然可能和我用盜版PB有關係,哦彌陀佛,罪過),而PB10是不支援Win98系統的。最後只 能不管Win98了,反正現在很少人用98了。

首先必須有個頁面來安裝控制元件,把如下程式碼新增到html頁面中。別忘記了將psdwc100.cab放到相應伺服器目錄下,因為Cab包比較大(2M多),這個頁面作為一個獨立的安裝頁面比較好。

安裝Web DataWindow控制元件失敗!


頁面寫好了,釋出到Web伺服器,在客戶端訪問這個頁面,安裝外掛即可。

接下來在列印頁面w_print.jsp中引用此控制元件:














以下都是javacript指令碼:
然後,設定列印用的dataobject:
dw_print.SourceFileName="/tmsweb/pdwo/trafficorder_record.pbd"
dw_print.DataWindowObject="trafficorder_record"

//我所使用的是有兩個子報表的NestReport作為例子,其他報表更簡單
//這裡獲取子報表控制元件
dw_print.GetChild("dw_header")
print_h=dw_print.GetChildObject()
dw_print.GetChild("dw_detail")
print_d=dw_print.GetChildObject()

//開始填入列印用的資料
//因為是ActiveX客戶端控制元件,因此不方便直接連線資料庫來取資料,所以我這裡是首先透過Web的方式
//獲取到列印用的資料到客戶端的一個類似datawindow的物件中,然後複製給dw_print的。
print_h.reset();print_d.reset()
dw_header.rowscopy_a(1,1,print_h)
dw_detail.rowscopy_a(1,dw_detail.rowcount(),print_d)
其中,dw_header,dw_detail是頁面中的htc客戶端控制元件,rowscopy_a我想就不用解釋了,後續會貼出其完整程式碼。

在rowscopy後,如果還需要對dw_print中的某些欄位賦值,則比如呼叫:
setitem(print_h,1,"year_1",“2006”)
其中setitem方法是一個js函式,稍後貼出其程式碼。

現在,dw_print的子報表的資料都已經填充好了,可以預覽列印了,
因為這裡是複合報表,datawindow自動預覽的,因此就不需要設定預覽屬性了,
如果是一般的grid型別視窗,最好是設定預覽屬性,這樣可以看得出頁面的大小,列印頁數等。
設定的時候用dw_print.modify()方法,用dw_print.Object.DataWindow.Print.Preview的方式是不行的,
Activex不支援。

最後,就可以列印了。
if (confirm("是否列印?"))
{
dw_print.print(false)
}

很簡單,是不是?

附錄:
setitem方法:
function setitem(dw_print,row,column,value)
{
var datavalue,datatype

datatype = dw_print.Describe(column+".Coltype")

if (datatype.indexOf("char",0)>=0)
{
datavalue=value
}else if (datatype.indexOf("decimal",0)>=0 || datatype.indexOf("number",0)>=0||datatype.indexOf("long",0)>=0)
{
datavalue=parseFloat(value)
}else if (datatype.indexOf("integer",0)>=0)
{
datavalue=parseInt(value)
}else if (datatype.indexOf("date",0)>=0)
{
alert("有系統不支援的Date,Datetime型別["+column+"],請檢查列印資料來源")
}else
{
datavalue=value
}

dw_print.setitem(row,column,datavalue);
}

rowscopy_a方法:
function RowsCopy_A(ai_start,ai_end,aobj_dw)
{
var ll_columncount
var datatype
var datavalue

if (ai_start<=0) return -1;
if (ai_end >RowCount()) ai_end=RowCount();

ll_columncount=getColumnCount();
for (var i=ai_start;i<=ai_end;i++)
{
row=aobj_dw.insertrow(0);
for (var k=0;k {
if ((Columns[k].ColumnType!=null)&&
(Columns[k].ColumnType.Trim().toLowerCase()=="computed")&&
(typeof(Columns[k].ColumnType)!="undefined")) continue
datatype = aobj_dw.Describe(Columns[k].ColumnName+".Coltype")
if (datatype.indexOf("char",0)>=0)
{
datavalue=getItemWithID(i,k+1)
}else if (datatype.indexOf("decimal",0)>=0 || datatype.indexOf("number",0)>=0||datatype.indexOf("long",0)>=0)
{
datavalue=parseFloat(getItemWithID(i,k+1))
}else if (datatype.indexOf("integer",0)>=0)
{
datavalue=parseInt(getItemWithID(i,k+1))
}else if (datatype.indexOf("date",0)>=0)
{
alert("有系統不支援的Date,Datetime型別["+Columns[k].ColumnName+"],請檢查列印資料來源")
}else
{
datavalue=getItemWithID(i,k+1)
}
datavalue = getDisplayValue(row,Columns[k].ColumnName,datavalue)
aobj_dw.setitem(row,Columns[k].ColumnName,datavalue);
}
}
return 1;
}

這裡要說明一下,現在維一解決不了的問題是,我在javascript中無法找到一個型別能夠匹配Datawindow的datatime型別列,而如果 不轉換直接賦值,是沒有效果的。可能是我對javascript的研究還不夠吧?如果有那位兄弟知道解決辦法,請告訴我。我現在只能在pbl中把 datatime列都先用convert轉換為string型別。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/631872/viewspace-970066/,如需轉載,請註明出處,否則將追究法律責任。

相關文章