Поиск…


Анализ и анализ BQL

Любой разработчик приложений Acumatica уделяет большое время написанию кода BQL. В то же время, не все знают основные сведения о том, как типы BQL работают под капотом.

В основе BQL лежат два ключевых метода: Parse() и Verify() , объявленные интерфейсом IBqlCreator . Большинство из обычно используемых типов BQL, таких как Where<> , And<> , Or<> и т. Д., Вытекают из этого интерфейса.

Следует признать, что имена, которые исторически сложились в этих методах, не очень описательны. Вероятно, для них PrepareCommandText альтернативными именами были бы PrepareCommandText и Evaluate .

парсить

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 для отправки в СУБД. Таким образом, этот метод принимает параметр StringBuilder представляющий команду SQL, которая в настоящее время строится, к которой создатель BQL добавляет само текстовое представление SQL.

Например, метод Parse() метода And<> predicate добавит " 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 используется для хранения результата оценки логического состояния. Он в основном используется предикатными создателями BQL, такими как Where<> .

Параметр value используется для хранения результата вычисления выражения. Например, value Constant<string> BQL Constant<string> является строковым представлением этой константы.

В большинстве случаев создатели BQL будут влиять на результат или значение, но редко они оба.

Одним из примечательных способов использования метода Verify() является статический 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:

  • Предоставляет Parse() для перевода в текст SQL во время подготовки команды.
  • Предоставляет Verify() при слиянии кеша, чтобы определить, какие элементы уже находятся в кеше Meet() условия Where<> , чтобы включить такие кешированные элементы в результирующий набор.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow