顯示具有
LotusScript 標籤的文章。
顯示所有文章
顯示具有
LotusScript 標籤的文章。
顯示所有文章
阿舍之前,如果需要用 LotusScript 來建立 Excel 的樞紐分析表的時候,都是先用 Excel 建好巨集和範本,然後,在 Agent 裡面去啟動這個巨集,是還不錯用,不過,阿舍這次要做的只是一個很簡單、很簡單的樞紐分析表,阿舍實在懶得去弄個範本了,所以,就想要在 Agent 裡用 LotusScript 直接建立這個 Excel 的樞紐分析表哩 !
阿舍本來想說,直接把在 Excel 裡錄好的巨集拿來改就好了,結果咧 ! 有點小麻煩哩 ! 試了老半天還是弄不出來哩 ! 實在是有點小小的不爽哩 ! 算了,只能去問看看 G 先生囉 ! 阿舍找到這篇和這篇來參考,然後,就搞定了哩 !

假設阿舍的資料是上面這張圖的樣子,然後,想要產出像下面這張圖的Excel 樞紐分析表為例,程式碼如下:

Call xlsSheet.PivotTableWizard ( 1,"Sheet1!R1C2:R" & Cstr(Rows) & "C2","","得分統計表")
'Rows 是程式產出的Excel列數
'第二個參數的 "Sheet1!R1C2:R" & Cstr(Rows) & "C2" 是指出資料來源
'第三個參數給 "" 表示要將樞紐分析表建立在新的 Sheet
Dim PivotCache As Variant
Dim PivotTable As Variant
Dim PTSheet As Variant
'因為第三個參數是指定產在新的 Sheet,所以,要移到新建的 Sheet 才能操作樞紐分析表
Set PTSheet = xlsApp.ActiveSheet
Set PivotTable = PTSheet.PivotTables("得分統計表")
PivotTable.PivotFields("姓名").Orientation = "1"
With PivotTable.PivotFields("得分")
.Orientation = "4"
.Name = "得分統計表"
.Function = "1"
End With
其實,在 Lotus Designer 的 Help 裡就有寫到說,比較建議用 ReplaceItemValue 來改變欄位的值,不建議使用 AppendItemValue 來新增值,如果你有用 AppendItemValue 來為一個多重值欄位 ( Multi-Text Field ) 來新增一個值的時候,就會發現,AppendItemValue 有時候會完全沒有動的樣子,也就是無法新增一個值到多重值的欄位。
阿舍有看過有人用另外建立一個陣列或 List 來塞欄位值,然後,再透過增加陣列或 List 的大小來放入新的值,之後,再用 ReplaceItemValue 來把這個陣列或字串放回欄位去,整個過程有一點點的小複雜哩 ! 其實,可以不用這麼複雜的,只要透過 NotesItem 這個物件的 AppendTextToList 就可以解決了哩 !
假設我們要在 Phone 這個多重值欄位再加入一組 0988888888 的電話號碼,那麼程式只要這樣寫就可以把電新增到 Phone 欄位去了。
Dim itmPhone as NotesItem
Set itmPhone = doc.GetFirstItem("Phone")
Call litmPhone.AppendToTextList(“0988888888")
Call doc.Save(false,true)
阿舍是遇到原來是設計時是選用 RichText 的欄位,在用 LotusScript 的代理程式來塞值到這個 RichText 欄位後,這個原來是 RichText 的欄位就變成 Text 欄位類型了,後續如果程式要再寫入這個欄位的話,就會發生 Type Mismatch 的錯誤,這個不是每次都會發生的,只有極少的情形下會偶然發生哩 !
阿舍試了一下,只要在 Notes Client 打開這份有問題的文件,進入編輯模式後再存檔,這樣類型錯誤的欄位就會變回原來的 RichText 欄位了。
LotusScript 雖然可以直接取得多重值欄位的第 n 個元素值,但是,是不能直接用指定第幾個元素的方式來給定多重欄位第 n 個元素值,例如用下面這種方式來設定 TargetField 這個欄位的第 2 個元素值,這樣在儲存時是不會發生問題的,但是在執行的時候,就會產生 Error 189 的 Illegal use of PROPERTY 的錯誤。
doc.TargetField(6) = "xyz"
要能正確的修改的話,其實是需要透過一個 Variant 的變數來替換,再透過 ReplaceItemValue 的方式存回原來的 TargetField 欄位,詳細程式碼如下:( 假設要修改第 6 個值 )
Dim tmpFieldValue As Variant
Dim item As NotesItem
tmpFieldValue = doc.TargetField
tmpFieldValue(6) = "xyz"
Set item = doc.replaceItemValue("TargetField",tmpFieldValue)
Lotus Domino 會把使用者傳進來的 Query String 放到 session.DocumentContext 的 Query_String 這個預設欄位裡,因此,只要先取出 Query String 之後,就可以來進行字串的整理來取得傳入的各個數了。
阿舍的做法是想要從 Query String 裡取出 Key - Value 的陣列,在 Lotus Script 裡的這種陣列叫做 List ,所以,阿舍下面的這個函數會需要傳入一個 List 變數來傳回一個 Key- Value 的陣列...
Function initParament(strQueryString As String,strParament List As String) As Integer
On Error Goto errorHandler
Dim vntBuffer as Variant
Dim i as integer
Dim strParaName as String
vntBuffer = Split(strQueryString,"&")
intParament = Ubound(vntBuffer)
For i=1 To getParament
strParaName = Split(vntBuffer(i),"=")
strParament(strParaName(0)) = strParaName(1)
Next
Exit Function
errorHandler:
Print "Error" & Str(Err) & ": " & Error$ & " on line " & Cstr(Erl)
End Function
下面是應用的範例 ( 假設會傳入 uid 及 img 兩個變數 )...
On Error Goto errorHandler
Dim session As New NotesSession
Dim intVarNum As Integer
Dim strParamentList List As String
Set doc = session.DocumentContext
intVarNum = getParament(doc.Query_StringDecoded(0),strParamentList)
print "uid = " & getParament('uid')
print "img = " & getParament('img')
當用 "+" 來組合字串和數字時,必需要先把數字轉換成字串,也就是要用類似 cstr() 的函數來轉換數字為字串,否則,還是會被當做是數字來處理,而如果是用 "&" 來相加時,不管如何,即使是數字也會被當做是字串來相加,用下面的例子來試試就會明的的吧 !
x = 1
y ="1"
Msgbox x & y ' 會出現 11
Msgbox Cstr(x) + y ' 會出現 11
Msgbox x + y ' 會現 2
阿舍會遇到這個錯誤訊息,是發生在要循序從視界或 Collection 讀取文件來修改或刪除時, GetNextDocument 需要有一份文件當做它的參考,但是,如果這份文件已經被刪除或已經不存在這個視界中時,那麼,當程式用這份文件來呼叫 GetNextDocument 時,就會發生這種錯誤..。
解決的方法就是先把下一份文件取到之後再來處理原來要處理的那一份文件..
阿舍會遇到這個錯誤訊息的原因,除了有可能是真的資料庫沒開啟或開不起來的問題之外,阿舍後試到還有另一個會造成這個問題的原因,就是未指定或指定錯誤的 Lotus Domino Server 名稱,尤其是同一支程式 ( Agent ) 會在多台伺服器上執行時,最容發生,建議在每次 Open Database 之前都先去取得 Server 名稱,這樣就比較不容易出錯了...
LotusScript 寫法
Dim session As New NotesSession
Dim serverName As String
Dim db As NotesDatabase
serverName = session.Servername
Set db = session.GetDatabase(serverName, "test/xyz.nsf")
Java 寫法
Session session = getSession();
String serverName = session.getServerName();
Database db = session.getDatabase(serverName, "test/xyz.nsf");