原作者:我崇拜的雪浪狐
Domino R6中,可以將設計項目匯出併產生一個DXL(Domino XML)文檔,匯出以後,我們可以通過程式碼將DXL文檔進行修改,再將修改後的代碼匯入到Domino資料庫。這種方式可以修改設計項目中的任何代碼(比如:添加/刪除表單中插入的子表單、修改代理中的代碼、增加刪除視圖中的列等)。
需要注意以下幾點:
1、代理重新匯入後
a)開啟設計時,會提示代理沒有簽名,無法開啟,在Web上運行代理的時候,伺服器立即宕機。解決方案:用程式開啟設計項目文檔,並對其進行簽名。
b)若原代理設定了兩個名字(如:“儲存代理|AG_SaveDoc”),匯入後代理的名字會被修改為“儲存代理 | AG_SaveDoc”,在設計頁面中,代理的英文名前面自動加了一個空格,但這樣並不影響代理的調用,只是在KOA的介面中無法正常擷取到該設計。解決方案:用程式開啟設計項目文檔,修改$Title域。
2、視圖重新匯入後,若視圖的名稱(注意,不是別名)產生有衝突,匯入的視圖會自動被重新命名為“原視圖名字”+“/”+“目前使用者帳號”(如:“按部門”會被修改為“按部門/CN=雪浪狐/O=Dev”),若被重新命名後的名字仍然有衝突,這樣,在匯入的程式中就報DXL匯入失敗的錯誤。解決辦法:用程式開啟設計項目文檔,修改$Title域。
3、當匯出的設計代碼比較多的時候,匯出代碼到記憶體的時候,會有一定的延緩,若後續的代碼直接存取記憶體中的變數的時候,往往容易發生錯誤。解決方案:將匯出的代碼先放到一個臨時的檔案中,然後在從檔案中讀取內容到記憶體中。
代碼範例片斷:
匯入代碼程式
Dim exporter As NotesDXLExporter
Dim stream As NotesStream
Set view = db.GetView("SYS_VH_DesignByName")
Set doc = view.GetDocumentByKey(elemName, True)
If Not doc Is Nothing Then
Set stream = ss.CreateStream
Call stream.Open("c:\$$lksdesigninfo.dxl", "UTF-8") '匯出檔案為瞭解決前面提及的緩衝問題
stream.Truncate '清空檔案中原有的內容
Set exporter = ss.CreateDXLExporter(doc, stream)
Call exporter.Process '將代碼匯出到檔案中
stream.Close
Set stream = ss.CreateStream
Call stream.Open("c:\$$lksdesigninfo.dxl", "UTF-8")
elementCode= stream.ReadText '讀取檔案內容
'以下代碼擷取該設計項目的XML片斷
elemType = Strrightback(rtnVal, "</")
elemType = Strleft(elemType, ">")
elementCode = "<" & elemType & " " & Strright(elementCode, "<" & elemType & " ")
elementCode = Strleftback(elementCode, ">")
If elementCode <> "" Then
elementCode = elementCode & ">"
End If
Call stream.Close
Kill "c:\$$lksdesigninfo.dxl"
End If
匯入代碼程式
Dim stream As NotesStream
Dim importer As NotesDXLImporter
codeTxt = {<?xml version='1.0' encoding='utf-8'?>} & Chr(10)
codeTxt = codeTxt & {<!DOCTYPE database SYSTEM 'xmlschemas/domino_6_5_3.dtd'>} & Chr(10)
codeTxt = codeTxt & {<database xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='3.0'>} & Chr(10)
codeTxt = codeTxt & elementCode '將前面擷取的元素代碼XML片斷加入
codeTxt = codeTxt & "</database>" & Chr(10)
Set view = db.GetView("SYS_VH_DesignByName")
Set stream = ss.CreateStream
Call stream.WriteText(codeTxt) '在流中寫入代碼資訊
Set importer = ss.CreateDXLImporter(stream, objDb)
importer.DesignImportOption = DXLIMPORTOPTION_CREATE '設定以新增的方式匯入設計
Call importer.Process '匯入
Call stream.Close
If Isarray(newList) Then 'newList中儲存了剛匯入的所有設計項目的名稱
newList = Com_UniqueTrim(newList)
Forall o In newList
Set doc = view.GetDocumentByKey(o, True)
If doc Is Nothing Then
Set doc = view.GetDocumentByKey(" " & o, True) '代理中的元素名稱中可能會被添加了空格
End If
If Not doc Is Nothing Then
If doc.HasItem("$TITLE") Then '修改設計項目中的$TITLE域
title = doc.GetItemValue("$TITLE")
hasChg = False
If Instr(title(0), " | ")>0 Then
title(0) = Com_ReplaceSubstring(title(0), " | ", "|")
hasChg = True
End If
If Instr(title(0), "/CN=")>0 Then
tmpStr = Strright(title(0), "/CN=")
If Instr(tmpStr, "|") Then
title(0) = Strleft(title(0), "/CN=") & "|" & Strright(tmpStr, "|")
Else
title(0) = Strleft(title(0), "/CN=")
End If
hasChg = True
End If
If hasChg Then
Call doc.ReplaceItemValue("$TITLE", title)
End If
End If
Call doc.Sign '對設計進行簽名
Call doc.Save(True, True)
End If
End Forall
End If