Business Central Wave 2 2020: Nuevas funcionalidades para mejorar el rendimiento

por | 4 noviembre, 2020

Con el lanzamiento de la Wave 2 de 2020 de Business Central se han implementado algunas características muy importantes de cara a optimizar el rendimiento de las operaciones que realicen nuestros desarrollos.

Aprovecho para dejaros aquí el enlace a lo que creo que todo programador de Business Central debería de leer al menos una vez al mes 🙂 (para que no se olvide 😛 ) Performance Articles For Developers

Pues bien, de todas las recomendaciones o tips que ahí vienen descritas me quedo con un par de ellas que creo que son esenciales:

  • Partial Records
  • Temporary Tables
  • Page Background Tasks (*)

Partial Records

Esto es una de las funcionalidades que hace años que debería de estar implementada porque realmente era necesario. Y por fin ha llegado 🙂

Esta nueva característica consiste en que puedes definir que campos de un Record o RecordRef puedes cargar antes de consultar todos los registros. 
Esto es una forma bastante considerable de mejorar en rendimiento en operaciones con registros ya que la consulta solo traerá los campos que nosotros indicamos que vamos a necesitar, y no todos los campos como hasta ahora.

Está claro que, sobre todo en SaaS, realizar consultas con multitud de campos en las tablas se ve afectado por el rendimiento de la base de datos y además de la conexión de red. Con la funcionalidad de Partial Records esta información se ve reducida de forma considerable.

Un ejemplo de código como usar la nueva funcionalidad que tenemos en las variables Record SetLoadFields

En el siguiente ejemplo como vamos a usar sólo el campo «Standard Cost» lo que hacemos es indicar antes la consulta (FindSet()) que sólo queremos ese campo.

procedure ComputeArithmeticMean(): Decimal;
var
    Item: Record Item;
    SumTotal: Decimal;
    Counter: Integer;
begin
    Item.SetLoadFields(Item."Standard Cost");
    if Item.FindSet() then begin
        repeat
            SumTotal += Item."Standard Cost";
            Counter += 1;
        until Item.Next() = 0;
        exit(SumTotal / Counter);
    end;
end

En el caso de acceder a un campo que no hayamos definido previamente en SetLoadFields el sistema lo consultará en tiempo de ejecución, pero aquí ya no estaremos hablando de un procedimiento optimizado. Para ello os aconsejo que reviseis la documentación donde se habla de JIT Loading

Para más información consulta Partial Records en la documentación oficial.

Temporary Tables

Otra de las novedades en la Wave 2 2020 de Business Central es la posibilidad de crear nuevas tablas temporales.

Para ello, basta con definir la propiedad TableType con el valor Temporary en la definición de nuestra nueva tabla y ya será tratada por el sistema como una tabla temporal.

Como muchos ya sabréis, una tabla temporal se suele usar para realizar como buffer o intermedia para guardar datos que luego queremos mostrar al usuario pero una vez que el usuario cierra la ventana o la aplicación estos datos no se guardarán en ningún lado y se eliminarán.

La ventaja de usar una tabla temporal es que toda la interacción ocurre en la parte del front de Business Central, liberando la carga de trabajo en la base de datos así como la carga de red.

El uso de tablas temporales es mucho más rápido ya que las operaciones se realiza en la memoria de la instancia de Business Central y no se ve penalizado con el rendimiento en ese momento del motor de SQL.

table 50100 MyTable
{
    DataClassification = ToBeClassified;
    TableType = Temporary;

    fields
    
    ...
}

Esto sería parecido a usar un Record de tipo Temporary o definir en una page la propiedad SourceTableTemporary, sin embargo, la ventaja de tener la tabla creada como temporal es que podemos crear y eliminar sus campos sin restricciones ya que esta tabla no está implantada en el esquema de base de datos.

Para más información consulta Temporary Tables en la documentación oficial


Page Background Tasks (*)

Esta característica me veo en la obligación de mencionarla aunque no sea propia de la Wave 2. ( de hecho existe desde la 2019 Wave 2)

Para mejorar el rendimiento a la hora de cargar una page, podemos incluir los cálculos de ciertos campos en segundo plano y de forma asíncrona. De esta forma, si calcular ciertos datos nos lleva unos segundos no tendremos al usuario esperando a que se terminen de ejecutar todas nuestras funciones para terminar de cargarle la página.

Imaginaros que tenemos una función en el OnOpenPage que tarda en ejecutarse 15 segundos. De forma natural, cuando el usuario abre la página se establece una sesión entre la página y la instancia de Business Central. Si esto lo realizamos de forma convencional, hasta que nuestra función termine (15 segundos) el usuario no podrá ver ningún dato ni tampoco interactuar con el registro y estará bloqueado durante ese tiempo. Es en estas situaciones donde debemos de usar las tareas en segundo plano.

Estas tareas, lo que hacen es trabajar en segundo plano los cálculos que necesitemos y el usuario no estará bloqueado mientras se realizan estos cálculos.

En el siguiente enlace os dejo ejemplos de como se pueden implementar las tareas en segundo plano sin mucha complejidad Page Background Tasks

Y estos creo que son los 3 tips básicos en cuanto a tener una buena optimización en nuestros procesos.

Espero que os sirvan 🙂

2 pensamientos en “Business Central Wave 2 2020: Nuevas funcionalidades para mejorar el rendimiento

  1. Jesus Ochoa

    Excelente como siempre Roberto, por cierto espero se venga el tutorial de como modificar desde las API de bc

    Responder

Responder a Luca Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *