Lotus Notes應用中多頁文字的處理

genusBIT發表於2010-02-23

日常辦公應用中,大量的文件處理不可避免要碰到多頁格式文字,而在以文件為主要處理物件的應用程式裡,也會碰到這一問題。Lotus Notes的應用程式中,表單是生成文件的模板,如果要在文件中增加表格行,就必須動態改變表單,所以在Lotus Notes中實現格式文件的多頁顯示仍有其實用意義。

Lotus Domino/Notes是Lotus公司推出的群件系統。通過Lotus Notes的支援,Domino能夠為Internet/Intranet使用者提供強大的工作流、訊息傳遞、協同計算、資訊檢索和資訊釋出等應用。目前,已經有越來越多的公司企業、政府機關使用Lotus Domino/Notes作為協同工作平臺,有效地實現了辦公自動化。

多頁文字的顯示問題

在辦公應用中,大量的文件處理不可避免要碰到多頁格式文字。例如:合同的正本有相應的幅面尺寸規定,一張合同只能輸入有限的資訊量,因此會碰到一個合同裡的交易產品種類數量過多,必須用多頁文字顯示。在以文件為主要處理物件的應用程式裡,也會碰到這一問題,但由於文件在電腦中不受紙面的限制,可以通過對錶格增行以得到足夠的空間,這樣即節省了儲存空間,山可不重複儲存單據的頭資訊。

Lotus Notes的應用程式中,表單是生成文件的模板,如果要在文件中增加表格行,就必須動態改變表單。因為Lotus Notes應用程式中的表單是靜態的,故動態增刪表格行不太方便。另外,考慮到網路普及的今天仍然脫離不了必要的紙面憑證,我們有時仍需列印出大量的檔案,所以在Lotus Notes中實現格式文件的多頁顯示仍有其實用意義。

實現文件的多頁顯示的前提是:在資訊量超過一個表單頁面所能顯示的資訊的時候,能夠產生下一頁,並將文件的上一頁的頭資訊內容複製到當前頁(以一個合同為例,合同的供方及相關資訊、需方及相關資訊、簽訂時間、合同號、合同細則都屬於頭資訊,對於一次交易而言,每頁合同的這些資訊應該相同),同時能增加當前頁的頁碼,並保證一次交易中只有一個惟一標識(通常可用合同號),以確保在瀏覽上下頁時可以開啟正確的文件。

實現多頁文字的顯示

現假設合同表單域名為“Contract”,頁碼域名為“pageNo”,頁數域名為“pages”,合同號域名為“contractNo”。

為了保證填寫下一張頁面時,能得到上一張頁面的值,必須在“Contract”表單的屬性裡選擇“公式繼承選定文件的數值”。這裡最關鍵的是要繼承合同號、頁碼和頁數資訊。為了在新的頁面裡得到上述資訊的正確值,還應再在上述域的預設值里加上一些公式。在“contractNo”域裡的預設值為:contractNo。可以原封不動地把上一頁的合同號拷貝到新的頁面,以保證是同一筆交易。在“pageNo”域裡的預設值為:

@if(@environment("isNext")="True";

@do(@environment("isNext";"");pageNo+1);1)。


上面的公式可以辨別當前是第一頁還是繼續填寫的頁,其中“pages”域裡的預設值為pageNo。

需要注意的是,雖然繼續填寫的新頁的頁數已經增加了,但是並沒有改變前面所填頁面上的頁數值。從符合邏輯的角度來說,前面已填寫頁面的頁數,應該在最後所有頁面填完之後才新增上去,所以在新填寫的頁面未儲存時不能將頁數統一為新頁上的頁數。

在“繼續填寫下一頁”按鈕按下的時候,執行的操作包括兩個:儲存並關閉當前頁面和開啟新的頁面。這裡採用Lotus Script編寫程式碼,詳細程式碼如下:

Dim workspace As New NotesUIWorkspace

Dim uidoc As NotesUIDocument

Dim session As NotesSession

Set uidoc = workspace.CurrentDocument

If uidoc.editmode=True Then

Call uidoc.save

End If

Call session.SetEnvironmentVar("isNext","True")


'設定用於區分是否下一頁的標誌

Call uidoc.close

Call workspace.ComposeDocument("","","Contract")


這裡在儲存的時候還要保證某些資訊(如頁數)在該筆交易下的所有頁面保持同步。這就需要在儲存完當前頁面後修改其他頁面的相應資訊。這些操作的程式碼可以在合同表單的“postsave”事件裡寫。具體程式碼如下:

Sub Postsave(Source As Notesuidocument)

Dim session As New notessession

Dim db As notesdatabase

Dim doccol As notesdocumentcollection

Dim datetime As notesdatetime

Dim doc As notesdocument

Set db=session.currentdatabase

formsearch$="form=""Contract""%26amp;%26amp;contractNo="""+source.document.contractN o(0)+""""

Set doccol=db.search(formsearch$,datetime,0)

If doccol.count>0 Then

For i=1 To doccol.count

If i=1 Then

Set doc=doccol.getfirstdocument

Else

Set doc=doccol.getnextdocument(doc)

End If

If doc.universalid<>source.document.universalid Then

doc.pages=source.document.pages(0)

'可以設定其他需要欄位的值

Call doc.save(True,False)

'使之與所有頁面統一

End If

Next

End If

End Sub


現在,多頁文件已經建立好了,還需要對它進行瀏覽。瀏覽的方式可以為“上下翻頁式”或“到指定頁式”,兩者原理是一樣的,這裡以瀏覽下一頁為例加以說明。

首先,建立一個按鈕“瀏覽下一頁”,並在按鈕的click事件裡寫以下Lotus Script程式碼:

Dim workspace As New NotesUIWorkspace

Dim uidoc As NotesUIDocument

Dim session As New NotesSession

Dim db As NotesDatabase

Dim doc As NotesDocument

Dim doccol As NotesDocumentCollection

Dim datetime As Notesdatetime

Set uidoc=workspace.CurrentDocument

Set db=session.currentdatabase

SearchFormula="Form=""Contract""%26amp;%26amp;contractNo="""+uidoc.document.contract

No(0)+"""%26amp;%26amp;p ageNo="""+Cstr(uidoc.document.pageNo(0)+1)+"""" '可以指定任意頁

If uidoc.editmode=True Then

Call uidoc.save

End If

Call uidoc.close

Set doccol= db.search(SearchFormula,datetime,0)

Set doc=doccol.getfirstDocument

Set uidoc=workspace.EditDocument( False , doc)


至此,多頁文字的建立與瀏覽已經介紹完了,但是考慮到有刪除部分頁的可能,所以對於刪除指定頁的處理也是必需的。刪除指定頁的基本過程應包括:刪除指定頁的文件、查詢所有該交易的文件、修改這些文件的頁數域和修改頁碼域值大於刪除頁頁碼的文件頁碼域。

以下是實現這一過程的Lotus Script函式代理:

Function deletedocument(doc As notesdocument)

Dim session As New notessession

Dim db As notesdatabase

Dim doccol As notesdocumentcollection

Dim datetime As notesdatetime

Set db=session.currentdatabase

contractno$=doc.contractNo(0)

pageno=doc.pageNo(0)

If doc.remove(0) Then

formsearch="form=""contract""%26amp;%26amp;contractNo=""

"+contractno$+""""

Set doccol=db.search(formsearch$,datetime,0)

For i=1 To doccol.count

If i=1 Then

Set doc=doccol.getfirstdocument

Else

Set doc=doccol.getnextdocument(doc)

End If

doc.pages=doc.pages(0)-1

If doc.pageNo(0)>pageno Then

doc.pageNo=doc.pageNo(0)-1

End If

Call doc.save(True,False)

Next

End If

End Function


以上是在Lotus Notes應用中,對多頁文字的一種處理方法,筆者希望讀者在實際應用開發中靈活使用。

 

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

相關文章