サーチ…


BQLの解析と検証

Acumaticaアプリケーション開発者は、BQLコードを書くのに多くの時間を費やします。同時に、BQLの型がどのようにして動作するのかについての詳細は誰もが知っているわけではありません。

BQLの中心には、 IBqlCreatorインターフェイスで宣言されているParse()Verify() 2つの重要なメソッドがIBqlCreatorます。 Where<>And<>Or<>などの一般的に使用されるBQL型のほとんどは、このインタフェースから派生しています。

これらの方法が歴史的に固執した名前は、あまり説明的ではないことを認めなければならない。おそらくそれらの代替名は、 PrepareCommandTextEvaluateです。

解析する

public void Parse(
    PXGraph graph, 
    List<IBqlParameter> pars, 
    List<Type> tables, 
    List<Type> fields, 
    List<IBqlSortColumn> sortColumns, 
    StringBuilder text, 
    BqlCommand.Selection selection)

Parse()の唯一の目的は、BQLをSQLコマンドに変換してDBMSに送ることです。したがって、このメソッドは現在構築されているSQLコマンドを表すStringBuilderパラメータを受け取り、BQL作成者がそれ自身のSQLテキスト表現を追加します。

たとえば、 And<>述語のParse()メソッドは、コマンド・テキストに" AND "を追加し、ネストされたすべてのBQL作成者の再帰的に翻訳を要求します。

特に、 And<ARRegister.docType, Equal<ARDocType.invoice>>"AND "ARRegister.DocType = 'AR'"ように変換されます。

確認

public void Verify(
    PXCache cache, 
    object item, 
    List<object> pars, 
    ref bool? result, 
    ref object value)

Parse()とは対照的に、 Verify()は純粋にアプリケーションレベルで動作します。

レコード(例えば、 ARRegisterオブジェクト)が与えられれば、式の計算や条件の評価など、式を計算するために使用できます。

resultパラメータは、ブール条件評価結果を格納するために使用されます。 Where<>などの述語 BQL作成者が主に使用します。

valueパラメータは、式の計算結果を格納するために使用されます。たとえば、BQL Constant<string>valueは、その定数の文字列表現です。

ほとんどの場合、BQL作成者は結果や価値に影響しますが、まれに両方に影響します。

Verify()メソッドの注目すべき使用法の1つは静的なBqlCommand.Meet()メソッドで、 PXCacheが指定された項目がBQLコマンドを満たしているかどうかを判断するために使用されます。

public bool Meet(PXCache cache, object item, params object[] parameters)
{
    List<object> pars = new List<object>(parameters);
    bool? result = null;
    object value = null;
    try {
        Verify(cache, item, pars, ref result, ref value);
    }
    catch (SystemException ex) {
        throw new PXException(String.Format("BQL verification failed! {0}", this.ToString()), ex);
    }
    return result == null || result == true;
}

結論

BQLクリエイターの真のパワーと美しさは、データベースとアプリケーションレベルの両方でそれらのほとんどを使用できるため、Acumaticaのキャッシュマージメカニズムを可能にし、コードの再利用性を高める素晴らしい機会を提供します。

たとえば、データベースからレコードを選択するWhere<> 、BQLコマンドのWhere<>句を使用します。

  • コマンド準備中にParse()を使用してSQLテキストに変換します。
  • キャッシュのマージ中にVerify()を実行して、キャッシュに既に存在するアイテムがWhere<>を判断しますMeet() Where<>句の条件をキャッシュセットに含める)。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow