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.