2013-07-26 7 views
1

我有一個配置文檔,我使用單個字段來存儲分配給評估某些文書工作的評估者的名稱。在LotusScript中,我可以將這些NotesNames消息轉換爲縮寫名稱,以便在沒有太多爭論的情況下構建我的列表。 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中一樣,我被一個矢量開始並沒有真正理解如何寫SSJS阻礙。

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

返回完全分辨名稱,這將是對我來說足夠,但肯定不是客戶不希望看到的。

我試圖把矢量值到一個數組,並獲得縮寫名稱,但一直得到錯誤500S與下面的代碼的變化:

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(); 

如何複製我在LotusScript中已經過在SSJS?還是我完全採取了錯誤的做法?

回答

0

原來,我有多個問題。

將Vector的值推入數組的操作不正確。從切換:

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

兩行:

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

然後,它應該用session.createName而不是新的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; 

我敢肯定,這可以被清理和優化,但它的作品。

+3

只需提醒兩次:在「for」循環內回收evalNames,並將問題標記爲已回答。 –

+0

如果我自己回答,我必須等兩天才能將其標記爲答案。去搞清楚。我忘記了回收。謝謝。 –

+1

僅供參考:'[]'與'new Array()'意味着相同的結果,每次輸入的次數都較少。 –

2

對於縮寫名稱,你可以試試這個: VAR南:NotesName = session.createName( 「CN =約翰·B·古德/ OU =銷售額/ OU =東/ O = Acme的/ C = US」); return nam.getAbbreviated(); 可以在這個wiki文檔中找到它。 http://www-10.lotus.com/ldd/ddwiki.nsf/dx/NotesName_sample_JavaScript_code_for_XPages

Robert Perron在wiki上有很多優秀的文檔。

更糟糕的情況下,如果需要,您還可以在SSJS中使用@Name()。儘管如此,我儘量避免這種情況。

你想用這個返回數組做什麼?它會填充什麼?只是在屏幕上的東西?一個組合框?等等?

如果只是在屏幕上顯示,您可以使用重複控制,並重復每個值的多值字段。我有點自己喜歡這種方法...還有其他方法可以做到這一點。

我知道我現在只回答一個問題。不知道我可以做所有其他的事情,但首先我需要知道你想對結果數組做什麼。

+0

返回它值的組合框。不知道session.createName是一個障礙。另一個是處理向量到數組轉換的不好處理。我將發佈已完成的代碼作爲答案(然後發佈有關它的博客!) –

1

我知道這個問題有點老,但我認爲有人可以從解決方案中受益。從這個問題,我想你想要使用SSJS返回通用名稱。

一種方法是循環訪問列表(evaluateatorVector),然後將每個名稱轉換爲Common Names,然後將返回值存儲到數組中。下面

解決方案:

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