1

我有一个配置文档,我在其中使用单个字段来存储分配给评估某些文书工作的评估者的姓名。在 LotusScript 中,我能够将这些 NotesNames 发送到缩写名称中以构建我的列表,而无需过多的争论。NotesNames 数组将用于组合框中,以允许用户选择评估者姓名。

Function getEvaluatorSelections As Variant
    Dim evaluatorArray As Variant
    ReDim evaluatorSelections (0) As String
    Dim count As Integer
    Dim evalName As NotesName
    count = 0
    evaluatorArray = DetermineMultiValueKeyword ("EVALUATORS")
    ForAll entries In evaluatorArray
        ReDim Preserve evaluatorSelections (count)
        Set evalName = New NotesName ( entries )
        evaluatorSelections (count) = evalName.Abbreviated
        count = count + 1
    End ForAll

    If count = 0 Then
        getEvaluatorSelections = username
    Else
        getEvaluatorSelections = evaluatorSelections
    End If  
End Function

当我在 XPages 中做同样的事情时,我从一个 Vector 开始,并且并不真正了解如何编写 SSJS,这让我受阻。

var thisdb = session.getCurrentDatabase();
var dbProfileView = thisdb.getView("dbprofile");
var evaluatorDoc = dbProfileView.getDocumentByKey("EVALUATORS");
var evaluatorVector:Vector = evaluatorDoc.getItemValue("Value");
return evaluatorVector.toArray();

这将返回完全可分辨的名称,这对我来说已经足够了,但肯定不是客户希望看到的。

我试图将向量值放入一个数组并获取缩写名称,但不断收到错误 500,并带有以下代码的变体:

var thisdb = session.getCurrentDatabase();
var dbProfileView = thisdb.getView("dbprofile");
var evaluatorDoc = dbProfileView.getDocumentByKey("EVALUATORS");
var evaluatorVector:Vector = evaluatorDoc.getItemValue("Value");
var evaluatorArray = new Array (evaluatorVector.toArray());
var returnArray = new Array(); 
var evalNames:NotesName;

for(var i=1;i<evaluatorArray.length;i++){
    evalNames = New NotesName ( evaluatorArray[i] );
    returnArray[i] = evalNames.getAbbreviated();
}
return returnArray();

如何在 SSJS 中复制我在 LotusScript 中的内容?还是我完全采取了错误的方法?

4

3 回答 3

2

对于缩写名称,您可以尝试以下操作: var nam:NotesName = session.createName("CN=John B Goode/OU=Sales/OU=East/O=Acme/C=US"); 返回 nam.getAbbreviated(); 可以在此 wiki 文档中找到。 http://www-10.lotus.com/ldd/ddwiki.nsf/dx/NotesName_sample_JavaScript_code_for_XPages

Robert Perron 在那个 wiki 上有很多很好的文档。

更糟糕的情况是,如果需要,您也可以在 SSJS 中使用 @Name()。我会尽量避免这种情况。

你想用这个返回数组做什么?它将填充什么?只是屏幕上的东西?组合框?ETC?

如果只是为了在屏幕上显示,您可以使用重复控件并重复多值字段的每个值。我自己有点喜欢这种方法……不过还有其他方法可以做到。

我知道我现在只回答一部分问题。不确定我能完成所有其余的工作,但我认为首先需要知道你想对结果数组做什么。

于 2013-07-26T18:34:45.300 回答
1

我知道这个问题有点老了,但我认为有人可以从解决方案中受益。从问题中,我猜您想使用 SSJS 返回通用名称。

一种方法是遍历列表 (evaluatorVector),然后将每个名称转换为通用名称,然后再将返回的值存储到数组中。

解决方案如下:

var evaluatorVector = evaluatorDoc.getItemValue("Value");
var returnArray = []; 
for(var i = 1; i < evaluatorArray.length; i++){
  if(evaluatorVector != null){
      returnArray.push(@Name('[CN]', evaluatorVector[i]));
  }
}
print(returnArray); //list of common names
于 2016-11-01T11:28:46.083 回答
0

原来我有多个问题。

将 Vector 的值推送到数组中的操作不正确。切换自:

var evaluatorArray = new Array (evaluatorVector.toArray());

到两行:

var evaluatorArray = new Array ();
evaluatorArray = evaluatorVector.toArray();

然后,它应该使用 session.createName 而不是 New NotesName。最后,返回应该发送整个数组,而不是一些奇怪的 returnArray()

//get database
var thisdb = session.getCurrentDatabase();
//get view
var dbProfileView = thisdb.getView("dbprofile");
//getDocumentByKey ("EVALUATORS")
var evaluatorDoc = dbProfileView.getDocumentByKey("EVALUATORS");
//getItemValue to get all values from the Value field as a Vector
var evaluatorVector:Vector = evaluatorDoc.getItemValue("Value");
var evaluatorArray = new Array ();
evaluatorArray = evaluatorVector.toArray();
var returnArray = new Array(); 
var evalNames:NotesName;

for(var i=0;i<evaluatorArray.length;i++){
    evalNames = session.createName ( evaluatorArray[i] );
    returnArray[i] = evalNames.getAbbreviated();
}
return returnArray;

我确信这可以清理和优化,但它有效。

于 2013-07-26T19:30:28.730 回答