acumatica
Ссылка на Acualatica BQL
Поиск…
Анализ и анализ 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<>
, чтобы включить такие кешированные элементы в результирующий набор.