Ricerca…


Analizza e verifica BQL

Qualsiasi sviluppatore di applicazioni Acumatica impiega molto tempo a scrivere codice BQL. Allo stesso tempo, non tutti conoscono i dettagli di base su come i tipi di BQL funzionano sotto la copertura.

Al centro di BQL c'erano due metodi chiave: Parse() e Verify() , dichiarati dall'interfaccia di IBqlCreator . La maggior parte dei tipi di BQL comunemente usati, come Where<> , And<> , Or<> ecc., Derivano da questa interfaccia.

Dovrebbe essere ammesso che i nomi con cui questi metodi sono storicamente bloccati non sono molto descrittivi. I nomi alternativi probabilmente migliori per loro sarebbero PrepareCommandText e Evaluate .

analizzare

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

L'unico scopo di Parse() è tradurre BQL in un comando SQL da inviare in DBMS. Pertanto, questo metodo accetta un parametro StringBuilder che rappresenta il comando SQL attualmente in costruzione, a cui il creatore di BQL aggiunge la rappresentazione di testo SQL di se stesso.

Ad esempio, il metodo Parse() del predicato And<> aggiungerà " AND " al testo del comando e richiederà in modo ricorsivo la traduzione di tutti i creatori nidificati di BQL.

In particolare, And<ARRegister.docType, Equal<ARDocType.invoice>> si tradurrà in qualcosa come "AND "ARRegister.DocType = 'AR'" .

Verificare

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

A differenza di Parse() , Verify() funziona esclusivamente a livello di applicazione.

Dato un record (ad es. ARRegister oggetto ARRegister ), può essere usato per calcolare espressioni su di esso, incluso il calcolo di formule e condizioni di valutazione.

Il parametro result viene utilizzato per memorizzare il risultato della valutazione delle condizioni booleane. Viene utilizzato principalmente dai creatori di predicati BQL come Where<> .

Il parametro value viene utilizzato per memorizzare il risultato del calcolo dell'espressione. Ad esempio, il value di una Constant<string> BQL Constant<string> è la rappresentazione di stringa di quella costante.

La maggior parte delle volte, i creatori di BQL influenzeranno il risultato o il valore, ma raramente entrambi.

Un uso notevole del metodo Verify() è nel metodo statico BqlCommand.Meet() , usato da PXCache per determinare se un dato elemento soddisfa il comando 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;
}

Conclusione

Il vero potere e la bellezza dei creatori di BQL risiede nel fatto che la maggior parte di essi può essere utilizzata sia a livello di database che a livello applicativo, consentendo il meccanismo di fusione della cache di Acumatica e offrendo una grande opportunità per la riusabilità del codice.

Ad esempio, quando selezioni i record dal database, la clausola Where<> del comando BQL:

  • Fornirà Parse() per tradurre se stesso in un testo SQL durante la preparazione del comando.
  • Fornirà Verify() durante l'unione della cache per determinare quali elementi già presenti nella cache Meet() le condizioni della clausola Where<> modo da includere tali elementi nella cache nel set di risultati.


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow