【第0098期2006/3/10】

本週主題

最新消息

 
  • IBM developerWorks台灣 新增Lotus技術專區--內有豐富技術資料,請大家多多使用.

詳細資訊請參閱以下網址:

http://www-128.ibm.com/developerworks/tw/lotus/

  • IBM Lotus Support Center 中文網站.

詳細資訊請參閱以下網址:

http://support.lotusworkplace.com.tw/

Top

文章分享

 

 

本文經作者同意刊登於智頡分享報,若在未經作者同意,擅自擷取文章中內容作為營利用途者,經查證屬實均視為侵權行為,作者保留法律追訴權。特此聲明!!


Lotus Notes程式設計隨筆(一)

作者 李建壹 Louis Lee(小路哥)

一、前言

許多初學Lotus NotesLotus Notes以下簡稱Notes)的朋友常常會因為Notes學習範圍太廣、教育訓練課程太貴、中文資料太少⋯等等因素,而不知該從何開始入門學習。不過因為這些因素而放棄的話,其實是非常之可惜的,畢竟Notes的功能及其整合性在群組軟體領域中,仍然是領先其他群組軟體的佼佼者。

Louis為了讓許多初學Notes的朋友可以快速上手,所以決定著手撰寫此系列的文章,希望以最淺顯易懂的白話文來為初學者建立Notes程式設計最基本的觀念(但會不會中斷不敢保證 :p)。不過既然是「隨筆」,所以一些順序的編排就不會那麼的有系統。另外,在章文中雖然偶爾會提到一些技術觀念,但並不屬於高深的技術文件,純粹只是觀念養成的文章。若您想進一步瞭解文中提及的觀念時,Louis「強烈」建議直接參考Notes程式設計說明資料庫。當然,本系列文章中若有訛誤還請各位前輩高手多多指教。

二、Notes學習方向

Notes的學習方向主要分為程式設計與系統管理兩部份,一般通稱為Notes ADApplication Development)與SASystem Administration),而這也是IBM官方的說法。不過,有時候AD也有人稱為AP,而SA則常會與IT界常用的系統分析(System Analysis)搞混,所以在與其他朋友交流時可千萬不要雞同鴨講。

但不論是Notes AD還是SA的知識,這兩者並無明確界線,而且兩者其實是相輔相成的。以ACL的設定來講,就無法明確歸納至ADSA任一範疇,因為不管是在開發應用程式(應用程式以下簡稱AP)或是管理Domino系統,ACL的設定都是必須的常識。另外,在開發Web AP時,為了讓瀏覽器使用者可以正常瀏覽存取Web AP的內容與資料,也須要先在伺服器上做一些設定,而這也是開發人員所須要了解的。

所以就Louis個人的觀點而言,千萬不要將自己的角色侷限在程式設計師或系統管理員而排斥學習任何一方面的知識。因為如此只會讓您在執行一些任務時捉襟見肘罷了。接下來就讓我們進入的正題吧!!

三、Notes資料庫的分類與基礎結構

在學習Notes AP開發的第一步驟,就是要先對Notes資料庫有所瞭解,如此才不會因為觀念不足或是錯誤而導致在開發過程中產生阻礙。所以Louis先整理一些觀念讓您稍微瞭解: 

Top

(一)Notes資料庫的分類

以目前市場上的資料庫產品而言,就資料型態、功能性或配置方式分成好幾類,例如最常聽到的就是關聯式資料庫(Relational Database),通常簡稱為RDBMS或是RDB,而最具代表性的就是OracleDB2InformixSQL⋯等等,不過這都是要付授權費,如果是免費的,目前最紅的該屬MySQL(Notes都可以跟這些資料庫整合喔~~)

就資料型態而言,Notes屬於文件式資料庫而非關聯式資料庫。很多初學Notes的朋友對文件式資料庫這名詞通常都會很疑惑,一是因為網路上很難找到相關資訊,二是對Notes還不是很瞭解。不過在之後的內容中Louis會陸續說明文件的觀念。

就資料庫的配置方式而言,Notes則被歸類在分散式資料庫,為什麼呢?因為Notes

的資料庫可以藉由抄寫機制,將各資料庫抄本分置到各伺服器與用戶端中。分散式資料庫的理論在網路上有很多資料,若有興趣的話可以到各大搜尋引擎網站找找。

 

(二)Notes資料庫的結構

每一個Notes資料庫在windows OS下是以檔案格式存在的,其副檔名通常是NSF,也就是Notes Storage Facility的簡寫,翻譯成中文就是Notes儲存設備。至於副檔名NTF也是Notes範本資料庫,全名是Notes Template Facility,是用來產生一般資料庫的範本。也就是說,您可以利用範本資料庫來新建一個資料庫,而此資料庫中的設計是與範本資料庫的設計一模一樣的。

按照官方的說法,每個Notes資料庫是由四個基本元件所組成:

1.ACL

就是Access Control List,一般翻譯成存取控制清單,或是權限控制清單,顧名思義就是讓資料庫管理員可以指定使用者對該資料庫執行何種動作。

2.設計元件:

是指套表、視界、外框、圖文框、領航員⋯等等元件,而這些都是Notes資料庫最最基礎的元件,也是用來讓資料庫可以與使用者互動的基本元件,沒有這些元件,資料庫即無法運作。

3.所謂邏輯:

是指程式設計師在資料庫中所撰寫的程式語言,Lotus Script、公式、代理程式都是。主要是要運算處理資料庫中的資料,或者達成某些自動化的作業。

4.資料:

是指儲存在文件中的文字、數字、日期時間、附加檔案⋯等等資訊。

四、資料的安全控管

若要簡單描述Domino對資料的安全控管,基本上由外而內可以分成幾關:伺服器è資料庫è文件è隱藏公式。

以伺服器這一關來說,是在伺服器文件中控管的,例如允許或不允許哪些使用者存取此伺服器、允許或不允許哪些使用者可以在伺服器上建立或刪除資料庫等等。

若是使用者被賦予存取伺服器的權限,就會進入到資料庫安全控管這關,而這關的安全控管就是由資料庫ACL來決定的。

再來是文件的安全性控管,這是經由套表屬性之安全標籤下的選項,以及讀者與作者欄位來處理的。

最後就是隱藏公式,其實,隱藏公式根本就不算是安全性控管的方法,這只能說是開發技巧。因為即使透過隱藏公式把套表中的特定欄位隱藏起來,使用者仍然可以透過文件屬性方塊看到各欄位中的資料。

 

Top

五、ACL

既然我們在前面多次談到ACL,不稍微跟他交個朋友好像說不過去,所以在這兒就為大伙兒引薦他吧,呵呵。在ACL中主要有幾種元件設定:使用者類型、權限類型、執行動作。

設定使用者類型是為了避免ID被誤用。舉例來說,通常伺服器在資料庫ACL中都是管理員權限,假設伺服器ID被有心人士盜用,可能就會造成極大的破壞。所以為了防範有心「人」士進行這種破壞行動,就必須在ACL中正確設定為伺服器類型,如此該人士即使拿到伺服器ID也沒辦法使用Notes client來對資料庫執行任何活動。因為,伺服器不是「人」,所以不會使用Notes client(不過在系統管理中,Louis強烈建議把伺服器當作是「人」,這樣有助於管理概念的建立)。但相對的,如果未設定適當的類型,也會導致某些動作無法執行。

再來是權限類型,依權限低高依序有七層-沒有權限、儲存者、讀者、作者、編輯者、設計師、管理員。【沒有權限】當然就不能對資料庫執行任何動作,因為連進去的權利都沒有。Louis常戲稱【儲存者】為工讀生權限,儲存者僅能輸入資料到資料庫中,輸入完畢後,就無法再看到這些資料。感覺就像找了一位工讀生來key in大量資料到資料庫中,但又不想讓工讀生記起這些資料或是看到其他資料。

先假設文件或套表中沒有讀者欄位,當使用者被賦予【讀者】權限時,使用者就只能閱讀文件,而不能編輯文件,當然更不可能建立文件(可執行動作之建立文件選項被強制disable了)。不過,一但文件中有讀者欄位,若使用者的名稱未在讀者欄位的名稱清單之中,則即使有再高的ACL權限還是無法閱讀該文件。

至於【作者】權限就必須跟【作者】欄位配合使用才具效用,當使用者被賦予【作者】權限,但作者欄位中的使用者名稱卻是別位使用者時,這時即使該份文件是目前使用者所建立,但因為其名稱未列於作者欄位中,所以無法編輯該文件,僅能閱讀而已。順帶一提,如果使用者被賦予【編輯者】()以上權限,但文件中的作者欄位中並沒有這位使用者名稱,使用者還是可以編輯文件,因為【作者】權限必須跟【作者】欄位配合使用才具效用,也就是說【編輯者】()以上權限不受作者欄位的約束。

至於【設計師】權限就是多了使用Domino Designer來開發AP的權限。而管理員則是多了修改ACL的權限。

茲概略整理下表以供參考:

 

 

管理者

設計者

編輯者

作者

讀者

儲存者

沒有權利

ACL設定

V

 

 

 

 

 

 

建立修改設計元件

V

V

 

 

 

 

 

編輯所有文件

V

V

V

 

 

 

 

編輯自已文件

V

V

V

V

 

 

 

增加新文件

V

V

V

V

 

V

 

讀取所有文件

V

V

V

V

V

 

 

 

在資料庫建立時,會在ACL的使用者清單中看到-Default-這筆項目。-Default-的作用是,當使用者在ACL中找不到適用於自己的權限時,就套用-Default-的權限。也就是說,凡名稱未明列在ACL中或未包含在ACL的群組中,就套用-Default-的權限。在開發AP時若無特殊需求,-Default-通常都設定為編輯者。

您還會看到LocalDomainServers群組與OtherDomainServers群組。顧名思義,只要是與目前資料庫的所在伺服器位在同一Domino網域的伺服器都會自動包含在LocalDomainServers群組中,除非您去names.nsf中更改此群組文件,那又另當別論了Orz。所以此群組預設權限是管理員,主要是為了讓相同網域內的伺服器可以進行抄寫作業。至於OtherDomainServers群組就是跟LocalDomainServers相反了,因為此群組的成員均為不同網域外的Domino伺服器,而且預設是無權限。有些集團企業因為有一個以上的Domino網域,所以可能會利用此群組來達到某些跨網域存取的需求。不過,在達成此類需求時,請先手動把那些位於不同網域的伺服器名稱加到names.nsf中的OtherDomainServers群組文件喔。

最後要談到Anonymous這個特殊項目,這是要手動新增給Web AP使用的。也就是當未透過Web ID & Password登入的使用者,均會被視為匿名者並套用Anonymous項目的權限。若Web AP未設定此項目時,當您使用瀏覽器開啟資料庫時,系統就會給您一個警告,要求您到ACL中新增此一項目喔。請特別注意,在開發Web AP時若無特殊需求,請將此項目設為無權限,否則您資料庫中的資料可能就會在網路上趴趴造了~~

待續⋯

李建壹 Louis Lee(小路哥)

2006/3/8

~謹在此日向全天下的婦女同胞們致敬,各位辛苦了~

 

 

Top

IBM最新文章訊息

 

 

訊息通知:

 

 

由於目前IBM台灣的developerWorks網站已經提供相當多的中文技術文章,故智頡分享報暫時已經不需要幫各位會員翻譯相關原文文章,故從本期電子報開始改成提供IBM最新文章訊息的相關連結,但是後續如有智頡分享自行撰寫的文章也會繼續分享給各位會員,不便之處,敬請見諒。


使用 IBM Workplace Collaboration Services 2.5 提高環境合作能力

 

IBM Workplace Collaboration Services 2.5提供了一個開放式的、可擴充的方法,能夠將合作活動加入到現有的或全新的應用程式中。除了諸如訊息傳遞、日曆、網路會議、工作組空間和聊天等現有功能外,Workplace Coollaboration Services 還幫助開發人員擴充平臺,以便將組織業務過程與人們使用的實際方法相連絡起來,進而完成他們的任務。這種“環境合作”方式可以讓組織對涉及合作人員之間的合作過程進行最佳化。

本文闡述了與合作活動相關的模式,並示範如何在 IBM Workplace Collaboration Services 中編制這些模式。然後透過範例客戶支援系統,我們將瞭解到將合作加入到現有應用程式中的方法。本文的第一部分為您講述環境中合作的概念和定義,後半部分重點介紹它們在產品中的實際用法。

 

用 IBM Workplace Collaboration Services 設定遠端和本地 HTTP 伺服器

 

本文討論用 IBM Workplace Collaboration Services 2.5 設定 Web(HTTP)伺服器所需的步驟。包括 Workplace Collaboration Services 2.5 支援的所有 Web 伺服器的設定細節。這些伺服器包括:

  • IBM HTTP Server 1.3.26.1 和 1.3.26.2
  • IBM HTTP Server 2.0.42.1 和 2.0.42.2
  • iSeries IBM HTTP Server 2.0.49
  • Apache 1.3.26 和 1.3.28
  • MS IIS 5.0 和 MS IIS 6.0
  • Sun Java System Web Server(以前稱為 Sun ONE Web Server),Enterprise Edition 6.0 SP4
  • Domino Enterprise Server 5.0.9a

 

IBM Workplace Collaboration Services 2.5 支援在以下兩種模式中與 Web 伺服器進行整合:

  • Co-located(本地): 在這種模式中,Web 伺服器與 Workplace Collaboration Services 伺服器安裝在同一台電腦上。
  • Remote(遠端): 在這種模式中,Web 伺服器安裝在 Workplace Collaboration Services 伺服器以外的專用電腦上。

 

開發 IBM Workplace Collaboration Services 2.5: 第 1 部分:建構高效能 IBM Workplace Collaboration Services

 

IBM Workplace Collaboration Services提供了範圍廣泛的強大的、整合的協作特性,比如電子郵件、日曆和計畫、到場提醒和即時訊息傳遞、線上學習、團隊空間、Web 會議,以及文件和 Web 內容管理。

在 Workplace Collaboration Services 2.5 開發過程中,要考慮的一個關鍵事項是效能。我們想要確保在早期版本中,Workplace Collaboration Services就被建構成能夠在未來版本中提供高效能和可靠性。在這個兩部分文章系列的第 1 部分中,我們將解釋用於實作該目標的過程。我們將與您分享我們對標準產品開發過程的增強,這些增強能夠幫助我們生產和發佈高效能和可擴展的產品。我們提供了可以合併到您自己的應用程式開發過程中的詳細步驟和方法。我們的目標(除了告訴您我們對新產品執行的嚴格的測試過程之外)是向您展示對我們來說已經證明是成功的、而且您可以採用並改寫以滿足您自己的軟體發展需要的過程和步驟。在本系列的第 2 部分,我們將與您分享在實作我們的目標過程中最具影響力的最佳開發實踐經驗。這些最佳實踐經驗可能有助於您的基於 J2EE 的應用程式開發工作。

 

開發 IBM Workplace Collaboration Services 2.5: 第 2 部分:Workplace Collaboration Services 2.5 最佳開發實踐

 

本文將對由兩部分組成的、描述 IBM 的產品開發團隊如何在 IBM Workplace Collaboration Services 2.5 中為高效能和可擴展性增長打下基礎的系列文章進行總結。第一篇文章 重點介紹了為確保產品高效能而實現的過程調整和方法增強。本文將分析我們從開發角度學到的一些教訓。文中包括我們為了確保 Workplace Collaboration Services 2.5 元件滿足發行目標而應用的一些最佳實踐。這些策略以高度可靠、高品質產品的形式為我們的客戶帶來了明顯的收益。此外,可以使用這些經驗改進您自己的開發實踐,使其更加有效和多產。

閱讀本文時,請特別注意文中的插圖。這些插圖說明了我們的開發技術和實踐如何改進和簡化產品架構,並顯著將其流線化,降低其複雜性。

 

 

Top

Lotus Notes 技術分享

 

如何在Web上將Word檔案自動轉成PDF檔案?

 

本期電子報將介紹如何利用Notes Script程式將Word檔案轉換成PDF檔案,此範例仍需搭配Acrobat Writer的軟體,且本程式範例並非提供為節省Acrobat Writer License使用,故如欲使用本程式來轉換PDF檔案的話,仍須購買足夠數量之Acrobat Writer軟體。

 

重點聲明:如因使用本公司提供之範例,而有任何違法或侵害他人權利的行為,導致第三人,對智頡科技或其董事與經理人、僱用人員,提出任何請求或訴訟,或智頡科技遭行政機關課以處罰時,您應賠償智頡科技及前述人等之一切損害(包括合理律師費用)。

 

欲使用本範例之前,請先在Notes Server上安裝Acrobat Writer的軟體,請先依照如下之步驟設定Acrobat Distiller印表機:

1.設定預設印表機為Acrobat Distiller

2.按右鍵選擇內容,設定『連接埠』,按『新增連接埠』,類型為『PDF PORT』,選擇轉出PDF之檔案路徑(影像檔轉出位置不包含,其轉出位置為與原始檔位置相同)。

3.按右鍵選列印喜好設定。

4.在ADOBE PDF設定頁中,僅勾選『刪出成功工作紀錄檔案』。

接下來就是Notes AP如何設計囉!!設計步驟如下:

 

1.請先設計一個可以上傳附加檔案的套表,套表中必須有一個可以存放PDF檔案的RichText欄位,套表設計畫面請參考如下:

2.此套表的WebQuerySave事件中,請執行(WordToPDF)的代理程式.

3.(WordToPDF)的代理程式設定與程式內容如下:

Option Public

Sub Initialize

        On Error Goto ErrorHandle

        Dim session As New NotesSession

        Dim wdoc As NotesDocument

        Dim rtitem As Variant

        Dim ErrMsg As String

        Dim FilePath As String

        Dim FileName As String

        Dim PDFFileName As String

        Set wdoc=session.DocumentContext

        Set rtitem=wdoc.GetFirstItem("tmpBody")

        FilePath="c:\temp"

        ErrMsg=""

        If wdoc.DeleteFile(0)="1" Then

                Exit Sub

        End If

        If (rtitem.Type = RICHTEXT) Then

                If Not (wdoc.HasEmbedded) Then

                        Goto APQuit

                End If

                Set o=wdoc.GetAttachment(wdoc.FileName(0))

                If ( o.Type = EMBED_ATTACHMENT ) Then

                        If Dir$(FilePath,16)="" Then

                                Mkdir FilePath

                        End If

                        FileName=o.Source

                        Call o.ExtractFile(FilePath & "\" & FileName)

                        PDFFileName=ms_ConvertDocToPDF(FilePath,FileName)

                        'Msgbox PDFFileName

                        Call rtitem.EmbedObject(EMBED_ATTACHMENT,"",PDFFileName)

                        Sleep(2)

                        Kill FilePath & "\" & FileName

                        Kill PDFFileName

                        Call wdoc.ComputeWithForm(False,False)

                End If

        End If

APQuit:

        If Trim(ErrMsg)="" Then

                Print "["+wdoc.DbPath(0)+"0/"+wdoc.UniversalID+"?OpenDocument]"

        Else

                Print "錯誤訊息:" & ErrMsg

                Print {<BR><BR><a href="}+wdoc.DbPath(0)+"0/"+wdoc.UniversalID+"?OpenDocument"+{">返回</a>}

        End If

        Exit Sub

ErrorHandle:

        Print "錯誤訊息:" & Error$ & "(" & Erl & ")"

        Print {<BR><BR><a href="}+wdoc.DbPath(0)+{">返回</a>}

End Sub

Function ms_ConvertDocToPDF(str_temppath,str_filename) As String

        '***************

        '主要功能 ~ Word檔案轉成PDF格式

        'str_temppath ~ 暫存檔案的路徑

        'str_filename ~  暫存的檔案

        '****************

        On Error Goto Errhandle

        Dim success As Long

        Dim str_pdf As String

        Dim Scr_hDC As Long

        Dim ret As Variant

        Dim NewName As String,OldName As String

        ms_ConvertDocToPDF=""

        cmd = |@LeftBack("|+str_filename+|";".")|

        xfileNm = Evaluate( cmd )

        cmd=Evaluate(|@Unique|)

        'word的檔名變更,因為acrobat會將太長及有()的檔名自動變更,所以要修改檔名.

        uid=cmd(0)    

        OldName=xfileNm(0)

        NewName=uid       

        OlDFullName=str_temppath +"\"+ str_filename

        NewFullName=str_temppath +"\"+uid+".doc"

        Name OldFullName As NewFullName 

        str_pdfpath = xfileNm(0)+".pdf"

        str_pdf= str_temppath+"\" + str_pdfpath

        tmpfilename$=NewFullName

        Dim ofname As String

        pdftmp=str_temppath

        If Dir$(pdftmp,16)="" Then

                Mkdir pdftmp

        End If

        Call printMSWord(tmpfilename$)

        Name NewFullName As OldFullName

        OlDFullName=pdftmp+"\" +NewName+".pdf"

        NewFullName=pdftmp+"\"  +OldName+".pdf"

        Sleep(4)

        On Error Goto renameerr

        Name OldFullName As NewFullName

        On Error Goto Errhandle

        Set fso = CreateObject("Scripting.FileSystemObject")   

        If fso.FileExists(ifname) Then

                Msgbox "move ifname==="+ifname+" to "+str_pdf

                Set oFile = fso.GetFile(ifname)

                oFile.Move(str_pdf)

                Set fso=Nothing

        End If

terminate:

        ms_ConvertDocToPDF=str_pdf

        Exit Function

renameerr:

        Sleep(1)

        Resume 0

Errhandle:

        Msgbox "ms_ConverDoctoPDF error: " + Cstr(Erl)+":"+Error$(Err)

        Resume Terminate

End Function

Sub PrintMSWord (fname As String)

        Dim app As Variant

        Dim docToPrint As Variant

        Dim PrintBackground As Integer

        On Error 208 Goto err208

        Set app = createobject("Word.application") 

        Set docToPrint = app.documents.open(fname)

        ' Turn off background printing to avoid error message

        PrintBackground = app.Options.PrintBackground()

        If PrintBackground = True Then app.Options.PrintBackground = False

        Call docToPrint.PrintOut()

        'Restore PrintBackground option

        app.Options.PrintBackground = PrintBackground    

        Call app.Quit(0)

        Set app = Nothing

        Exit Sub  

err208:

        'Cannot create automation object

        Msgbox MSG_AutomationError + "MS Word", 16, "Error " + Cstr(Err) + ": " + Error$

        Exit Sub  

End Sub

 

:如有需要可至智頡科技網站(http://www.wmmate.com)下載範例資料庫。  

Top

近期電子報內容預告

後續陸續會發行相關技術的電子報

內容預告如下:

Lotus Notes系統整合&應用介紹

  內容相當豐富敬請期待...

Top


註:如不想繼續收到本公司之電子報或是要介紹朋友訂閱電子報請至本公司網站線上設定/訂閱


智頡科技股份有限公司

Copyright 1999-2005     版權所有 轉載必究

TEL:03-5326262       FAX:03-5344873        Email:support@wmmate.com