EJERCICIO 02 · ENUMS

Enum en una Page

Dificultad: 3/10
Ejercicio anterior

¿Qué construiste en el Ejercicio 01?

  • El Enum "Rental Status" (ID 50100) con valores 0 → 40, extensible.
  • Una enumextension que añadía el valor 50: "Vendido".
  • La tabla "Maquinaria" (ID 50100) con los campos "No.", "Descripcion" y "Estado".
  • Un bloque if que comprobaba el estado del registro con Rec.Estado::Alquilado.
Ejercicio 01
Page · List

Crea la página de lista de Maquinaria

Objetivo: Exponer la tabla "Maquinaria" al usuario final creando una Page de tipo List que muestre sus tres campos, incluido el Enum "Estado".

Instrucciones

  • Crea un archivo MaquinariaList.Page.al.
  • La página debe tener el ID 50100, nombre "Maquinaria List" y PageType = List.
  • Enlázala a la tabla "Maquinaria" mediante la propiedad SourceTable.
  • Dentro del área content añade un repeater con los tres campos: "No.", "Descripcion" y "Estado".
  • El campo "Estado" debe mostrarse como un field normal; Business Central renderizará el Enum como un desplegable automáticamente.

Pista de Código

AL — MaquinariaList.Page.al
page 50100 "Maquinaria List"
{
    PageType   = List;
    SourceTable = "Maquinaria";
    UsageCategory = Lists;
    ApplicationArea = All;

    layout
    {
        area(content)
        {
            repeater(General)
            {
                field("No.";         Rec."No.")         { ApplicationArea = All; }
                field("Descripcion"; Rec."Descripcion") { ApplicationArea = All; }
                field("Estado";      Rec."Estado")      { ApplicationArea = All; }
            }
        }
    }
}
Ejercicio 02
Page · Card

Crea la ficha de Maquinaria

Objetivo: Crear una página de tipo Card para ver y editar el detalle de cada máquina, añadiendo un trigger OnValidate sobre el campo "Estado" que muestre un aviso cuando la máquina pase a estado Retirado.

Instrucciones

  • Crea MaquinariaCard.Page.al con ID 50101 y PageType = Card.
  • Usa la misma SourceTable = "Maquinaria".
  • En el layout, crea una group(General) con los tres campos.
  • En el campo "Estado", añade un trigger OnValidate que compruebe Rec.Estado = Rec.Estado::Retirado y muestre el mensaje: 'Atención: esta máquina ha sido retirada del parque.'
  • Conecta la ficha desde la lista añadiendo la propiedad DrillDownPageId en la tabla "Maquinaria" con el valor "Maquinaria Card".

Pista de Código

AL — MaquinariaCard.Page.al
page 50101 "Maquinaria Card"
{
    PageType    = Card;
    SourceTable = "Maquinaria";
    UsageCategory = None;

    layout
    {
        area(content)
        {
            group(General)
            {
                field("No.";         Rec."No.")         { ApplicationArea = All; }
                field("Descripcion"; Rec."Descripcion") { ApplicationArea = All; }
                field("Estado";      Rec."Estado")
                {
                    ApplicationArea = All;
                    trigger OnValidate()
                    begin
                        if Rec.Estado = Rec.Estado::Retirado then
                            Message('Atención: esta máquina ha sido retirada del parque.');
                    end;
                }
            }
        }
    }
}
⚠️ Ojo: El trigger OnValidate se ejecuta al confirmar el cambio de valor en el campo, no al abrir la ficha. Si necesitas validar al cargar el registro, usa OnAfterGetRecord en la page.
Ejercicio 03
Filtros con Enum

Filtra la lista por Estado

Objetivo: Añadir una acción en la página "Maquinaria List" que aplique un filtro sobre el campo "Estado" para mostrar únicamente las máquinas Disponibles.

Instrucciones

  • Abre MaquinariaList.Page.al y añade una sección actions.
  • Dentro de un area(processing) crea una action llamada SoloDisponibles con caption 'Ver solo Disponibles'.
  • En el trigger OnAction usa Rec.SetRange para filtrar el campo "Estado" al valor "Rental Status"::Disponible.
  • Llama a CurrPage.Update(false) al final para refrescar la vista.

Pista de Código

AL — fragmento dentro de MaquinariaList.Page.al
actions
{
    area(processing)
    {
        action(SoloDisponibles)
        {
            ApplicationArea = All;
            Caption         = 'Ver solo Disponibles';
            Image           = Filter;
            trigger OnAction()
            begin
                Rec.SetRange(Estado, "Rental Status"::Disponible);
                CurrPage.Update(false);
            end;
        }
    }
}
💡 Recuerda: Para quitar el filtro y volver a ver todos los registros puedes usar Rec.SetRange(Estado) sin segundo argumento, o añadir una segunda acción LimpiarFiltro que llame a Rec.Reset().
← Volver a Ejercicios