Sök…


BQL analysera och verifiera

Varje Acumatica-applikationsutvecklare lägger ner mycket av sin tid på att skriva BQL-kod. Samtidigt vet inte alla de underliggande detaljerna om hur BQL-typer fungerar under huven.

I hjärtat av BQL ligger två viktiga metoder: Parse() och Verify() , deklarerat av IBqlCreator gränssnittet. De flesta av de vanligt förekommande BQL-typerna, t.ex. Where<> , And<> , Or<> etc., härrör från detta gränssnitt.

Det bör medges att namnen som dessa metoder historiskt har fastnat i inte är särskilt beskrivande. Visserligen bättre alternativa namn för dem skulle vara PrepareCommandText och Evaluate .

Parse

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

Det enda syftet med Parse() är att översätta BQL till ett SQL-kommando som ska skickas till DBMS. Därför accepterar denna metod en StringBuilder parameter som representerar SQL-kommandot som för närvarande konstrueras, till vilket BQL-skaparen lägger till SQL-textrepresentationen av sig själv.

Exempelvis lägger metoden And<> predikats Parse() till " AND " i kommandoteksten och rekursivt begär översättning av alla kapslade BQL-skapare.

I synnerhet kommer And<ARRegister.docType, Equal<ARDocType.invoice>> att översättas till något som "AND "ARRegister.DocType = 'AR'" .

Kontrollera

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

Till skillnad från Parse() fungerar Verify() endast på applikationsnivå.

Med en post (t.ex. ett ARRegister ) kan det användas för att beräkna uttryck på det, inklusive beräkning av formler och utvärdering av villkor.

result används för att lagra det booleska tillståndsutvärderingsresultatet. Det används mest av predikat BQL-skapare som Where<> .

Det value parameter används för att lagra resultat uttrycket beräkningen. Till exempel är value på en BQL- Constant<string> strängrepresentationen för den konstanten.

Oftast påverkar BQL-skaparna antingen resultatet eller värdet, men sällan båda.

En anmärkningsvärd användning av metoden Verify() är i den statiska BqlCommand.Meet() -metoden, som används av PXCache att avgöra om ett visst objekt uppfyller BQL-kommandot:

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

Slutsats

Den verkliga kraften och skönheten hos BQL-skapare ligger i att de flesta av dem kan användas både på databas- och applikationsnivå, vilket möjliggör Acumaticas cache-sammanslagningsmekanism och ger en stor möjlighet för återanvändbarhet av kod.

När du till exempel väljer poster från databasen, Where<> -klausulen i BQL-kommandot:

  • Kommer att ge Parse() att översätta sig själv till SQL-text under kommandoförberedelser.
  • Tillhandahåller Verify() under cache-sammanslagning för att bestämma vilka objekt som redan finns i cachen Meet() Where<> -klausulens villkor för att inkludera sådana cachade objekt i resultatset.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow