2012-02-06 51 views
2

在表單數據源(SalesLine)上,我有一個validateWrite方法,該方法又調用super()方法來調用SalesLine表上的validateWrite方法以及其他檢查。super()從哪裏調用?

在SaleLine表中,我有自定義功能用於記錄,有時會停止數據更改。

我不希望在從新表單寫入SalesLine時觸發此功能。因此我想檢查SalesLine表上的validateWrite方法中的一個條件,以確定是否從我的新表單調用了validateWrite。如果從我的新表單調用SalesLine寫入,這將允許我跳過數據更改記錄/停止。

什麼是正確的方法?

我可以創建一個布爾值recordSaveChecks並在調用SalesLine.write()之前設置它,但有沒有更好的方法?

編輯:爲了澄清,我沒有表單特定的自定義驗證添加,我有一個系統範圍的驗證(因此坐在SaleLine表),當從一個特定的表單調用時需要跳過。

+0

我注意到一些所謂this.isFormDataSource() - 我想我需要類似的東西,但它可能返回的形式? – AnthonyBlake 2012-02-06 16:08:16

回答

6

最好的選擇可能是移動定製,即形式具體到形式的數據源而不是表格本身。但是,如果您確實想要向表中添加特定於表單的代碼,則可以在Tables \ Address.update()中看到一個示例,其中它將檢查this.dataSource().formRun()。name()確定它是否已從相關表單中調用。

+0

我沒有「表單特定」定製,我有「系統範圍」定製,當從1特定表單調用時需要跳過。因此,this.dataSource()。formRun()。name()正是我所需要的,謝謝。 – AnthonyBlake 2012-02-06 16:43:21

+1

其實Vince,我剛剛看過Address.update(),它就是一個完美的例子。再次感謝。 – AnthonyBlake 2012-02-06 16:50:43

1

你可以把你的代碼在SalesLineDataSourceValidateWrite()方法,超級調用像這樣的東西之前:

ret = YourCheckGoesHere; 

if(ret) 
{ 
    ret = super(); 
} 
else 
{ 
    info("Why validation failed goes here"); 
} 
    return ret; 
+0

謝謝,但我沒有添加一個檢查validateWrite,我想有條件地跳過一些現有的功能。由於在寫入SalesLine時系統的其餘部分需要此功能,因此它必須位於SalesLine表的validateWrite方法中。 – AnthonyBlake 2012-02-06 16:25:25

+1

我在這裏展示的是,您可以在創建的新窗體上停止調用超級窗體,以便在銷售線表的驗證寫入方法上跳過您的代碼。你可以在窗體上運行你自己的驗證,並且永遠不要調用super。 – 2012-02-06 16:29:21

+0

但是,然後我將不得不從salesTable中複製整個validateWrite方法以刪除幾行。如果有人在將來添加對錶SalesLine validateWrite方法的驗證,則需要添加2個地方。不好!!!! – AnthonyBlake 2012-02-06 16:41:18

0

然後,您已將表驗證邏輯實現到表格中,而不是進入表單,因爲您需要將驗證設置爲系統範圍,但在插入/更新記錄時需要防止此驗證。

我想你可以通過覆蓋寫入()表數據源的方法和使用SalesLine.doInsert();SalesLine.doUpdate();

+0

請不要使用代碼突出顯示來強調單詞;它只能用於實際的代碼。 – 2013-02-17 10:06:07

+0

嘿,這是一歲,重寫write()會跳過其他任何系統範圍的檢查,所以這根本不會好。有關更多背景,請參閱我對麥克布朗的答案的評論 – AnthonyBlake 2013-02-17 22:05:10