2012-02-06 50 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