Estructuras de Datos
Claves Primarias (PK)
Dificultad: 4/10Las claves primarias se utilizan para identificar registros en la tabla, por eso no puede haber repetidas; para acelerar la clasificación y filtrado.
Puede haber hasta 40 claves por tabla, pero siempre debe existir al menos una clave primaria.
Estructura de una Clave
Plantilla para una clave (donde pone PK, se escribe la clave primaria. Todo lo que vaya
después, son secundarias). Puede haber varias claves primarias, pero, al menos, debe haber una.
keys
{
key(PK; "<Campo1>", "<Campo2>") { } // Clave primaria (puede ser compuesta)
key(SK1; "<Campo>") { } // Clave secundaria
}
Poner Clustered = true entre los corchetes de la PK es insignificante porque es el valor por
defecto.
Propiedades de las claves
Propiedades de las key (dentro de las llaves de key):
| Propiedad | Significado |
|---|---|
MaintainSiftIndex |
Mantiene índices de suma (SUMINDEXFIELDS), actualizando saldos e índices en
cada inserción |
MaintainSqlIndex |
Si es true, crea el índice en SQL. Si es false, solo existe
virtualmente en BC para ahorrar recursos en escritura |
Unique |
La clave secundaria no puede tener valores repetidos |
Clustered |
Define el orden físico de almacenamiento en SQL (por defecto en la PK) |
AutoIncrement: numeración automática
AutoIncrement es una propiedad del campo, no de la clave. Cuando se activa
en un campo Integer, Business Central asigna automáticamente el siguiente número disponible
al crear cada registro.
field(1; "Entry No."; Integer)
{
AutoIncrement = true;
}
⚠️ Aviso
AutoIncrement no garantiza una secuencia contigua. Si se borra un
registro, su número no se reutiliza.
Claves compuestas
Una PK puede estar formada por varios campos combinados. La unicidad se evalúa sobre la combinación completa, no sobre cada campo por separado.
keys
{
key(PK; "No. Documento", "No. Linea") { }
}
Esto permite que exista el documento DOC001 con las líneas 1, 2 y 3, sin conflicto entre
ellas.
Ejemplo completo
table 50102 "Linea Prestamo"
{
fields
{
field(1; "Entry No."; Integer)
{
AutoIncrement = true; // BC asigna el número automáticamente
}
field(2; "No. Prestamo"; Code[20]) { }
field(3; "No. Linea"; Integer) { }
field(4; "No. Libro"; Code[20]) { }
field(5; "Fecha"; Date) { }
}
keys
{
key(PK; "Entry No.") { } // PK simple con AutoIncrement
key(SK1; "No. Prestamo", "No. Linea") { } // SK compuesta para búsquedas
key(SK2; "No. Libro")
{
MaintainSiftIndex = true; // mantiene índices de suma
}
}
}
💡 Tips
- La PK debe ser inmutable: elige campos que nunca vayan a cambiar (cambiar la PK
dispara el trigger
OnRename). - En tablas de movimientos o líneas, lo más habitual es usar un
Entry No.conAutoIncrement. - Las claves secundarias con
MaintainSqlIndex = falseahorran recursos en escritura cuando solo se usan en BC, no en consultas SQL externas.