目前分類:LotusNotes (12)

瀏覽方式: 標題列表 簡短摘要

  Lotus Notes其實也是有Schema的。取得方式如下:

Form form = db.getForm("fmFoo");

Jemmy 發表在 痞客邦 留言(0) 人氣()

  • DateTime dateTime = session.createDateTime("2010-11-27:10:00:09");  // from java.sql.Date
  • DateTime dateTime = session.createDateTime("2010-11-27:10:00:09.000000000"); // from java.sql.TimeStamp
  • DateTime dateTime = session.createDateTime(new java.util.Date());

  在取得lotus.domino.DateTime物件後,就可以replaceItemValue("DateField", dateTime);。如此在NotesClient才會顯示Date/Time而非Text型態。

  要search的話得借助Function了,如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Lotus Notes的Java API給我感覺很不統一,以新增Document為例,官網所附的sample code是用appendItemValue(Item-name, Item-value)。可是在API上寫的Usage卻用replaceItemValue(Item-name, Item-value)。而且這兩個方法似乎都可以用,此外,要是Item-name是Null,這兩個method丟出的Exception也不同。

  • appendItemValue會丟出NotesException,訊息是:You must provide an item name
  • 而replaceItemValue丟出的卻是NullPointerException

  這兩者的差別是,appendItemValue會對Item產生multi-value,也就是假設Item1有值a,做一次insert或update item1,值也是a,則在Notes Client看到會是a,a。而若一開始沒有Item1,卻replaceItemValue,則Item1值會被產出。總結是不管insert、update,使用appendItemValue對已存在的item做append,會變成multi-value,而repalceItemValue則不會,但若Item1不存在,就會append。這和RDBMS觀念確實有差距。

Jemmy 發表在 痞客邦 留言(0) 人氣()

  佩服Rex鍥而不捨的測試,Notes在Java的運作真的有夠OOXX,Session、Database和Form這祖孫三代物件,完全不像一脈相承的物件。就列舉這三代物件每一代若設錯會如何?

  1. 建立Session要Server URL和登入者帳密,若Server URL是不正確或找不到的,丟出的Exception如下,是最正常的反應了。

    NotesException: Could not get IOR from Domino Server: java.net.UnknownHostException: NOTESHOST

Jemmy 發表在 痞客邦 留言(0) 人氣()

  本來沒有想過權限議題,因為無法Update Notes Server幾乎是因為無法連線,但在有連線狀態下無法Update資料,大概只有權限了。Notes本身架構算完整了,對映到的Java API的物件體系也很完整,但不敢恭維的是在Exception表示方式,千篇一律像以下的Exception Stack:

NotesException: Notes error: ??????????

Jemmy 發表在 痞客邦 留言(0) 人氣()

  前有一篇說過,用Java對Notes的Document做完新增修改後再做刪除會丟出Exception,類似如下內容:

NotesException: Notes error: ??????????

Jemmy 發表在 痞客邦 留言(0) 人氣()

  到了壓力測試的撰寫,如何測試對Notes做完大量資料增改的執行時間?如何得知Notes已完成所有執行?而且有個難題是Notes的Domino Server時間未必和本機同步。取得Domino Server時間如下(紅字部份):

import lotus.domino.Database;

Jemmy 發表在 痞客邦 留言(0) 人氣()

  今天測出一個奇怪的事情:對Notes新增一筆A,再修改A沒問題,然後再刪除A就丟出NotesException,而Error Message竟是一堆問號。反觀如果Notes本來就有B這筆資料,先新增A再刪除B或先刪B再增A就沒有問題。所以矛頭就指向了Session,使用Lotus Script操作Notes,其物件階層是Session==>Database==>Document,每個物件都有recycle的method,在API定義是寫道:無條件歸還記憶體給系統。在對Notes做createDocument後,執行Document、Database的recycle再remove都還是丟出NotesException,直到執行Session的recycle後再執行remove就正常work,而且Session被recycle後毋須再createSession,可以同一份instance繼續使用。

  相對於上次提到逐筆取得Document再進行remove,今天發現有批次刪除的方式,看來會更有效能:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  在Microsoft的spaces寫部落格最大的好處,除了即時分享給msn的朋友之外,對岸的同好也能搜尋到。而最大的壞處,不能像Google的Blog可以多重分類標籤,而且分類標籤居然有上限,和字母同字數。原本Lotus Notes被Java call的,只好放在Java類裡>"<。

  Survey了一段時間,對Lotus Notes的增改刪查有些掌握。Notes的資料庫是階層式資料庫,不同於關聯式資料庫(RDBMS),其Database是一個後綴名的.NSF檔。Notes和RDBMS的比較對照如下:

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Notes的物件體系中,Database下的Document和Agent地位是並排的,DocumentCollection只是個介於Database與Document的集合,算不上一個層次。我推測發Mail的動作何以那麼複雜,係因為發Mail的動作是一支Agent程式,而Mail內容則是Document物件,兼具了Agent、Document性質。因為執行一般的Agent,根本不用繼承AgentBase,直接這樣寫就行:

public static void main(String[] args) throws Exception {

Jemmy 發表在 痞客邦 留言(0) 人氣()

  Google其解法大多是Override NotesMain method,但欠缺使用Java standalone的例子,還得參考VB call法才取得更進階實作方式。目前踹出的solution不包括對外使用STMP,只發給Notes裡的成員。

  第一步,要寫個抽象類別繼承AgentBase,我只是奇怪為何不能只繼承AgentBase就好了?

Jemmy 發表在 痞客邦 留言(0) 人氣()

  使用Java去操作Lotus Notes,大都需要import兩個Jar:Notes.jar與NCSO.jar。只用Notes.jar還需安裝Notes Client才能與Server連,而NCSO.jar則是透過IBM制定的CORBA協議DIIOP連接到Domino Server的。

  由IBM提供Sample連接,老是出現以下Exception:

Jemmy 發表在 痞客邦 留言(0) 人氣()