Buscar..


BQL Parse y Verify

Cualquier desarrollador de aplicaciones Acumatica dedica gran parte de su tiempo a escribir código BQL. Al mismo tiempo, no todos conocen los detalles subyacentes de cómo funcionan los tipos de BQL bajo el capó.

En el corazón de BQL se encuentran dos métodos clave: Parse() y Verify() , declarados por la interfaz IBqlCreator . La mayoría de los tipos de BQL utilizados comúnmente, como Where<> , And<> , Or<> etc., se derivan de esta interfaz.

Se debe admitir que los nombres con los que estos métodos históricamente están atascados no son muy descriptivos. Posiblemente mejores nombres alternativos para ellos serían PrepareCommandText y Evaluate .

Analizar gramaticalmente

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

El único propósito de Parse() es traducir BQL en un comando SQL para ser enviado a DBMS. Por lo tanto, este método acepta un parámetro StringBuilder que representa el comando SQL que se está construyendo actualmente, al que el creador BQL anexa la representación de texto SQL de sí mismo.

Por ejemplo, el método Parse() del predicado And<> agregará " AND " al texto del comando, y solicitará recursivamente la traducción de todos los creadores BQL anidados.

En particular, And<ARRegister.docType, Equal<ARDocType.invoice>> se traducirá en algo como "AND "ARRegister.DocType = 'AR'" .

Verificar

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

A diferencia de Parse() , Verify() funciona únicamente en el nivel de la aplicación.

Dado un registro (por ejemplo, un objeto ARRegister ), se puede usar para calcular expresiones en él, incluyendo cálculos de fórmulas y condiciones de evaluación.

El parámetro de result se utiliza para almacenar el resultado de la evaluación de la condición booleana. Es utilizado principalmente por creadores de BQL predicados , como Where<> .

El parámetro de value se utiliza para almacenar el resultado del cálculo de la expresión. Por ejemplo, el value de una Constant<string> BQL Constant<string> es la representación de cadena de esa constante.

La mayoría de las veces, los creadores de BQL afectarán el resultado o el valor, pero rara vez los dos.

Un uso notable del método Verify() está en el método BqlCommand.Meet() estático, utilizado por PXCache para determinar si un elemento dado satisface el 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;
}

Conclusión

El verdadero poder y la belleza de los creadores de BQL radica en que la mayoría de ellos se pueden usar tanto en la base de datos como en el nivel de la aplicación, lo que permite el mecanismo de fusión de caché de Acumatica y ofrece una gran oportunidad para la reutilización del código.

Por ejemplo, cuando selecciona registros de la base de datos, la cláusula Where<> del comando BQL:

  • Proporcionará Parse() para traducirlo a texto SQL durante la preparación del comando.
  • Proporcionará Verify() durante la fusión de la memoria caché para determinar qué elementos ya residen en la memoria caché Meet() las condiciones de la cláusula Where<> para incluir dichos elementos almacenados en caché en el conjunto de resultados.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow