Suche…


BQL Parse und Verify

Jeder Acumatica-Anwendungsentwickler verbringt viel Zeit damit, BQL-Code zu schreiben. Gleichzeitig kennen nicht alle die zugrunde liegenden Details der Funktionsweise von BQL-Typen unter der Haube.

Das Kernstück von BQL sind zwei Schlüsselmethoden: Parse() und Verify() , die von der IBqlCreator Schnittstelle IBqlCreator werden. Die meisten der häufig verwendeten BQL-Typen, wie z. B. Where<> , And<> , Or<> usw., stammen von dieser Schnittstelle.

Man muss zugeben, dass die Namen, mit denen diese Methoden historisch verbunden sind, nicht sehr beschreibend sind. Möglicherweise bessere alternative Namen für sie wären PrepareCommandText und Evaluate .

Parse

public void Parse(
    PXGraph graph, 
    List<IBqlParameter> pars, 
    List<Type> tables, 
    List<Type> fields, 
    List<IBqlSortColumn> sortColumns, 
    StringBuilder text, 
    BqlCommand.Selection selection)

Der einzige Zweck von Parse() besteht darin, BQL in einen SQL-Befehl zu übersetzen, der an DBMS gesendet wird. Daher akzeptiert diese Methode einen StringBuilder Parameter, der den gerade erstellten SQL-Befehl darstellt, an den der BQL-Ersteller die SQL-Textdarstellung seiner selbst anhängt.

Zum Beispiel hängt die Parse() Methode des Prädikats And<> an den Befehlstext " AND " an und fordert rekursiv die Übersetzung aller geschachtelten BQL-Ersteller an.

Insbesondere und And<ARRegister.docType, Equal<ARDocType.invoice>> wird in etwas übersetzt wie "AND "ARRegister.DocType = 'AR'" .

Überprüfen

public void Verify(
    PXCache cache, 
    object item, 
    List<object> pars, 
    ref bool? result, 
    ref object value)

Im Gegensatz zu Parse() arbeitet Verify() ausschließlich auf Anwendungsebene.

Bei einem Datensatz (z. B. einem ARRegister Objekt) können mit ihm Ausdrücke berechnet werden, einschließlich Formeln berechnen und Bedingungen auswerten.

Der result wird zum Speichern des Ergebnisses der booleschen Zustandsbewertung verwendet. Es wird hauptsächlich von Prädikat- BQL-Erstellern wie Where<> .

Der value Parameter wird zum Speichern des Ausdrucksberechnungsergebnisses verwendet. Der value einer BQL- Constant<string> ist beispielsweise die Zeichenfolgendarstellung dieser Konstante.

Meistens beeinflussen BQL-Ersteller entweder das Ergebnis oder den Wert, selten jedoch beide.

Eine bemerkenswerte Verwendung der Verify() -Methode ist die statische BqlCommand.Meet() -Methode, die von PXCache verwendet wird, um festzustellen, ob ein bestimmtes Element den BQL-Befehl erfüllt:

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;
}

Fazit

Die wahre Stärke und Schönheit von BQL-Erstellern liegt darin, dass die meisten von ihnen sowohl auf Datenbank- als auch auf Anwendungsebene verwendet werden können. Dadurch wird der Mechanismus zur Zusammenführung von Cumatica-Caches ermöglicht und eine großartige Möglichkeit für die Wiederverwendbarkeit von Code geschaffen.

Wenn Sie beispielsweise Datensätze aus der Datenbank auswählen, wird die Where<> Klausel des BQL-Befehls verwendet:

  • Wird Parse() bereitstellen, um sich während der Befehlsvorbereitung in SQL-Text zu übersetzen.
  • Liefert Verify() während der Cache - Fusion zu bestimmen , welche bereits Elemente im Cache mit Wohnsitz Meet() die Where<> Bedingungen Klausel , um eine solche zwischengespeicherten Elemente in der Ergebnismenge aufzunehmen.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow