我有一个配置文档,我在其中使用单个字段来存储分配给评估某些文书工作的评估者的名称。在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
当我在XPage中做同样的事情时,我开始使用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();
返回完全尊贵的名字,这对我来说已经足够了,但肯定不是客户希望看到的。
我尝试将Vector值放入一个数组中并获取缩写名称,但不断收到错误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中的内容?或者我完全采取了错误的做法?
答案 0 :(得分:2)
为了缩写名称,您可以尝试: var nam:NotesName = session.createName( “CN = John B Goode / OU = Sales / OU = East / O = Acme / C = US”); return nam.getAbbreviated(); 哪个可以在这个维基文档中找到。 http://www-10.lotus.com/ldd/ddwiki.nsf/dx/NotesName_sample_JavaScript_code_for_XPages
Robert Perron在这个维基上有很多好的文档。
更糟糕的情况是,如果需要,您也可以在SSJS中使用@Name()。我试着避免这样做。
你想对这个返回数组做什么?它会填充什么?只是屏幕上的东西?组合框?等?
如果只是在屏幕上显示,您可以使用重复控制,只需重复多值字段的每个值。我有点喜欢这种方式......但是还有其他方法可以做到这一点。
我知道我现在只回答一个问题。我不确定我是否可以完成所有其他工作,但首先需要知道你想对结果数组做些什么。
答案 1 :(得分:1)
我知道这个问题有点陈旧,但我认为有人可以从解决方案中受益。从这个问题来看,我猜你想要使用SSJS返回Common Names。
一种方法是遍历列表(evaluateatorVector),然后在将返回的值存储到数组中之前将每个名称转换为公共名称。
以下解决方案:
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
答案 2 :(得分:0)
原来我遇到了多个问题。
将Vector的值推入数组是不正确的。切换自:
var evaluatorArray = new Array (evaluatorVector.toArray());
两行:
var evaluatorArray = new Array ();
evaluatorArray = evaluatorVector.toArray();
然后,它应该使用session.createName而不是New NotesName。最后,返回应该发送整个数组,而不是一些squirrelly 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;
我确信这可以清理和优化,但它确实有效。