版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、LotusScript程序開發(fā)經(jīng)驗總結(jié) 內(nèi)容:一、關(guān)于AppendItemValue試試下面這個簡單的例子: Dim ws As New notesuiworkspace Dim uidoc As notesuidocument Dim doc As notesdocument Set uidoc=ws.currentdocument Set doc=uidoc.document For i=1 To 10 Call doc.appenditemvalue(myitem,i) Next Call doc.save(True,True ) 這個程序用以對當前文檔增加10個ITEM,名字都叫myi
2、tem,但值從1到10不等。結(jié)果如何?用調(diào)試方式進行觀察,發(fā)現(xiàn):確實增加了10個ITEM,名字都叫myitem,但值 卻都是1!這與NOTES中的幫助不符。幫助里宣稱: If the document already has an item called itemName$, AppendItemVa lue does not replace it. Instead, it creates another item of the same name, and gives it th e value you specify. 從4.6到5.0結(jié)果都一樣。二、區(qū)分NOTES的前臺類與后臺類由于兩者
3、的使用范圍不一,在寫程序時應(yīng)注意這一點,尤其寫代理時。如果在后臺服務(wù)器運行的代理里加一句: Dim ws As New notesuiworkspace 代理運行日志報錯:Unkown Error. 三、關(guān)于NOTES與OLE的共享域NOTES提供了一個很好的功能:共享域。NOTES用共享域來與OLE應(yīng)用程序交換彼此信息。但除非確有必要與OLE應(yīng)用程序共享信息,建議在設(shè)計表單時,選上:禁止共享域。 筆者曾在一個表單中創(chuàng)建了一個作者域AUTHOR,又在它的RTF域中嵌入MS-WORD文檔: CALL UIDOC.CREATOBJECT(MYDOC,WORD.DOCUMENT.8, 似乎一切都正常
4、。但當我變更了NOTES的作者域AUTHOR(因筆者試圖通過作者域的改變來控制NOTES文檔的修改進而達到流程控制的目的),因為流程的需要,我把它變成了兩個值,在NOTES中顯示為: user1/co1/server1,user2/co1/server2 然后對RTF域中所嵌入的WORD文檔進行了修改,然后退出,保存。結(jié)果問題出現(xiàn)了,NOTES報錯:你不是文檔的作者,不能保存! 什么原因?當時我明明是用user1/co1/server1進行修改的!后來,仔細調(diào)試 ,把AUTHOR的隱藏屬性去掉,仔細觀察,發(fā)現(xiàn)只要激活了RTF域中嵌入的WORD文檔,在RTF域中退出來時AUTHOR的值竟變成了:
5、 user1/co1/server1/co1/server2! 原來,WORD也有一個作者域,名字也叫AUTHOR(似乎是不能改變的)WORD的AUTHOR與NOTES的AUTHOR相互影響(怎么影響?我也不知道),于是變出了上面的這個怪東西!解決辦法,當然,就是把NOTES表單“禁止域交換”了?。∣LE應(yīng)用程序有太多的域,想弄清這些域的名字,似乎不太可能。所以“禁止域交換”應(yīng)是解決這類問題的最好辦法了,竊以為)四、使用NOTES整合OA應(yīng)用、OFFICE彌補NOTES不足NOTES在許多方面,存在不足。如:報表處理、文檔修訂打印等??捎肙FFIC E彌補NOTES不足。如用EXCEL處理含大
6、量數(shù)據(jù)的報表打印,用WORD的修訂功能處理文檔的修訂、打印(顯示所有對文檔的修改)。NOTES的RTF域可以嵌入并顯示OLE文檔,NotesUIDocument的CreateObject和GetObject提供了通過自定義名字訪問相應(yīng)OLE對象的功能;NotesDocument類的EmbeddedObjects和HasEmbeddedObject屬性、NotesRichTextItem類的EmbeddedObject和GetEmbeddedObject則提供了通過后臺類訪問OLE對象的功能;另外,NOTES還單獨提供了函數(shù)CreateObject啟動OLE應(yīng)用。下面這個例子用WORD處理RTF
7、域中文檔的修改。 初建該文檔時,該文檔不進入修訂狀態(tài)。為標注是否已經(jīng)創(chuàng)建了WORD文檔,增加域docadd,以1表明WORD 文檔已創(chuàng)建,以0表明尚未創(chuàng)建(盡管NOTES在幫助中宣稱,當指定名稱的OLE對象不存在時,UIDOC.GetObject會返回空值,但事實上不然:UIDOC.GetObject會報錯并終止程序的運行)。如下便是RTF域的Entering事件: Sub Entering(Source As Field) Dim curws As New notesuiworkspace Dim uidoc As notesuidocument Set uidoc=curws.curren
8、tdocument lnflag=uidoc.fieldgettext(docadd If lnflag=0 Then Call uidoc.fieldsettext(docadd,1 Call uidoc.createobject(worddoc,word.document.8, End If Exit Sub End Sub 當提交后,須記錄并顯示編輯者對WORD文檔的所有修改,故而要將WORD文檔改成修訂狀態(tài)。在提交按鈕中,寫如下程序: Sub Click(Source As Button) Dim ws As New notesuiworkspace Dim uidoc As note
9、suidocument Set uidoc=ws.currentdocument Dim curdoc As notesdocument Set curdoc=uidoc.document Dim worddoc As notesembeddedobject Dim wordapp As Variant Call ws.editdocument(True) lnflag=uidoc.fieldgettext(docadd If lnflag=1 Then Set worddoc=curdoc.embeddedobjects(0) Set wordapp=worddoc.activate(Fal
10、se) Call worddoc.doverb(編輯(&E) wordapp.application.visible=False wordapp.application.activedocument.trackrevisions=True wordapp.application.activedocument.showrevisions=True Call wordapp.application.activedocument.save Call wordapp.application.exit End If Call uidoc.save Call ws.editdocument(False)
11、End Sub 上述修改WORD文檔為修訂狀態(tài)的那段程序,其實可以改為: Set wordapp=uidoc.GetObject(worddoc wordapp.application.visible=False wordapp.application.activedocument.trackrevisions=True wordapp.application.activedocument.showrevisions=True Call wordapp.application.activedocument.save 即通過UIDOC的GetObject方法進行訪問。 但通過OLE對象訪問時,應(yīng)
12、注意拼寫的正確性,尤其是能過指明OLE對象名稱(而不是文件名稱)來創(chuàng)建時,更應(yīng)注意OLE對象名稱的拼寫正確性。否則,錯誤難以預(yù)料。例如,在RTF域的Entering事件中將創(chuàng)建對象語句按如下修改: 把: Call uidoc.createobject(worddoc,word.document.8, 改為: Call uidoc.createobject(worddoc,word.document, OLE對象還是可以創(chuàng)建,一切似乎都很正常。但是當執(zhí)行提交時,若通過EmbeddedObject的訪問文檔,則在Set wordapp=worddoc.activate(False)時出錯:不能儲存
13、對象。 若通過UIDOC的GetObject方法進行訪問,則在 wordapp.application.activedocument.trackrevisions=True時出錯:沒有激活文檔。 五、使用APPENDTOTEXTLISTAPPENDTOTEXTLIST增加文本列表項。使用方法如下: Dim rtitem as notesitem dim uidoc as notesuidocument dim ws as notesuiworkspace dim curdoc as notesdocument set uidoc=ws.currentdocument set curdoc=ui
14、doc.document set rtitem=curdoc.getfirstitem(authors lcreader=curdoc.getitemvalue(readers for i=0 to ubound(lcreader) call rtitem.appendtotextlist(lcreader(i) next 上例把多值域READERS的值逐個追加到另一個多值域AUTHORS中。要實現(xiàn)這種目的,還有一種辦法,即:通過NOTESDOCUMENT的GETITEMVALUE方法分別把兩個域的值放到兩個數(shù)組中,再合并兩個數(shù)組到一個新的數(shù)組中,通過調(diào)用NOTESDOCUMENT的REPLA
15、CEITEMVALUE方法把新數(shù)組的值賦給AUTHORS。但顯然這種方法,編程量要大得多。 也許有人會說,為什么不用字符串的相加,再通NOTESUIDOCUMENT的FIELD SETTEXT把相加后的字符串賦給相應(yīng)的域?按NOTES的說明及其相應(yīng)的幫助來說,這應(yīng)該是可以的(當然,兩個字符串之間的分隔符應(yīng)用設(shè)計域時指定的分隔符分開)。但實際上,這種方法極不可靠!尤其是兩個域的值均為姓名時,實在無法保證這樣運算產(chǎn)生的結(jié)果是怎樣的。NOTES對姓名域有自己的處理辦法,但它怎樣將前臺顯示的姓名轉(zhuǎn)換成后臺的姓名?只怕沒人能搞得清楚。本人有試過這種方法。當只有一兩個值時,這種運算一般不會錯;但當值多時(
16、我試的時候有7個左右),有時一切正常,有時出現(xiàn)的錯誤不可思議:NOTES居然把整個字符串當做一個值!它竟然根本沒有理會域的多值分隔符! 還要注意一點,不須通過NOTESDOCUMENT的SAVE方法,上例所做的變更依然有效。NOTESITEM的變量應(yīng)是指向相應(yīng)文檔的指針(我猜的)。 六、NOTES的ODBC支持缺陷 A NOTES無法支持后臺數(shù)據(jù)庫(如ORACLE)的預(yù)儲程序Stored Procedure,即使新版的6.2也是如此。盡管幫助自稱有提供運行后臺數(shù)據(jù)庫SP的函數(shù)(resultset.execprocedure),但其實并不起作用。 B 如果在一個odbc connection中有
17、多句SQL的話,會出錯:too many cursor。盡管你的sql語句根本不含cursor。Lotus自稱在4.6及以后版本中,這個bug已解決,不過,答案也確是如此七、NOTES的數(shù)組 A 定義數(shù)組 有兩種方式:DIM和REDIM。 DIM定義的是固定個數(shù)、數(shù)據(jù)類型的數(shù)組;而REDIM則不同,它可以定義不同類型的數(shù)據(jù),也可以定義個數(shù)并非固定的數(shù)據(jù)。比較下面幾個例子。 都合法的例子: Dim myarray(5,2) as string Redim myarray(5,2) as string 前者錯誤而后者合法的例子: n=10 n=10 Dim myarray(n) as string
18、 Redim myarray(n,2) as string 另外REDIM還可以定義未定類型的數(shù)組,如:Redim myarray(10) B 數(shù)組個數(shù) 在以DIM或REDIM定義數(shù)組時指定的下標,表示的是訪問該數(shù)組時所容許的最大下標,卻不是該數(shù)組的個數(shù)。實際上,一維數(shù)組個數(shù)總是等于(最大下標+1),訪問時是通過下標從0開始逐個訪問的。比如:Dim myarray(5) As String定義的數(shù)組元素有6個,分別是:myarray (0)、 myarray(1)、myarray(2)、myarray(3)、myarray(4)、myarray(5)。 再如:Redim thisarray(2
19、,5) As String 實際上定義了一個(2+1)*(5+1)=1 8的二維數(shù)組。 既然如此,那么,可不可義定義一個只有一個元素的數(shù)組呢?答案是:不可以。 如前所說,Redim thisarray(1)定義的數(shù)組實際上有(1+1)個數(shù)組元素,但類似于: Redim thisarray(0)的語法,NOTES又認為是錯誤的。所以,不能定義一個只有一個數(shù)組元素的數(shù)組。 其實,以上說的只是其默認狀況。其實,定義數(shù)組可以通過定義下標的起止從而達到定義數(shù)組的個數(shù)甚至下標的起止編號的。比如:Redim thisarray(1980 to1990)就 定義了一個含有11個元素的數(shù)組,下標從1980到19
20、90。 C 關(guān)于UBOUND函數(shù) UBOUND返回的是一維數(shù)組的最大下標,而不是元素個數(shù)。 比如:Dim Myarray(5) As Integer,那么UBOUND(Myarray)返回的值是5,而不是6。 UBOUND也可以應(yīng)用于二維數(shù)組。應(yīng)用于二維數(shù)組時,它返回的是第一個下標的最大值。 比如:Dim Myarray(6,3) As Integer, 那么UBOUND(Myarray)返回的值是6,而不是7,更不是18(6*3=18)。 若要返回第二個下標的最大值,則使用:UBOUND(Myarray,2)。 與UBOUND相對應(yīng)的是另外一個函數(shù):LBOUND,它返回數(shù)組的最小下標。與UB
21、OUND類似,LBOUND(Myarray,2)則返回數(shù)組MYARRAY的第二個下標的最小值。所以,準確地說,一維數(shù)組Myarray的元素個數(shù)為:UBOUND(Myarray)-LBOUND(Myarray)+1,而二維數(shù)組的元素個數(shù)則為: (UBOUND(Myarray)-LBOUND(Myarray)+1)*(UBOUND(Myarray,2)-LBOUND(Myarray,2)+1) 多維數(shù)組依此類推。 D 返回數(shù)組的函數(shù) 可以定義一個函數(shù),使其返回數(shù)組。宣告函數(shù)時只要宣告它返回Variant型即可 。如下例: Function db_string(Byval fdname As Str
22、ing) As Variant fdnum=Len(fdname) Redim lcarray(fdnum,2) As String lcarray(0,0)=thisstr lcarray(0,1)=, lcarray(0,2)=, . db_string=lcarray 使函數(shù)返回數(shù)組lcarray的值 End Function 在調(diào)用函數(shù)時,以如下方式調(diào)用: thisstring=AAAAAAAA Dim Thisarray As Variant thisarray=Db_string(thisstring) print thisarray(0,0) 八、NOTES的ODBC:(LS:D
23、O) A 使用LotusScript編寫ODBC程序時需要掌握的幾個類:ODBCConnection、ODBCQ uery、與 ODBCResultSet。通常做法為: Set con = New ODBCConnection Dim dbqry As New ODBCQuery Dim dbresult As New ODBCResultSet ret=con.ConnectTo(DBSOURCENAME,DBUSERNAME,DBPASS) If con.isconnected=False Then ret1=Msgbox(數(shù)據(jù)庫無法連接,請洽系統(tǒng)管理員,48,提示信息 odbc_inse
24、rt=-2 Exit Function End If dbqry.sql=select * from THISTABLE where THISTABLE.ID=THISID Set dbqry.Connection = con Set dbresult.query=dbqry dbresult.execute %REM 通過dbresult訪問關(guān)系數(shù)據(jù)庫:取值、更新數(shù)據(jù)庫 %END REM status=dbresult.close(db_commit) ret=con.disconnect B 通過ODBCResultSet更新數(shù)據(jù)(插入、刪除、修改),可以有兩種方式。一種方式如上例, 對O
25、DBCQry.sql賦為查詢語句,然后能過ODBCResultSet類的ADDROW、UPDATEROW、DELETEROW 及SETVALUE等方法更新關(guān)系型數(shù)據(jù)庫。如下例,對THISTABLE增加一筆記錄,并賦字符串型 字段field1的值為test: Set con = New ODBCConnection Dim dbqry As New ODBCQuery Dim dbresult As New ODBCResultSet ret=con.ConnectTo(DBSOURCENAME,DBUSERNAME,DBPASS) If con.isconnected=False Then r
26、et1=Msgbox(數(shù)據(jù)庫無法連接,請洽系統(tǒng)管理員,48,提示信息 odbc_insert=-2 Exit Function End If dbqry.sql=select * from THISTABLE where 1=0 Set dbqry.Connection = con Set dbresult.query=dbqry dbresult.execute Call dbresult.addrow Call dbresult.setvalue(field1,test Call dbresult.updaterow status=dbresult.close(db_commit) ret
27、=con.disconnect 由于updaterow方法只有對只含一筆記錄的ODBCResultSet才有效(多筆時會報錯),故而 在SQL中的條件中只有一個永遠不成立的條件:1=0,以保證在執(zhí)行addrow之后在updaterow 之前ODBCResultSet中只有一筆。 另外一種方式是直接用SQL語句更新數(shù)據(jù)庫。它的好處在于一次可以更新多筆,而且比較靈活,壞處則在于必須考慮DOMINO與后臺關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)類型的轉(zhuǎn)換。如下例,可以達到與上例一樣的效果。 Set con = New ODBCConnection Dim dbqry As New ODBCQuery Dim dbresult As New ODBCResultSet ret=con.ConnectTo(DBSOURCENAME,DBUSERNAME,DBPASS) If con.isconnected=False Then ret1=Msgbox(數(shù)據(jù)庫無法連接,請洽系統(tǒng)管理員,48,提示信息 odbc_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 常山縣產(chǎn)銷掛聯(lián)合作協(xié)議
- 天津市高校畢業(yè)生就業(yè)協(xié)議范文
- 銀行打包放款合同
- 2025年 國際機票代理銷售合同
- 2025出租車轉(zhuǎn)合同
- 2025正規(guī)借款合同大全
- 2025資金周轉(zhuǎn)借款合同范本
- 2025年度年度創(chuàng)新型辦公空間租賃合同3篇
- 二零二五年度公廁綠化景觀設(shè)計施工承包合同模板3篇
- 二零二五年度農(nóng)產(chǎn)品代加工與農(nóng)業(yè)科技研發(fā)合同3篇
- 外研版四年級英語下冊(一年級起點)全冊完整課件
- MF47萬用表組裝與檢測教學教案
- 防止電力生產(chǎn)事故的-二十五項重點要求(2023版)
- 教研室主任崗位申請書
- 職業(yè)培訓(xùn)師的8堂私房課:修訂升級版
- 改擴建工程施工圖設(shè)計說明
- 壯族文化的靈魂廣西花山巖畫
- 概算實施方案
- 單片機英文資料+英文文獻
- 中國古典文獻學(全套)
- 內(nèi)燃機車常見故障分析及處理1733
評論
0/150
提交評論