acumatica
Riferimento BQL Acumatica
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 cacheMeet()le condizioni della clausolaWhere<>modo da includere tali elementi nella cache nel set di risultati.