acumatica
Référence Acumatica BQL
Recherche…
BQL Parse and Verify
Tout développeur d'applications Acumatica passe une grande partie de son temps à écrire du code BQL. Dans le même temps, tout le monde ne connaît pas les détails sous-jacents du fonctionnement des types BQL sous le capot.
Au cœur de BQL se trouvent deux méthodes clés: Parse()
et Verify()
, déclarées par l’interface IBqlCreator
. La plupart des types BQL couramment utilisés, tels que Where<>
, And<>
, Or<>
etc., dérivent de cette interface.
Il convient d'admettre que les noms avec lesquels ces méthodes historiquement collées ne sont pas très descriptives. On peut dire que de meilleurs noms pour eux seraient PrepareCommandText
et Evaluate
.
Parse
public void Parse(
PXGraph graph,
List<IBqlParameter> pars,
List<Type> tables,
List<Type> fields,
List<IBqlSortColumn> sortColumns,
StringBuilder text,
BqlCommand.Selection selection)
Le seul but de Parse()
est de traduire BQL en une commande SQL à envoyer dans un SGBD. Par conséquent, cette méthode accepte un paramètre StringBuilder
représentant la commande SQL en cours de construction, à laquelle le créateur BQL ajoute la représentation textuelle SQL de lui-même.
Par exemple, la méthode Parse()
du prédicat And<>
ajoute " AND "
au texte de la commande et demande récursivement la traduction de tous les créateurs BQL imbriqués.
En particulier, And<ARRegister.docType, Equal<ARDocType.invoice>>
se traduira par quelque chose comme "AND "ARRegister.DocType = 'AR'"
.
Vérifier
public void Verify(
PXCache cache,
object item,
List<object> pars,
ref bool? result,
ref object value)
Contrairement à Parse()
, Verify()
fonctionne uniquement au niveau de l'application.
Étant donné un enregistrement (par exemple, un objet ARRegister
), il peut être utilisé pour calculer des expressions, y compris pour calculer des formules et évaluer des conditions.
Le paramètre result
est utilisé pour stocker le résultat de l'évaluation de la condition booléenne. Il est principalement utilisé par les créateurs de prédicats BQL tels que Where<>
.
Le paramètre value
est utilisé pour stocker le résultat du calcul de l'expression. Par exemple, la value
d'une Constant<string>
BQL Constant<string>
est la représentation sous forme de chaîne de cette constante.
La plupart du temps, les créateurs BQL affecteront le résultat ou la valeur, mais rarement les deux.
Une utilisation notable de la méthode Verify()
réside dans la méthode statique BqlCommand.Meet()
, utilisée par PXCache
pour déterminer si un élément donné satisfait à la commande 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;
}
Conclusion
La véritable puissance et beauté des créateurs de BQL réside dans le fait que la plupart d’entre eux peuvent être utilisés au niveau de la base de données et au niveau des applications, permettant le mécanisme de fusion du cache Acumatica et offrant une excellente opportunité de réutilisation du code.
Par exemple, lorsque vous sélectionnez des enregistrements dans la base de données, la clause Where<>
de la commande BQL:
-
Parse()
pour se traduire en texte SQL lors de la préparation de la commande. - Fournira
Verify()
lors de la fusion du cache pour déterminer les éléments qui résident déjà dans le cacheMeet()
les conditions de la clauseWhere<>
afin d'inclure ces éléments mis en cache dans le jeu de résultats.