2014-05-05 61 views
1

如果在該字段中已存在以該值保存的任何文檔,是否有任何檢查何時鍵入字段?例如,如果你輸入projectno,我想檢查是否有其他文件已經有projectno。任何建議我如何將驗證驗證字段中的值

問候

+0

當您鍵入現有名稱時,是否收到任何錯誤消息或其他反饋? – dethtron5000

+2

請提供您到目前爲止嘗試過的代碼。你有兩個部分:何時驗證和如何。何時可能在每個字符之後,離開字段時,按下按鈕等等取決於您的應用程序流程。如何最有可能使用@DbLookup – stwissel

回答

2

你需要在在由您正在使用該領域的第一列排序數據庫中的視圖。我將假定它是一個隱藏的視圖,稱爲「(lookupUnique)」。構建它並對其進行測試,以確保它顯示了第一列所需的字段,並對值進行排序。

現在您需要一種方法來查看此視圖​​。理想情況下,您希望查找失敗 - 因爲沒有具有相同值的文檔,在這種情況下,您允許保存繼續。但還有另一種情況,您可能希望允許保存繼續。在這種情況下,查找成功是因爲查找找到了您正在處理的文檔,該文檔之前已保存,因此可在視圖中找到,而用戶現在正在編輯它。

帶有[RETURNDOCUMENTUNIQUEID]和[FAILSILENT]參數的@DbLookup函數是IBM推薦的解決方案。即,

foundId := @DbLookup("Notes":"NoCache";"":"";"(lookupUniqe)";theUniqueFieldNameGoesHereWithoutQuotes;1;[RETURNDOCUMENTUNIQUEID]); 

如果這個公式返回「」,那麼找不到匹配,因此你的代碼應該返回@Success來讓保存繼續。如果它返回其他內容,則將結果與@DocumentUniqueId進行比較。如果它們匹配,那麼你的代碼應該返回@Success來讓保存繼續。如果它們不匹配,那麼您在該字段中找到了具有相同值的另一個文檔,因此您的代碼應該返回帶有相應錯誤消息的@Failure。

現在需要注意的是,在某些版本的Domino中出現了[RETURNDOCUMENTUNIQUEID]問題,包括導致Domino 6服務器崩潰的問題,如果代理在基於使用此功能的表單的文檔上調用ComputeWithForm 。還有一個錯誤導致它只返回許多匹配中的第一個匹配的單數,所以如果你有重複的話,你的代碼中的這個策略將允許用戶重新保存已經是非唯一的舊文檔,而不是強制他們改變他們使他們獨一無二,而這可能會或可能不是你想要的。

如果這些已知問題中的任何一個可能會給您造成問題,那麼您最好不要使用[RETURNDOCUMENTUNIQUEID],而應該在IBM在第一次添加[RETURNDOCUMENTUNIQUEID]選項之前執行Notes和Domino程序員的操作位置:向您的(lookupUnique)視圖添加另一列,並將列值設置爲@Text(@DocumentUniqueId)。將上面的@DbLookup公式中的1更改爲您添加的列的編號,然後編寫驗證代碼,以預測可能會返回空字符串,單個值或值列表。

+0

這個問題被標記爲XPages,所以Richard的答案需要一些修改來處理XPages和SSJS –

0

如果一個45678類型我返回一個值,因爲已經有一個具有該值的文檔。我不會了解我將如何驗證它。

var dbname = session.getServerName() + "!!" + "proj\\webno.nsf"; 
    getFieldValue = getComponent("oNo").getValue(); 
    tmp = @DbLookup(dbname, "(webNo)", getFieldValue, 」obNo」); 

    if (tmp == getFieldValue) 
    { 
Here i will do a validate. If value i return are the same as in the getFieldValue 
and tmp or just getFieldValue is empty. 
} 
else 
{ 
Here is it OK 
} 
+0

我建議您不要使用「getFieldValue」作爲變量名稱。它看起來像一個函數名稱,並且必然會讓任何讀取代碼的人感到困惑。最好使用oNoValue或更具描述性的內容。我有一個關於字段名稱的寵物 - 我希望它們是描述性的,不要使用縮寫,因爲如果它們很短,以至於有人必須猜測這個字段用於什麼,那麼它們很容易拼錯或混淆它們。 –

0

拿走你的代碼並修改它。假設我們在數據庫中創建文檔,只需使用@DbName(),而不是試圖從會話和一些硬編碼中構建名稱。使用驗證時,應該可以通過簡單地訪問該控件的值。然後,只需獲取列中的所有值,看看您的值是否在那裏。

我認爲以下應該工作。

<xp:inputText id="projectNumber" value="#{doc.ProjectNumber}"> 
    <xp:this.validators> 
     <xp:validateExpression message="Value already in use"> 
      <xp:this.expression><!CDATA[#{javascript:var usedValues = @DbColumn(@DbName(), "(webNo)", 1); 
      if (@IsMember (value, usedValues)) { return false }; 
      return true; 
      </xp:this.expression> 
     </xp:validateExpression> 
    </xp:this.validators> 
</xp:inputText> 

爲什麼不爲他們生成一個值?最簡單的方法是使用@Unique,但除了創建一個以外,還有很多其他方法。