Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Axapta super()是从哪里调用的?_Axapta_Dynamics Ax 2009_X++ - Fatal编程技术网

Axapta super()是从哪里调用的?

Axapta super()是从哪里调用的?,axapta,dynamics-ax-2009,x++,Axapta,Dynamics Ax 2009,X++,在表单数据源(SalesLine)上,我有一个validateWrite方法,该方法依次调用super()方法来调用SalesLine表上的validateWrite方法以及其他检查 在SaleLine表中,我有用于记录和有时停止数据更改的自定义功能 我不希望在从新表单写入SalesLine时触发此功能。因此,我想检查SalesLine表上的validateWrite方法中的一个条件,以确定validateWrite是否从我的新表单中调用。如果从我的新表单中调用了SalesLine写入,这将允许

在表单数据源(SalesLine)上,我有一个
validateWrite
方法,该方法依次调用
super()
方法来调用SalesLine表上的
validateWrite
方法以及其他检查

在SaleLine表中,我有用于记录和有时停止数据更改的自定义功能

我不希望在从新表单写入SalesLine时触发此功能。因此,我想检查SalesLine表上的
validateWrite
方法中的一个条件,以确定
validateWrite
是否从我的新表单中调用。如果从我的新表单中调用了SalesLine写入,这将允许我跳过数据更改记录/停止

正确的方法是什么

我可以创建一个boolean
recordSaveChecks
并在调用
SalesLine.write()
之前进行设置,但是有更好的方法吗


编辑:为了澄清,我没有要添加的特定于表单的自定义验证,我有一个系统范围的验证(因此位于SaleLine表上),当从1个特定表单调用时,需要跳过该验证。

您可以将代码放在
ValidateWrite()中的
SalesLine
数据源上
方法,在超级调用之前,如下所示:

ret = YourCheckGoesHere;

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

最好的选择可能是将特定于表单的自定义项移动到表单的数据源上,而不是移动到表本身上。但是,如果您希望向表中添加特定于表单的代码,您可以在Tables\Address.update()中看到一个示例,其中它检查this.dataSource().formRun().name()以确定是否已从相关表单调用它。

则您已将验证逻辑实施到表中,而不是表单中,因为您需要在系统范围内进行验证,但在插入/更新记录时需要防止此验证


我认为您可以重写表单DataSource的write()方法,并使用
SalesLine.doInsert()
SalesLine.doUpdate()

我注意到一个名为.isFormDataSource()的东西-我想我需要类似的东西,但它可能会返回表单?谢谢,但我不是在validateWrite中添加检查,我想有条件地跳过一些现有的功能。由于在向SalesLine写入时,整个系统都需要此功能,因此它必须位于SalesLine表的validateWrite方法中。我在这里向您展示的是,您可以在正在创建的新表单上,阻止表单调用super,从而跳过SalesLine表的validate write方法上的代码。您可以在表单上运行自己的验证,而不必调用super。但是,我必须从salesTable中复制整个validateWrite方法,以删除几行。如果将来有人向表SalesLine validateWrite方法添加验证,则需要在两个位置添加验证。不好的!!!!我不知道为什么需要对SalesLine表的validate write方法进行如此多的更改。在大多数情况下,如果您有一个使用SalesLine作为数据源的表单,您将对表单本身进行验证。您不应该为特定于表单的内容在salesLine表上创建验证(每次更新salesLine时都必须对其进行检查)。在Base AX中,对salesLine表执行的唯一真正验证是调用ValidateWrite_Server,它只调用salesLineType=this.type();我没有“表单特定”定制,我有“系统范围”定制,当从1个特定表单调用时需要跳过。因此,这个.dataSource().formRun().name()正是我所需要的,谢谢。事实上,文斯,我刚刚看过Address.update(),这是一个完美的例子。再次感谢。请不要使用代码突出显示来强调单词;它应该只用于实际代码。嘿,这已经有一年了,重写write()会跳过任何其他系统范围的检查,所以这一点都不好。更多背景信息,请参见我对迈克·布朗答案的评论