EJERCICIO 03 · CLAVES PRIMARIAS
Claves Primarias (PK)
Dificultad: 4/10Ejercicios 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 triggerOnValidatey 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
SK1sobre el campo"Estado". - Añade una segunda clave secundaria
SK2sobre"Categoria"con la propiedadMaintainSqlIndex = 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.alcon ID50101y 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
SK1sobre"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.alcon ID50102y nombre"Historial Estado Maquina". - El primer campo debe ser
"Entry No."de tipoIntegercon la propiedadAutoIncrement = 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"conMaintainSiftIndex = truepara 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.