どこからsuper()が呼ばれたのですか?

フォームデータソース(SalesLine)では、 validateWrite メソッドを呼び出し、 validateWrite メソッドを呼び出す super()メソッドを呼び出します。他のチェックの中でSalesLineテーブル。

SaleLineテーブルでは、私は記録のためのカスタム機能を持っていて、いつかはデータの変更を止めます。

私は新しいフォームからSalesLineに書き込むときに、この機能を起動させたくありません。したがって、 validateWrite が新しいフォームから呼び出されたかどうかを調べるために、SalesLineテーブルの validateWrite メソッド内の条件をチェックしたいとします。 。これにより、新しいフォームからSalesLineの書き込みが呼び出された場合に、データの記録/停止をスキップできます。

正しいアプローチは何ですか?

SalesLine.write()を呼び出す前にboolean recordSaveChecks を作成して設定することができますが、より良い方法がありますか?

編集:追加するフォーム固有のカスタム確認がないため、特定の1つのフォームから呼び出されたときにスキップする必要があるシステムワイド検証があります(したがって、SaleLineテーブルにあります)。

2
私はthis.isFormDataSource()と呼ばれるものに気付きました - 私は似たようなものが必要だと思いますが、おそらくフォームを返すでしょうか?
追加された 著者 AnthonyBlake,

3 答え

最適なオプションは、フォーム固有のカスタマイズを、テーブル自体ではなくフォームのデータソースに移動することです。しかし、フォーム固有のコードをテーブルに追加したいのであれば、 Tables \ Address.update()の例を見て、 this.dataSource()。formRun ).name()を使用して関連フォームから呼び出されたかどうかを確認します。

6
追加された
私は "フォーム固有"のカスタマイズを持っていない、私は1つの特定のフォームから呼び出されるとスキップする必要がある "システム全体"のカスタマイズがあります。したがって、this.dataSource()。formRun()。name()は私が必要とするものです。ありがとうございます。
追加された 著者 AnthonyBlake,
実際にはVince、私はAddress.update()を見てきました。それは完璧な例です。再度、感謝します。
追加された 著者 AnthonyBlake,

あなたはスーパーコールの前に ValidateWrite()メソッドの SalesLine DataSource メソッドにコードを置くことができます。

ret = YourCheckGoesHere;

if(ret)
{
   ret = super();
}
else
{
    info("Why validation failed goes here");
}
   return ret;
1
追加された
ありがとう、しかし、私はvalidateWriteにチェックを追加していません、私は条件付きでいくつかの既存の機能をスキップしたいです。この機能は、SalesLineに書き込むときにシステムの他の部分で必要とされるため、SalesLineテーブルのvalidateWriteメソッド内になければなりません。
追加された 著者 AnthonyBlake,
しかし、私はsalesTableからvalidateWriteメソッド全体を複製して、いくつかの行を削除する必要があります。誰かが将来、Sa​​lesLineのvalidateWriteメソッドのテーブルに検証を追加した場合、2つの場所を追加する必要があります。良くない!!!!
追加された 著者 AnthonyBlake,
私が言ったように、私は新しい検証を実装していません。 VARによって実装されたビジネス要件であり、複数の企業に跨っています。 SalesLineテーブルのすべての変更は、理由コードとともに記録されます。したがって、これはSaleLineテーブルに対して実装されているので、営業ラインをユーザーが変更できるすべての場所にいる必要はありません。もちろん、理由コードを無視する必要がある1つの例外があります。 1つの例外があるだけでSalesLineを変更できるロギングを実装するのは意味がありません。 Vinceのソリューションは完璧です。
追加された 著者 AnthonyBlake,
私がここに示していることは、あなたが作成している新しいフォームで、フォームがSales Line Tableのvalidate writeメソッドでスキップされるようにフォームを停止することができます。フォーム上で独自の検証を実行し、スーパーを呼び出すことはできません。
追加された 著者 Michael Brown,
私はSalesLine Tableのwriteメソッドのバリデーションに非常に多くの変更を加える必要があるのか​​どうかはわかりません。ほとんどの場合、SalesLineをデータソースとして使用しているフォームを使用している場合は、フォーム自体に対して検証を行います。フォーム固有のものについては、salesLineテーブル(salesLineへの更新ごとにチェックする必要があります)で検証を作成するべきではありません。
追加された 著者 Michael Brown,
Base AXのSalesLine Tableで実行される唯一の実際の検証は、salesLineType = this.type()を呼び出すValidateWrite_Serverの呼び出しです。
追加された 著者 Michael Brown,
パフォーマンス上の理由から、多くのコードにテーブルメソッドを追加しないようにする必要があります。データソースを含むフォームを変更する場合は、フォームで検証を実行する必要があります。これにより、SalesLineテーブルのvalidateWriteメソッドに追加した追加検証をスキップできます。
追加された 著者 Michael Brown,

検証ロジックをシステム全体に適用する必要があるため、レコードを挿入/更新する際にこの検証を防止する必要があるため、検証ロジックをフォームにはないテーブルに実装しました。

I think you can by override write() method of Form DataSource and use SalesLine.doInsert(); and SalesLine.doUpdate();

0
追加された
言葉を強調するためにコードハイライトを使用しないでください。実際のコードにのみ使用する必要があります。
追加された 著者 Andrew Barber,
これは一歳なので、write()をオーバーライドすると他のシステム全体のチェックがスキップされるので、これはまったくうまくいかないでしょう。マイクブラウンの答えの背景をもっと見る
追加された 著者 AnthonyBlake,