Lotuser進階系列——DXL之通過程式修改Domino的設計

來源:互聯網
上載者:User
原作者:我崇拜的雪浪狐
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.