EJERCICIO 03 · CLAVES PRIMARIAS

Claves Primarias (PK)

Dificultad: 4/10
Ejercicios anteriores

¿Qué construiste hasta ahora?

  • El Enum "Rental Status" (ID 50100) con los estados de la maquinaria, extensible.
  • La tabla "Maquinaria" (ID 50100) con los campos "No.", "Descripcion" y "Estado", y su PK simple sobre "No.".
  • Las pages "Maquinaria List" y "Maquinaria Card" con un trigger OnValidate y una acción de filtro por estado.
Ejercicio 01
Clave secundaria

Añade una clave secundaria a Maquinaria

Objetivo: Ampliar la tabla "Maquinaria" con dos nuevos campos y una clave secundaria sobre el estado, para acelerar las búsquedas y filtros que ya creaste en el ejercicio anterior.

Instrucciones

  • Abre la tabla "Maquinaria" y añade dos campos nuevos: "Categoria" (Code[20]) y "Fecha Alta" (Date).
  • En la sección keys, mantén la PK existente sobre "No.".
  • Añade una clave secundaria SK1 sobre el campo "Estado".
  • Añade una segunda clave secundaria SK2 sobre "Categoria" con la propiedad MaintainSqlIndex = false (solo se usará en filtros internos de BC, no en consultas SQL externas).

Pista de Código

AL — Maquinaria.Table.al (fragmento keys)
    keys
    {
        key(PK;  "No.")       { }
        key(SK1; "Estado")    { }
        key(SK2; "Categoria")
        {
            MaintainSqlIndex = false;
        }
    }
💡 Recuerda: MaintainSqlIndex = false ahorra recursos en escritura cuando el índice solo se necesita dentro de Business Central. Es especialmente útil en tablas con muchas inserciones.
Ejercicio 02
PK compuesta

Crea la tabla de líneas de alquiler

Objetivo: Diseñar una tabla de líneas relacionada con "Maquinaria" usando una clave primaria compuesta para representar la relación documento → línea.

Instrucciones

  • Crea el archivo LineaAlquiler.Table.al con ID 50101 y nombre "Linea Alquiler".
  • Añade los campos: "No. Alquiler" (Code[20]), "No. Linea" (Integer), "No. Maquina" (Code[20]), "Fecha Inicio" (Date) y "Fecha Fin" (Date).
  • Define la PK como compuesta sobre los campos "No. Alquiler" y "No. Linea" combinados.
  • Añade una clave secundaria SK1 sobre "No. Maquina" para poder buscar rápidamente todos los alquileres de una máquina concreta.

Pista de Código

AL — LineaAlquiler.Table.al
table 50101 "Linea Alquiler"
{
    fields
    {
        field(1; "No. Alquiler";  Code[20]) { }
        field(2; "No. Linea";     Integer)  { }
        field(3; "No. Maquina";   Code[20]) { }
        field(4; "Fecha Inicio";  Date)     { }
        field(5; "Fecha Fin";     Date)     { }
    }
    keys
    {
        key(PK; "No. Alquiler", "No. Linea") { }  // PK compuesta
        key(SK1; "No. Maquina")              { }  // SK para búsquedas
    }
}
💡 Recuerda: La PK compuesta garantiza que el alquiler ALQ001 puede tener las líneas 1, 2 y 3 sin conflicto. La unicidad se evalúa sobre la combinación de ambos campos, no sobre cada uno por separado.
Ejercicio 03
AutoIncrement

Tabla de movimientos con numeración automática

Objetivo: Crear una tabla de historial de cambios de estado de la maquinaria usando AutoIncrement como PK, y una SK con MaintainSiftIndex para mantener contadores por máquina.

Instrucciones

  • Crea HistorialEstado.Table.al con ID 50102 y nombre "Historial Estado Maquina".
  • El primer campo debe ser "Entry No." de tipo Integer con la propiedad AutoIncrement = true. Este será la PK.
  • Añade los campos: "No. Maquina" (Code[20]), "Estado Anterior" (Enum "Rental Status"), "Estado Nuevo" (Enum "Rental Status") y "Fecha Cambio" (DateTime).
  • Define la PK sobre "Entry No.".
  • Añade una SK sobre "No. Maquina" con MaintainSiftIndex = true para poder contar los cambios de estado de cada máquina de forma eficiente.

Pista de Código

AL — HistorialEstado.Table.al
table 50102 "Historial Estado Maquina"
{
    fields
    {
        field(1; "Entry No.";       Integer)
        {
            AutoIncrement = true;  // BC asigna el número automáticamente
        }
        field(2; "No. Maquina";     Code[20])              { }
        field(3; "Estado Anterior"; Enum "Rental Status") { }
        field(4; "Estado Nuevo";    Enum "Rental Status") { }
        field(5; "Fecha Cambio";    DateTime)             { }
    }
    keys
    {
        key(PK; "Entry No.")
        {
            // Clustered = true por defecto, no hace falta declararlo
        }
        key(SK1; "No. Maquina")
        {
            MaintainSiftIndex = true;
        }
    }
}
⚠️ Recuerda: AutoIncrement no garantiza una secuencia sin huecos. Si se borra un registro, su número no se reutiliza. No uses este campo para numerar documentos visibles al usuario; para eso existen los No. Series.
💡 Bonus: ¿Dónde escribirías el código que inserta una fila en esta tabla cada vez que cambia el campo "Estado" de "Maquinaria"? Pista: ya tienes el sitio perfecto en el trigger OnValidate del campo "Estado" de MaquinariaCard.Page.al.
← Volver a Ejercicios