【问题标题】:Get all items in NotesXSPDocument获取 NotesXSPDocument 中的所有项目
【发布时间】:2014-04-28 15:15:46
【问题描述】:

在我的 Notes 数据库中,我在保存文档时执行审核。在 LotusScript 中很容易。我从服务器获取原始文档(oDoc),然后在我修改的文档(mDoc)中,我执行一个 Forall 循环来获取每个项目的名称; mDoc.items 中的所有项目。从 oDoc 中获取相同的项目,使用新项目作为参数执行一个函数,该函数将运行一个 case 语句,该语句将查看它是否是我们关心的字段。如果是这样,我会使用“When”、“Who”、“What field”和“New Value”更新文档中的一组列表值。

我在服务器端脚本中执行此操作。在尝试这个过程中,我发现了一些有趣的事情;

currentDocument 是包含刚刚更改的所有内容的 NotesXSPDocument。

currentDocument.getDocument() 包含更改前的值。它还返回一个 NotesDocument,其中包含我可以运行的“items”字段。

问题是,我在 NotesXSPDocument 中需要类似的东西。有没有办法在迭代循环中从那里获取所有项目的名称和值?

这是损坏的代码。 (目前它正在遍历 NotesDocument 项,但这些是旧值。我宁愿遍历 XSP 文档项)

function FInvoice_beginAudit() {
  var original_doc:NotesDocument = currentDocument.getDocument();
  var oItem:NotesItem;

  var oItems:java.util.Vector = original_doc.getItems();
  var iterator = oItems.iterator();
  while (iterator.hasNext()) {
    var oItem:NotesItem = iterator.next();
    item = currentDocument.getItemValue(oItem.getName());
    if (oItem == undefined) {
      var MasterItem =  ScreenAudit(doc,item,True)
      if (MasterItem) { return true }
      } else {
      if (item.getValueString() != oItem.getValueString()) {
        var MasterItem =  ScreenAudit(doc,Item,True);
          if (MasterItem) { return true }
      }
    }
  }
}

【问题讨论】:

  • 您尝试getChangedFields() 获取 NotesXSPDocument 了吗?在此处查看用法public.dhe.ibm.com/software/dw/lotus/Domino-Designer/JavaDocs/…
  • 克努特,谢谢你。不知道!
  • 似乎无法让那个工作;在 [xPages_SSJS.jss].FBAudit() 在 [xPages_SSJS.jss ].saveDocument() 123: } 124: 函数 FBAudit() { -> 125: var cFields = currentDocument.getChangedFields(); 126:打印(cFields); 127:}
  • getChangedFields() 也无法工作,但通过currentDocument.getDocument(true) 找到了解决方案 - 请参阅我的答案。

标签: javascript xpages xpages-ssjs


【解决方案1】:

提交后您可以获得文档的两个版本 - 原始版本和带有changed/new values 的版本:

原文:var original_doc:NotesDocument = currentDocument.getDocument();

已更改:var changed_doc:NotesDocument = currentDocument.getDocument(true);

这样您就可以比较项目的变化。

但是,有一个陷阱:在将“changed_doc”分配给currentDocument.getDocument(true) 之后,“original_doc”的值也发生了变化,因为两个变量都指向同一个文档。这就是为什么我们必须首先将currentDocument.getDocument() 中的所有项目复制到一个新的临时文档中,并且只有在使用currentDocument.getDocument(true) 获取更改的值之后。作为替代方案,您可以像在 LotusScript 中一样从服务器读取原始文档。

这是一个以检测更改项目为起点的代码:

  var original_doc:NotesDocument = database.createDocument();
  currentDocument.getDocument().copyAllItems(original_doc, true);
  var changed_doc:NotesDocument = currentDocument.getDocument(true);
  var oItems:java.util.Vector = original_doc.getItems();
  var iterator = oItems.iterator();
  while (iterator.hasNext()) {
    var oItem:NotesItem = iterator.next();
    var itemName = oItem.getName();
    var cItem:NotesItem = changed_doc.getFirstItem(itemName);
    if (cItem.getText() !== oItem.getText()) {
        print("changed: " + itemName);
    }
    oItem.recycle();
    cItem.recycle();
  }
  original_doc.remove(true);
  original_doc.recycle();

【讨论】:

  • 是的,但是当您执行第二条语句时,original_doc 中的值假定为 updated_doc 中的值。至少在第二条语句之前,我做了一个 original_doc.getFirstItem,然后打印 item.getText。它带回了原始值。我在 updated_doc 之后粘贴了相同的命令,它从 original_doc 项返回新值......最令人沮丧。这里正在进行某种继承。
  • 是的,这也是我发现的,并通过解决方法更新了答案:)
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多