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 cache Meet() les conditions de la clause Where<> afin d'inclure ces éléments mis en cache dans le jeu de résultats.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow