2013-05-28 51 views
0

考慮下面的例子。 preferencesDoc作爲無效傳入。它在這個函數中的賦值被忽略,並且它在該集合之後什麼都沒有。 tmpDoc設置正常。這兩項任務是相同的,所以這不是一個觀點問題。 preferencesDoc的賦值被阻塞,顯然是因爲它是一個參數。沒有錯誤,並且按鍵查找工作正常,這通過成功分配tmpDoc來證明。如何在LotusScript函數中設置文檔參數?

Function test(preferencesDoc As NotesDocument) 
    If preferencesDoc Is Nothing then 
     Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True) 
    End if 

    Dim tmpDoc As NotesDocument 
    Set tmpDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True) 
End Function 

有人可以解釋這裏發生了什麼,以及如何去解決它?

澄清。

很高興看到人們在創意中鑿空。但是,您必須意識到這個功能只是爲了說明我的問題。這是一個簡單的方法,可以幫助我溝通問題,而不是我真實代碼的一部分。請繼續留在問題上。

同樣,如果preferencesDoc作爲任何內容傳入,則函數中的「修復」分配完全被忽略。 Tode似乎在某種程度上。當我傳入preferenceDoc時,我可以將其重新分配給不同的文檔。

回答

call test(Nothing) // will not work 

--- 

Dim doc as NotesDocument 
call test(doc) // will work 

從Tode重要聲明:如果您通過 「無」 爲參數,那麼它會留下什麼。如果你傳遞一個未初始化的NotesDocument,那麼它將被初始化。

託德和克努特都提到了這一點,我認爲裏奇暗示着同樣的事情。謝謝。我相信克努特是第一個,所以我會信任他。

我一直在Notes中編碼的所有年份,這是我第一次遇到這個問題。每天學習一些東西。 :)

回答

1

您的代碼確實有效。只需調用函數與Call test(doc)您可以

Dim doc As NotesDocument 
Call test(doc) 
If doc Is Nothing Then 
    Print "Nothing" 
Else 
    Print doc.form(0) 
End If 

測試它更舒適的方式來獲得偏好文件時不使用任何參數:

Function GeneralPreferences() As NotesDocument 
    Static preferencesDoc As NotesDocument 
    If preferencesDoc Is Nothing Then 
     ' ... get your docLookupView 
     Set preferencesDoc=docLookupView.getDocumentByKey("GENERAL_PREFERENCES", True) 
    End If 
    Set GeneralPreferences = preferencesDoc 
End Function 

然後你就可以像這樣

結果工作
Print GeneralPreferences.form(0) 
Print GeneralPreferences.created 

,你不需要有宣佈額外的NotesDocument。隨着preferencesDoc的Static文檔是隻讀數據庫,從一個時間 - 它在功能

+0

是的,但只要你通過「沒有」,你不能再賦予任何其他值給該變量,它會停留「沒有」...... –

+0

我明白,傳遞的參數是一個NotesDocument,它尚未設置,這就是爲什麼「Nothing」在我的例子 –

+0

克努特,謝謝。一般首選項是一個單一的文件,這將是一個替代,但我有我的真實功能簽名其他文檔參數,所以我真的需要弄清楚參數正在發生什麼。 – jacekn

0

對象通過引用傳遞,所以你描述的行爲絕對看起來很奇怪。但作爲一種風格,我不會推薦這樣做。 Sode效應模糊了你的代碼的邏輯。你的函數應該聲明爲返回NotesDocument的,並且應該通過

Set doc = test(doc) 
+0

,豐富的Hi「緩存」,這個功能並不需要返回的NotesDocument。這只是一個簡單的例子來說明我的參數重新分配的問題。 – jacekn

+0

看起來這個快速的例子並沒有得到你的觀點。你有多個參數傳遞給一個子或函數有這個問題嗎?他們應當參照,所以分配的值應該「堅持」傳遞 - 除非你有一個包容的範圍問題(即對象的父超出之前的功能或子返回範圍),或除非有什麼堅持(因爲你在函數或子函數中調用了Nothing)。 –

+1

如果我讀的問題的權利,該功能被稱爲「呼叫測試(沒有)」或簡單的「測試沒什麼」。臨時變量preferencesDoc然後被設置爲Nothing,功能代碼執行,並設置preferencesDoc到一個有效的NotesDocument,但在功能結束時的值是爲通過引用放回。由於該函數的參數是常量或表達式,而不是可引用的變量,因此不會返回任何值。順便說一下,你會在哪裏預期這個值? –

1

這是用LotusScript正常調用。如果你傳入「nothing」,那麼這不是一個NotesDocument類型的對象,而只是「Nothing」...並且沒有東西不能被分配一個值。

但是你已經做了正確的事情:使用一個函數。

調用該函數是這樣的:

Set preferenceDoc = test(preferenceDoc) 

是正確的。但是你忘記提交一份文件。你的函數應該是這樣的:

Function test(preferenceDoc as NotesDocument) As NotesDocument 
    Dim docTemp as NoresDocument 
    If preferenceDoc is Nothing then 
    Set docTemp = docLkpView.GetDocumentBykey("GENERAL_PREFERENCES", True) 
    Else 
    Set docTemp = preferenceDoc 
    End If 
    ' here comes the "magic" 
    Set test=docTemp 
End Function 

當然你可以完全取出docTemp,只是在相應的線替換docTemp函數名,那麼你並不需要的最後一行...

+0

嗨Tode,問題是關於參數分配和功能只說明我的問題。我們不要討論這個功能,而是繼續討論這個問題。 – jacekn

+1

如果您將「Nothing」作爲參數傳遞,那麼它將保持不變。如果你傳遞一個未初始化的NotesDocument,那麼它將被初始化。如果這不適合你,那麼很可能上下文會丟失......如果你在你的子測試定義數據庫和創建「無」 - 在該數據庫中的文檔,那麼它會只要你離開子,作爲父對象爲空是沒什麼......我認爲,這個問題是在你的「真實」的代碼,因爲你給的例子會起作用(如果你傳遞一個類型爲NotesDocument的變量) –

相關問題