Zoeken…


BQL ontleden en verifiëren

Elke applicatieontwikkelaar van Acumatica besteedt veel tijd aan het schrijven van BQL-code. Tegelijkertijd weet niet iedereen de onderliggende details van hoe BQL-typen onder de motorkap werken.

In het hart van BQL lagen twee belangrijke methoden: Parse() en Verify() , verklaard door de IBqlCreator interface. De meeste veelgebruikte BQL-typen, zoals Where<> , And<> , Or<> etc., zijn afkomstig van deze interface.

Het moet worden toegegeven dat de namen waarmee deze methoden historisch vastzitten, niet erg beschrijvend zijn. Aantoonbaar beter alternatieve namen voor hen zou zijn PrepareCommandText en Evaluate .

parse

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

Het enige doel van Parse() is om BQL te vertalen in een SQL-opdracht die naar DBMS moet worden verzonden. Daarom accepteert deze methode een StringBuilder parameter die de SQL-opdracht vertegenwoordigt die momenteel wordt gebouwd, waaraan de BQL-maker de SQL-tekstrepresentatie van zichzelf toevoegt.

De methode Parse() predicaat And<> voegt bijvoorbeeld " AND " aan de opdrachttekst en vraagt recursief om vertaling van alle geneste BQL-makers.

In het bijzonder, And<ARRegister.docType, Equal<ARDocType.invoice>> vertaalt zich in iets als "AND "ARRegister.DocType = 'AR'" .

Verifiëren

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

In tegenstelling tot Parse() werkt Verify() puur op applicatieniveau.

Gegeven een record (bijv. Een ARRegister object), kan het worden gebruikt om uitdrukkingen erop te berekenen, inclusief het berekenen van formules en het evalueren van voorwaarden.

De parameter result wordt gebruikt om het evaluatieresultaat van de Booleaanse voorwaarde op te slaan. Het wordt meestal gebruikt door predikaten van BQL-makers zoals Where<> .

De parameter value wordt gebruikt om het resultaat van de expressieberekening op te slaan. De value van een BQL- Constant<string> is bijvoorbeeld de stringvoorstelling van die constante.

Meestal beïnvloeden BQL-makers het resultaat of de waarde, maar zelden beide.

Een opmerkelijk gebruik van de methode Verify() is de statische methode BqlCommand.Meet() , die door PXCache wordt gebruikt om te bepalen of een bepaald item voldoet aan de opdracht PXCache :

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

Conclusie

De echte kracht en schoonheid van BQL-makers ligt in het feit dat de meeste van hen kunnen worden gebruikt op zowel database- als applicatieniveau, waardoor het cache-samenvoegmechanisme van Acumatica mogelijk is en het een geweldige mogelijkheid biedt om code opnieuw te gebruiken.

Wanneer u bijvoorbeeld records uit de database selecteert, wordt de Where<> -clausule van de BQL-opdracht:

  • Parse() om zichzelf te vertalen in SQL-tekst tijdens het voorbereiden van de opdracht.
  • Zorgt voor Verify() tijdens het samenvoegen van de cache om te bepalen welke items al in de cache staan. Meet() de voorwaarden van de Where<> om dergelijke in de cache opgenomen items in de resultatenset op te nemen.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow