版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、LotusScript程序開發(fā)經(jīng)驗(yàn)總結(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 ) 這個程序用以對當(dāng)前文檔增加10個ITEM,名字都叫myi
2、tem,但值從1到10不等。結(jié)果如何?用調(diào)試方式進(jìn)行觀察,發(fā)現(xiàn):確實(shí)增加了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)注意這一點(diǎn),尤其寫代理時。如果在后臺服務(wù)器運(yùn)行的代理里加一句: Dim ws As New notesuiworkspace 代理運(yùn)行日志報錯: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、。但當(dāng)我變更了NOTES的作者域AUTHOR(因筆者試圖通過作者域的改變來控制NOTES文檔的修改進(jìn)而達(dá)到流程控制的目的),因?yàn)榱鞒痰男枰?,我把它變成了兩個值,在NOTES中顯示為: user1/co1/server1,user2/co1/server2 然后對RTF域中所嵌入的WORD文檔進(jìn)行了修改,然后退出,保存。結(jié)果問題出現(xiàn)了,NOTES報錯:你不是文檔的作者,不能保存! 什么原因?當(dāng)時我明明是用user1/co1/server1進(jìn)行修改的!后來,仔細(xì)調(diào)試 ,把AUTHOR的隱藏屬性去掉,仔細(xì)觀察,發(fā)現(xiàn)只要激活了RTF域中嵌入的WORD文檔,在RTF域中退出來時AUTHOR的值竟變成了:
5、 user1/co1/server1/co1/server2! 原來,WORD也有一個作者域,名字也叫AUTHOR(似乎是不能改變的)WORD的AUTHOR與NOTES的AUTHOR相互影響(怎么影響?我也不知道),于是變出了上面的這個怪東西!解決辦法,當(dāng)然,就是把NOTES表單“禁止域交換”了?。∣LE應(yīng)用程序有太多的域,想弄清這些域的名字,似乎不太可能。所以“禁止域交換”應(yīng)是解決這類問題的最好辦法了,竊以為)四、使用NOTES整合OA應(yīng)用、OFFICE彌補(bǔ)NOTES不足NOTES在許多方面,存在不足。如:報表處理、文檔修訂打印等??捎肙FFIC E彌補(bǔ)NOTES不足。如用EXCEL處理含大
6、量數(shù)據(jù)的報表打印,用WORD的修訂功能處理文檔的修訂、打?。@示所有對文檔的修改)。NOTES的RTF域可以嵌入并顯示OLE文檔,NotesUIDocument的CreateObject和GetObject提供了通過自定義名字訪問相應(yīng)OLE對象的功能;NotesDocument類的EmbeddedObjects和HasEmbeddedObject屬性、NotesRichTextItem類的EmbeddedObject和GetEmbeddedObject則提供了通過后臺類訪問OLE對象的功能;另外,NOTES還單獨(dú)提供了函數(shù)CreateObject啟動OLE應(yīng)用。下面這個例子用WORD處理RTF
7、域中文檔的修改。 初建該文檔時,該文檔不進(jìn)入修訂狀態(tài)。為標(biāo)注是否已經(jīng)創(chuàng)建了WORD文檔,增加域docadd,以1表明WORD 文檔已創(chuàng)建,以0表明尚未創(chuàng)建(盡管NOTES在幫助中宣稱,當(dāng)指定名稱的OLE對象不存在時,UIDOC.GetObject會返回空值,但事實(shí)上不然:UIDOC.GetObject會報錯并終止程序的運(yùn)行)。如下便是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 當(dāng)提交后,須記錄并顯示編輯者對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)的那段程序,其實(shí)可以改為: 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方法進(jìn)行訪問。 但通過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)建,一切似乎都很正常。但是當(dāng)執(zhí)行提交時,若通過EmbeddedObject的訪問文檔,則在Set wordapp=worddoc.activate(False)時出錯:不能儲存
13、對象。 若通過UIDOC的GetObject方法進(jìn)行訪問,則在 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中。要實(shí)現(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)該是可以的(當(dāng)然,兩個字符串之間的分隔符應(yīng)用設(shè)計域時指定的分隔符分開)。但實(shí)際上,這種方法極不可靠!尤其是兩個域的值均為姓名時,實(shí)在無法保證這樣運(yùn)算產(chǎn)生的結(jié)果是怎樣的。NOTES對姓名域有自己的處理辦法,但它怎樣將前臺顯示的姓名轉(zhuǎn)換成后臺的姓名?只怕沒人能搞得清楚。本人有試過這種方法。當(dāng)只有一兩個值時,這種運(yùn)算一般不會錯;但當(dāng)值多時(
16、我試的時候有7個左右),有時一切正常,有時出現(xiàn)的錯誤不可思議:NOTES居然把整個字符串當(dāng)做一個值!它竟然根本沒有理會域的多值分隔符! 還要注意一點(diǎn),不須通過NOTESDOCUMENT的SAVE方法,上例所做的變更依然有效。NOTESITEM的變量應(yīng)是指向相應(yīng)文檔的指針(我猜的)。 六、NOTES的ODBC支持缺陷 A NOTES無法支持后臺數(shù)據(jù)庫(如ORACLE)的預(yù)儲程序Stored Procedure,即使新版的6.2也是如此。盡管幫助自稱有提供運(yùn)行后臺數(shù)據(jù)庫SP的函數(shù)(resultset.execprocedure),但其實(shí)并不起作用。 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ù)組時指定的下標(biāo),表示的是訪問該數(shù)組時所容許的最大下標(biāo),卻不是該數(shù)組的個數(shù)。實(shí)際上,一維數(shù)組個數(shù)總是等于(最大下標(biāo)+1),訪問時是通過下標(biāo)從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 實(shí)際上定義了一個(2+1)*(5+1)=1 8的二維數(shù)組。 既然如此,那么,可不可義定義一個只有一個元素的數(shù)組呢?答案是:不可以。 如前所說,Redim thisarray(1)定義的數(shù)組實(shí)際上有(1+1)個數(shù)組元素,但類似于: Redim thisarray(0)的語法,NOTES又認(rèn)為是錯誤的。所以,不能定義一個只有一個數(shù)組元素的數(shù)組。 其實(shí),以上說的只是其默認(rèn)狀況。其實(shí),定義數(shù)組可以通過定義下標(biāo)的起止從而達(dá)到定義數(shù)組的個數(shù)甚至下標(biāo)的起止編號的。比如:Redim thisarray(1980 to1990)就 定義了一個含有11個元素的數(shù)組,下標(biāo)從1980到19
20、90。 C 關(guān)于UBOUND函數(shù) UBOUND返回的是一維數(shù)組的最大下標(biāo),而不是元素個數(shù)。 比如:Dim Myarray(5) As Integer,那么UBOUND(Myarray)返回的值是5,而不是6。 UBOUND也可以應(yīng)用于二維數(shù)組。應(yīng)用于二維數(shù)組時,它返回的是第一個下標(biāo)的最大值。 比如:Dim Myarray(6,3) As Integer, 那么UBOUND(Myarray)返回的值是6,而不是7,更不是18(6*3=18)。 若要返回第二個下標(biāo)的最大值,則使用:UBOUND(Myarray,2)。 與UBOUND相對應(yīng)的是另外一個函數(shù):LBOUND,它返回數(shù)組的最小下標(biāo)。與UB
21、OUND類似,LBOUND(Myarray,2)則返回數(shù)組MYARRAY的第二個下標(biāo)的最小值。所以,準(zhǔn)確地說,一維數(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中的條件中只有一個永遠(yuǎn)不成立的條件:1=0,以保證在執(zhí)行addrow之后在updaterow 之前ODBCResultSet中只有一筆。 另外一種方式是直接用SQL語句更新數(shù)據(jù)庫。它的好處在于一次可以更新多筆,而且比較靈活,壞處則在于必須考慮DOMINO與后臺關(guān)系數(shù)據(jù)庫之間的數(shù)據(jù)類型的轉(zhuǎn)換。如下例,可以達(dá)到與上例一樣的效果。 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年辦公樓外墻施工保密條款合同協(xié)議
- 辦公樓會議室防滑合同(商務(wù)活動2025)
- 木材工廠出售合同范本
- 安裝質(zhì)保金合同范本
- 沈陽生物二模試卷及答案
- 簽租門面合同范本
- 房屋維修項目合同范本
- 個人期房出售合同范本
- 艾灸培訓(xùn)合同范本
- 加盟餛飩合同范本
- 聚焦前沿:2025年職業(yè)教育產(chǎn)教融合共同體建設(shè)難題與對策研究
- 2025年廣西國家工作人員學(xué)法用法考試試題及答案
- (2025秋新版)蘇教版科學(xué)三年級上冊全冊教案
- 農(nóng)商行法律培訓(xùn)課件
- 部編版小學(xué)二年級語文上冊教學(xué)反思集體備課計劃
- 執(zhí)法用手機(jī)管理辦法
- 雙重管理安全員管理辦法
- 2019-2025年中國鮮切水果行業(yè)市場調(diào)查研究及投資前景預(yù)測報告
- 染色體核型分析報告解讀要點(diǎn)
- (高清版)DB1303∕T 357-2023 鮮食核桃果實(shí)主要病蟲害防治技術(shù)規(guī)程
- 無人機(jī)集群技術(shù)-智能組網(wǎng)與協(xié)同 課件全套 第1-8章 緒論- 無人機(jī)集群任務(wù)分配
評論
0/150
提交評論