Cómo trabajar con listas y diccionarios en AL para Business Central

Descubre cómo utilizar listas y diccionarios en AL para gestionar datos en Microsoft Dynamics 365 Business Central.

En la programación de Business Central, las listas y los diccionarios son estructuras de datos muy útiles para manejar y organizar información. Aquí se presenta cómo se pueden usar estas estructuras para trabajar con datos de clientes de manera eficiente y clara.

Las listas y los diccionarios son herramientas esenciales en cualquier lenguaje de programación, y AL no es la excepción. Las listas permiten almacenar conjuntos ordenados de elementos del mismo tipo, facilitando operaciones como la iteración y la búsqueda. Los diccionarios, por otro lado, permiten almacenar pares clave-valor, lo que es ideal para asociar elementos de manera directa, como un número de cliente con su nombre.

En este post, se explorará cómo implementar y utilizar estas estructuras en AL mediante ejemplos prácticos que manejan datos de clientes. Se presentarán diferentes procedimientos, desde los más simples hasta los más complejos, para demostrar el poder y la versatilidad de las listas y los diccionarios en el desarrollo de soluciones para Business Central.

¡Vamos manos a la obra! 🚀

Manejo de Listas

procedure SimpleList()
var
    Customer: Record Customer;
    ListCustomer: List of [Code[20]];
    CustomerNo: Code[20];
begin
    //Función simple para llenar y recorrer un list simple
    Clear(ListCustomer);
    Customer.Reset();
    if Customer.FindSet() then
        repeat
            ListCustomer.Add(Customer."No.");
        until Customer.Next() = 0;

    foreach CustomerNo in ListCustomer do
        Message(CustomerNo);

end;

La función SimpleList demuestra cómo crear y manipular una lista en AL. Primero, se declaran las variables necesarias, incluyendo una para la tabla Customer, una lista para almacenar los números de cliente y una variable temporal para iterar sobre los números de cliente. Luego, se limpia la lista y se restablece el conjunto de datos de la tabla Customer. Si se encuentran registros, se añaden los números de cliente a la lista mediante un bucle. Finalmente, se recorre la lista y se muestra cada número de cliente con un mensaje.

Manejo de Diccionarios

procedure SimpleDictionary()
var
    Customer: Record Customer;
    DicCustomer: Dictionary of [Code[20], Text[100]];
    CustomerNo: Code[20];
    CustomerName: Text[100];
begin
    //Función simple para llenar y recorrer un dictionary simple
    Clear(DicCustomer);
    Customer.Reset();
    if Customer.FindSet() then
        repeat
            DicCustomer.Add(Customer."No.", Customer.Name);
        until Customer.Next() = 0;

    foreach CustomerNo in DicCustomer.Keys() do begin
        CustomerName := DicCustomer.Get(CustomerNo);
        Message(CustomerNo + ': ' + CustomerName);
    end;
end;

La función SimpleDictionary ilustra cómo usar diccionarios en AL. Primero, se declaran las variables necesarias, incluyendo una para la tabla Customer, un diccionario para almacenar pares de número de cliente y nombre, y variables temporales para iterar y almacenar datos. Luego, se limpia el diccionario y se restablece el conjunto de datos de la tabla Customer. Si se encuentran registros, se añaden pares de número de cliente y nombre al diccionario. Finalmente, se recorre el diccionario y se muestra cada par número-nombre de cliente con un mensaje.

Combinación de Listas y Diccionarios

procedure MergeListWithDictionary()
var
    Customer: Record Customer;
    ListDataCustomer: List of [Text];
    DicCustomer: Dictionary of [Code[20], List of [Text]];
    CustomerNo: Code[20];
begin
    //Función más compleja para añadir y visualizar algunos datos de la tabla en un diccionario
    Clear(DicCustomer);
    Customer.Reset();
    if Customer.FindSet() then
        repeat
            Customer.CalcFields("Balance (LCY)");

            Clear(ListDataCustomer);
            ListDataCustomer.Add(Customer.Name);
            ListDataCustomer.Add(Customer."Name 2");
            ListDataCustomer.Add(Customer.County);
            ListDataCustomer.Add(Format(Customer."Balance (LCY)"));

            DicCustomer.Add(Customer."No.", ListDataCustomer);
        until Customer.Next() = 0;

    foreach CustomerNo in DicCustomer.Keys() do begin
        Clear(ListDataCustomer);
        DicCustomer.Get(CustomerNo, ListDataCustomer);
        Message(CustomerNo + ': ' + ListDataCustomer.Get(1) + ', ' + ListDataCustomer.Get(2) + ', ' + ListDataCustomer.Get(3));
    end;
end;

La función MergeListWithDictionary muestra cómo combinar listas y diccionarios para manejar datos más complejos. Primero, se declaran las variables necesarias, incluyendo una para la tabla Customer, una lista para almacenar varios datos del cliente y un diccionario para asociar números de cliente con listas de datos. Luego, se limpia el diccionario y se restablece el conjunto de datos de la tabla Customer. Si se encuentran registros, se calculan los campos necesarios y se llenan las listas con datos del cliente, que luego se añaden al diccionario. Finalmente, se recorre el diccionario y se muestra cada número de cliente junto con algunos de sus datos asociados.

Manejo Avanzado de Diccionarios

procedure AddDataFromEntireTable()
var
    Customer: Record Customer;
    RecField: Record Field;
    RecRef: RecordRef;
    FieldRefe: FieldRef;
    DicDataCustomer: Dictionary of [Integer, Text];
    DicCustomer: Dictionary of [Code[20], Dictionary of [Integer, Text]];
    CustomerNo: Code[20];
    CustomerName: Text;
    CustomerName2: Text;
    Balance: Text;
begin
    //Función compleja para añadir y visualizar todos los datos de la tabla en un diccionario 
    Clear(DicCustomer);
    Customer.Reset();
    if Customer.FindSet() then
        repeat
            Clear(DicDataCustomer);

            //recorremos la tabla de campos filtrado por la tabla de clientes para buscar cada dato que hay en el Record
            RecRef.GetTable(Customer);
            RecField.SetRange(RecField.TableNo, RecRef.Number);
            RecField.SetFilter(Type, '<>%1&<>%2&<>%3&<>%4&<>%5', RecField.Type::BLOB, RecField.Type::DateFormula, RecField.Type::GUID, RecField.Type::Media, RecField.Type::MediaSet);
            RecField.SetFilter(ObsoleteState, '<>%1&<>%2', RecField.ObsoleteState::Removed, RecField.ObsoleteState::Pending);
            if RecField.FindSet() then
                repeat
                    FieldRefe := RecRef.Field(RecField."No.");

                    if RecField.Class = RecField.Class::FlowField then
                        FieldRefe.CalcField();

                    DicDataCustomer.Add(FieldRefe.Number, Format(FieldRefe.Value));
                until RecField.Next() = 0;

            DicCustomer.Add(Customer."No.", DicDataCustomer);
        until Customer.Next() = 0;

    foreach CustomerNo in DicCustomer.Keys() do begin
        Clear(DicDataCustomer);
        DicCustomer.Get(CustomerNo, DicDataCustomer);

        DicDataCustomer.Get(Customer.FieldNo(Name), CustomerName);
        DicDataCustomer.Get(Customer.FieldNo("Name 2"), CustomerName2);
        DicDataCustomer.Get(Customer.FieldNo("Balance (LCY)"), Balance);

        Message(CustomerNo + ': ' + CustomerName + ', ' + CustomerName2 + ', ' + Balance);
    end;
end;

La función AddDataFromEntireTable es un ejemplo avanzado que muestra cómo almacenar todos los datos de un cliente en un diccionario dentro de otro diccionario. Primero, se declaran las variables necesarias, incluyendo una para la tabla Customer, referencias de tabla y campo, y diccionarios para almacenar datos de clientes. Luego, se limpia el diccionario y se restablece el conjunto de datos de la tabla Customer. Si se encuentran registros, se itera sobre cada campo de la tabla Customer, excluyendo ciertos tipos de campos, y se añaden los datos de cada campo a un diccionario temporal. Este diccionario se asocia al número de cliente en el diccionario principal. Finalmente, se recorre el diccionario principal y se muestran los datos de cada cliente.

Beneficios y Aplicaciones Prácticas

El uso de listas y diccionarios permite manejar los datos de manera más estructurada y eficiente. Esto puede ser muy útil en escenarios donde se necesita acceder rápidamente a información específica o cuando se trabaja con grandes volúmenes de datos. Estas estructuras de datos mejoran la legibilidad del código y facilitan su mantenimiento.

  • Listas: Ideales para manejar conjuntos ordenados de elementos. Facilitan operaciones de iteración y búsqueda secuencial.
  • Diccionarios: Permiten asociar pares clave-valor, lo que es perfecto para búsquedas rápidas y eficientes. Muy útiles cuando se necesita acceder a datos específicos mediante una clave única.

En entornos reales de Business Central, estas estructuras pueden ser usadas para:

  • Crear informes personalizados.
  • Implementar lógica de negocio compleja que requiera acceso rápido a múltiples datos relacionados.
  • Mejorar la eficiencia y la claridad del código, facilitando su mantenimiento y escalabilidad.

Conclusión

Las listas y los diccionarios son herramientas poderosas en AL que pueden simplificar la gestión de

datos en Business Central. Al utilizarlas correctamente, se pueden crear aplicaciones más robustas y eficientes.

¡Si quieres ver el código completo, está en GitHub!

¡Espero que este post te haya sido útil! Hasta la próxima.

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *