zoukankan      html  css  js  c++  java
  • DXL之通过程序修改Domino的设计

    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
  • 相关阅读:
    pat甲级 1155 Heap Paths (30 分)
    pat甲级 1152 Google Recruitment (20 分)
    蓝桥杯 基础练习 特殊回文数
    蓝桥杯 基础练习 十进制转十六进制
    蓝桥杯 基础练习 十六进制转十进制
    蓝桥杯 基础练习 十六进制转八进制
    51nod 1347 旋转字符串
    蓝桥杯 入门训练 圆的面积
    蓝桥杯 入门训练 Fibonacci数列
    链表相关
  • 原文地址:https://www.cnblogs.com/hannover/p/1899809.html
Copyright © 2011-2022 走看看