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