BC Blueprint - Dimensions
Un análisis funcional y técnico en profundidad sobre cómo
Business Central clasifica cada movimiento sin multiplicar el plan de
cuentas; cómo nacen, se heredan, se validan y se almacenan las
dimensiones; qué objetos participan; qué significa realmente
Dimension Set ID; y por qué una dimensión aparentemente
inocente puede mejorar el análisis de la empresa o convertir cada
documento en un pequeño interrogatorio administrativo.
Nota de versión: los nombres e identificadores de objetos, campos y procedimientos públicos de este artículo se han contrastado con la documentación pública de Microsoft disponible el 31 de agosto de 2026. Los textos funcionales están en español, pero los objetos y referencias de AL conservan su nombre original en inglés. Comprueba siempre los símbolos de la versión exacta contra la que compila tu extensión: Business Central evoluciona, incluso cuando la tabla sigue llamándose
Dimension Set Entryy parece llevar allí desde antes de que existieran las nubes.
El problema que resuelven las dimensiones
Una empresa quiere saber cuánto vende.
Después quiere saber cuánto vende por departamento. Luego por zona, proyecto, canal, campaña, vendedor y línea de negocio. Poco después alguien propone crear una cuenta contable distinta para cada combinación. La conversación empieza con entusiasmo y termina con un plan de cuentas que parece el catálogo de una ferretería industrial.
Las dimensions existen para evitar esa explosión.
Una cuenta contable responde principalmente a qué naturaleza económica tiene el movimiento: ventas, alquileres, bancos, clientes, existencias o coste de ventas. Una dimensión responde a desde qué perspectiva queremos analizarlo: departamento, área, proyecto, canal o centro de coste.
La separación es fundamental:
| Pregunta | Mecanismo principal | Ejemplo |
|---|---|---|
| ¿En qué cuenta debe registrarse? | Posting Groups y configuración contable |
Cuenta 7000, ventas nacionales |
| ¿Cómo quiero clasificar ese importe? | Dimensions |
DEPARTMENT = SALES |
| ¿Qué tercero, producto o documento originó el movimiento? | Ledger entries y campos de trazabilidad | Customer C-10000, Item 1896-S |
| ¿Cómo quiero agruparlo para análisis recurrente? | Filtros, Analysis View, informes o modelo
analítico |
Margen por AREA y PROJECT |
Esta distinción conecta directamente con BC Blueprint - Posting Groups: los posting groups deciden el destino contable; las dimensions describen el movimiento que llegó allí. Una responde “dónde”; la otra, “desde qué ángulo quiero mirarlo”. Mezclarlas suele producir cuentas con apellidos kilométricos o dimensiones que intentan arreglar una contabilización incorrecta. Ninguna de las dos cosas termina bien.
Microsoft define una dimensión como una categoría que permite analizar y organizar los movimientos sin ampliar innecesariamente el plan de cuentas. Esa definición funcional es correcta, pero debajo existe una arquitectura bastante más interesante: valores predeterminados distribuidos por maestros, reglas de prioridad, restricciones, combinaciones normalizadas y un identificador compartido que viaja por documentos y movimientos. Microsoft Learn: Work with dimensions
Primero, el modelo mental
Antes de abrir una página de configuración, conviene separar cinco conceptos que en conversación suelen mezclarse como si fueran la misma cosa.
1. Dimension
Es el eje de análisis. DEPARTMENT, AREA,
PROJECT o CHANNEL son dimensiones.
La tabla Dimension (ID 348) contiene el código, nombre,
captions, información de consolidación e intercompany y el estado
Blocked. Una dimensión no contiene todavía la clasificación
concreta de un movimiento; define la pregunta que podremos hacerle a los
datos.
2. Dimension Value
Es una respuesta válida dentro de una dimensión. Para
DEPARTMENT podrían existir SALES,
ADMIN y PROD. Para AREA,
NORTH, SOUTH y EUROPE.
La tabla Dimension Value (ID 349) almacena esos valores.
También permite jerarquías mediante tipos como Standard,
Begin-Total, End-Total, Total y
Heading, además de indentación y totalización. Los valores
de total sirven para presentar y agregar; los valores
Standard son los que normalmente se asignan a
transacciones.
3. Default Dimension
Es una regla asociada a un registro maestro. Por ejemplo: el Customer
C-10000 propone AREA = NORTH; el Item 1896-S propone
DEPARTMENT = SALES; el G/L Account 6110 exige que exista un
valor de DEPARTMENT.
La tabla Default Dimension (ID 352) une
Table ID + No. + Dimension Code y
puede guardar Dimension Value Code,
Value Posting y Allowed Values Filter. No es
una dimensión del documento. Es una fuente y una regla
para construir y validar la dimensión del documento.
4. Dimension Set
Es una combinación única de valores de dimensión:
AREA = NORTH
DEPARTMENT = SALES
PROJECT = BC-2027
Business Central representa esa combinación mediante varias filas de
Dimension Set Entry (ID 480), todas con el mismo
Dimension Set ID.
5. Dimension Set ID
Es el entero que identifica la combinación completa. El documento, la
línea o el movimiento no necesita repetir tres, cinco o doce pares
dimensión-valor: guarda un número, por ejemplo 108, que
apunta al conjunto.
Dos registros con exactamente la misma combinación reutilizan el
mismo ID. Si cambia un valor, falta una dimensión o aparece una nueva,
la combinación es distinta y corresponde otro ID.
Dimension Set ID = 0 representa el conjunto vacío, es
decir, ninguna dimensión.
La idea central: una dimensión es el eje; un valor es una opción; un default propone o impone; un dimension set es la combinación efectiva; y
Dimension Set IDes la referencia compacta que viaja por el sistema.
El viaje completo: del maestro al movimiento registrado
El diagrama contiene tres momentos diferentes que conviene no confundir:
- Propuesta. Los maestros aportan defaults. El usuario también puede introducir o cambiar valores.
- Resolución. Business Central combina fuentes, aplica prioridades y comprueba reglas.
- Persistencia. La combinación final obtiene un
Dimension Set ID, que se copia al documento y después a los movimientos.
Cambiar el default de un Customer no reescribe mágicamente todos los documentos abiertos ni todos los movimientos históricos. El default es una regla de origen; el documento contiene una instantánea; el movimiento registrado representa lo que finalmente se contabilizó. Son capas distintas, y tratarlas como una sola es una fuente muy eficiente de reuniones.
Mapa de objetos que merece la pena conocer
La arquitectura central vive principalmente en el namespace
Microsoft.Finance.Dimension.
| Tipo | ID | Objeto | Responsabilidad |
|---|---|---|---|
| Table | 348 | Dimension |
Maestro de ejes de análisis |
| Table | 349 | Dimension Value |
Valores, jerarquías y estado de cada dimensión |
| Table | 350 | Dimension Combination |
Restricción entre pares de dimensiones |
| Table | 351 | Dimension Value Combination |
Pares concretos de valores bloqueados cuando la combinación es limitada |
| Table | 352 | Default Dimension |
Defaults y reglas por registro maestro |
| Enum | 353 | Default Dimension Value Posting Type |
, Code Mandatory, Same Code,
No Code |
| Table | 354 | Default Dimension Priority |
Precedencia entre fuentes para un Source Code |
| Table | 356 | Dim. Value per Account |
Valores permitidos para un maestro concreto |
| Table | 480 | Dimension Set Entry |
Filas que componen cada conjunto único |
| Table | 481 | Dimension Set Tree Node |
Árbol optimizado para localizar o crear conjuntos |
| Codeunit | 408 | DimensionManagement |
Biblioteca central de combinación, validación, edición y defaults |
| Codeunit | 480 | Get Shortcut Dimension Values |
Lectura cacheada de las ocho shortcut dimensions |
| Page | 480 | Edit Dimension Set Entries |
Editor temporal que devuelve un nuevo ID |
| Table | 17 | G/L Entry |
Movimiento contable con global dimensions y
Dimension Set ID |
| Table | 363 | Analysis View |
Definición de análisis preagregado con hasta cuatro dimensiones |
| Codeunit | 2580 | Dimension Correction Mgt |
Orquestación de correcciones sobre G/L entries |
La lista completa es mayor. Existen buffers, páginas de matrices, objetos para cambiar global dimensions, queries para expandir conjuntos, lógica específica de fabricación y las tablas del subsistema de correcciones. Pero los objetos anteriores forman el esqueleto que explica la mayoría de los comportamientos estándar y de las extensiones razonables.
Global, shortcut y todas las demás: tres nombres, un solo modelo
Business Central permite configurar dos global
dimensions y ocho shortcut dimensions en
General Ledger Setup. Las dos primeras shortcut dimensions
son, a la vez, las dos global dimensions.
No son tres familias diferentes de dimensiones. Son posiciones con distinto grado de optimización y visibilidad.
| Categoría | Cantidad | Dónde se usa | Cómo se almacena habitualmente |
|---|---|---|---|
| Global dimensions | 2 | Filtros muy frecuentes, páginas, informes y movimientos | Campos dedicados Global Dimension 1 Code y
Global Dimension 2 Code, además del conjunto |
| Shortcut dimensions | 8 | Entrada rápida en documentos y diarios | Las posiciones 1-2 tienen campos físicos frecuentes; 3-8 suelen
resolverse desde Dimension Set ID según el objeto |
| Otras dimensions | Sin límite práctico de configuración | Página completa de dimensiones, filtros y análisis | Dentro de Dimension Set Entry, accesibles por el
ID |
La razón de los campos físicos para las global dimensions es
rendimiento y comodidad. Filtrar millones de G/L Entry por
dos columnas indexables es más directo que expandir cada conjunto. El
precio es que cambiar qué dimensión ocupa una posición global obliga a
actualizar datos en múltiples tablas.
Microsoft advierte que cambiar global o shortcut dimensions puede ser costoso, bloquear tablas y requerir actualización de movimientos; para bases grandes existe un modo paralelo con sesiones en segundo plano. La conclusión de arquitectura es sencilla: elegir global dimensions no es personalizar una vista. Es una decisión de modelo de datos con factura operativa. Microsoft Learn: global and shortcut dimensions
Qué debería ocupar las posiciones globales
Normalmente, dimensiones que cumplen tres condiciones:
- Se usan en una gran parte de las transacciones.
- Se filtran constantemente en contabilidad y reporting.
- Su definición será estable durante años.
DEPARTMENT y AREA suelen ser candidatas.
CAMPAIGN-OF-THE-WEEK no suele serlo. Tampoco conviene
colocar una dimensión en posición global porque el director financiero
la preguntó tres veces durante una reunión especialmente larga.
Shortcut Dimension 3 Code
no siempre es una columna
En páginas estándar, las shortcut dimensions 3-8 se muestran mediante
variables, arrays y lógica de página. Algunos ledger entries sí incluyen
campos físicos Shortcut Dimension 3 Code a
Shortcut Dimension 8 Code; otros objetos se apoyan
principalmente en Dimension Set ID. No asumas uniformidad
entre tablas.
La fuente de verdad transversal es el conjunto. El codeunit
Get Shortcut Dimension Values (ID 480,
SingleInstance = true) expone
GetShortcutDimensions(DimSetID, var ShortcutDimCode) y usa
caché de General Ledger Setup. Esto permite presentar las
ocho posiciones sin inventar ocho joins manuales por cada línea.
Dimension
y Dimension Value: diseñar un idioma analítico
Crear dimensiones no consiste en copiar cada columna del CRM o del data warehouse. Consiste en definir un vocabulario estable para clasificar movimientos.
Una buena dimensión tiene:
- Una pregunta empresarial clara.
- Valores mutuamente comprensibles.
- Un propietario funcional.
- Una regla de asignación.
- Una expectativa de estabilidad.
- Un uso analítico que justifique el coste de captura.
Jerarquías de valores
Dimension Value permite construir grupos con
Begin-Total y End-Total, de forma parecida a
la estructura del plan de cuentas. Esto puede facilitar informes como
Europa → UE / No UE o Comercial → Norte / Sur.
Pero una jerarquía de presentación no sustituye a una dimensión
independiente. Si COUNTRY y SALES_REGION
cambian con reglas diferentes, aplastarlas en una sola jerarquía puede
ahorrar configuración hoy y fabricar ambigüedad mañana.
Bloquear no es borrar
Cuando una dimensión o valor deja de ser válido, bloquearlo conserva los movimientos históricos y evita nuevas selecciones. Borrarlo puede estar impedido si ya se utiliza y, aunque fuera técnicamente posible en algún contexto, sería una forma excelente de romper la semántica histórica.
El código NORTH registrado hace tres años debe seguir
significando algo dentro de tres años. Renombrar el Name
para mejorar la descripción es distinto de reutilizar el
Code para una realidad diferente. Los códigos de dimensión
son claves analíticas, no matrículas reciclables.
Default Dimension:
propuesta, obligación y prohibición
La tabla Default Dimension tiene una doble
personalidad:
- Sugiere valores al crear documentos o diarios.
- Valida qué está permitido registrar para un maestro.
El campo Value Posting está basado en el enum
Default Dimension Value Posting Type (ID 353):
| Valor | Qué exige al registrar | Uso típico | Riesgo habitual |
|---|---|---|---|
| En blanco | No añade una obligación específica | Default orientativo o dimensión opcional | Creer que el valor no puede cambiarse |
Code Mandatory |
Debe existir algún valor para esa dimensión | Centro de coste obligatorio, pero variable | Configurarlo sin proceso para decidir el valor |
Same Code |
Debe existir exactamente el valor del default | Un activo o cuenta pertenece siempre a una unidad | Usarlo en maestros cuya clasificación sí cambia por operación |
No Code |
La dimensión no puede aparecer | Evitar una dimensión irrelevante o prohibida | Bloquear documentos por una herencia inesperada |
Code Mandatory no significa “usar el código
configurado”. Significa “algún código no vacío”. Same Code
sí fija el valor. Y No Code no es lo mismo que dejar el
default vacío: es una prohibición explícita.
Allowed Values Filter:
obligatorio, pero no libre
Un caso intermedio muy útil es exigir una dimensión y limitar sus
valores. Por ejemplo, la cuenta de gastos 6110 requiere
DEPARTMENT, pero solo admite ADMIN|SALES. El
filtro se almacena en
Default Dimension."Allowed Values Filter"; la tabla
Dim. Value per Account (ID 356) mantiene los valores
permitidos utilizados por la interfaz y la validación.
Esto evita crear veinte cuentas contables solo para controlar qué
departamento puede usar una naturaleza de gasto. También evita depender
de una instrucción escrita en un documento llamado
Normas_final_v7_AHORA_SI.pdf.
Defaults de tipo de cuenta
Business Central también permite definir defaults para un tipo de cuenta, no solo para registros individuales. Es potente y, por eso mismo, merece pruebas. Una regla amplia puede afectar cientos de maestros y entrar en conflicto con reglas específicas.
La validación final no pregunta si el usuario vio el default.
Pregunta si el Dimension Set ID que se intenta registrar
satisface las reglas de todas las fuentes relevantes.
Cuando varias fuentes quieren mandar
Una línea de venta puede recibir dimensiones del Customer, del Location, del Item, de la cabecera y de valores introducidos manualmente. Si todas aportan dimensiones distintas, se combinan. Si dos fuentes aportan valores diferentes para la misma dimensión, existe un conflicto.
Default Dimension Priority (ID 354) resuelve la
precedencia por Source Code. Las prioridades no son
universales: una política útil para ventas puede no ser la apropiada
para compras o diarios.
Si dos tablas tienen la misma prioridad para el mismo
Source Code, Business Central elige la tabla con el ID menor. Es determinista, pero “ganó Customer porque 18 es menor que 27” rara vez es una política contable que alguien quiso escribir conscientemente. Microsoft Learn: default dimension priorities
El orden de entrada también importa
Las dimensiones de una cabecera se heredan a nuevas líneas. Cambiar después un campo de cabecera puede provocar una pregunta para actualizar líneas existentes. Añadir un Item puede aportar otro default. Por eso dos usuarios pueden llegar a resultados diferentes introduciendo los mismos datos en distinto orden si la política no está bien definida.
No es aleatoriedad. Es herencia sobre un documento vivo.
Para sales y purchase documents, Microsoft señala una sutileza importante: las dimensiones de cabecera se consideran provenientes del Customer o Vendor, incluso si se introdujeron manualmente, lo que afecta a la prioridad frente a Item o Location. La única defensa sensata es probar escenarios en el orden real en que trabajan los usuarios, no solo rellenar una matriz de configuración y contemplarla con optimismo. Microsoft Learn: priority example
Qué hace
DimensionManagement
El codeunit DimensionManagement (ID 408) ofrece el
núcleo reutilizable:
AddDimSource(...)construye la lista moderna de fuentes comoList of [Dictionary of [Integer, Code[20]]].GetDefaultDimID(...)combina defaults, prioridades e herencia y devuelve un ID.GetRecDefaultDimID(...)añade el contexto de un registro y campo.GetCombinedDimensionSetID(...)fusiona hasta diez conjuntos; los posteriores sustituyen dimensiones repetidas de los anteriores.GetDeltaDimSetID(...)recalcula un hijo cuando cambia el conjunto del padre, conservando diferencias propias.CheckDimIDComb(...)comprueba restricciones entre dimensiones.CheckDimValuePosting(...)comprueba las reglas de los maestros y valores permitidos.
La extensión que crea documentos con dimensions debería reutilizar
estas primitivas. Reimplementar la precedencia con tres if
y una esperanza no es una optimización; es una bifurcación
funcional.
Restricciones: evitar combinaciones que no deberían existir
Los defaults responden “qué valor propongo o exijo para este maestro”. Las combinaciones responden “qué pares no pueden convivir en el mismo movimiento”. Son controles diferentes.
Dimension Combination
La tabla Dimension Combination (ID 350) trabaja por
pares de dimensiones:
- No limitation: ambas dimensiones pueden coexistir.
- Limited: pueden coexistir, salvo determinadas parejas de valores.
- Blocked: ambas dimensiones no pueden aparecer juntas, independientemente de sus valores.
Si PROJECT y CAMPAIGN representan dos
mecanismos excluyentes de atribución, la combinación completa podría
bloquearse. Si DEPARTMENT y PROJECT pueden
convivir pero el proyecto FACTORY-01 no pertenece a
SALES, la combinación será Limited y se
bloqueará solo esa pareja de valores.
Dimension Value Combination
La tabla Dimension Value Combination (ID 351) almacena
las parejas concretas bloqueadas para combinaciones limitadas. La
interfaz utiliza matrices simétricas: la regla
DEPARTMENT/SALES con PROJECT/FACTORY-01 es la
misma aunque la mires desde la fila o desde la columna.
La validación estándar pasa por
DimensionManagement.CheckDimIDComb. Si devuelve
false, GetDimCombErr() proporciona el error.
Normalmente no deberías llamar a la tabla 350 directamente desde un
proceso de posting personalizado; usa el motor para que también se
evalúen los valores limitados.
No conviertas la matriz en un motor de reglas universal
Las combinaciones son pares. Si una regla depende simultáneamente de cuatro dimensiones, fecha, usuario y color de la luna, la matriz no es el lugar natural. Podrías terminar manteniendo cientos de bloqueos parciales sin que nadie pueda explicar la política completa.
En ese caso, documenta la regla empresarial y aplica una validación explícita mediante eventos o en tu dominio. Las dimensiones sirven para clasificación y controles razonables; no necesitan convertirse en un lenguaje de programación accidental.
Dimension Set ID:
la pieza que lo cambia todo
Antes de la arquitectura de dimension sets, almacenar dimensiones significaba repetir pares dimensión-valor en tablas auxiliares para cada documento y movimiento. Business Central normaliza la combinación y la reutiliza.
Supongamos este conjunto:
Dimension Set ID |
Dimension Code |
Dimension Value Code |
Dimension Value ID |
|---|---|---|---|
| 108 | AREA |
NORTH |
41 |
| 108 | DEPARTMENT |
SALES |
73 |
| 108 | PROJECT |
BC-2027 |
105 |
En Dimension Set Entry, la clave lógica de una fila
incluye el ID del conjunto y el código de dimensión. El campo
Dimension Value ID es el identificador entero interno del
valor y participa en la búsqueda optimizada. Los nombres se recuperan
desde los maestros; los códigos son la semántica funcional.
La documentación de diseño confirma que, cuando se cierra
Edit Dimension Set Entries, el sistema busca si la
combinación ya existe. Si existe, reutiliza su ID; si no, crea un
conjunto y asigna el nuevo ID al header, line o journal line. Microsoft
Learn: Dimension Set Entries Overview
Un conjunto es inmutable desde la perspectiva de negocio
Imagina que 85.000 movimientos apuntan al ID 108. Si modificases
directamente una de sus filas de AREA = NORTH a
AREA = SOUTH, no habrías corregido un documento: habrías
reescrito el significado de los 85.000 registros que comparten el
conjunto.
Por eso el patrón correcto es:
- Cargar las filas del conjunto en un record
temporary. - Añadir, cambiar o eliminar valores en ese buffer.
- Pedir a
GetDimensionSetIDel ID de la combinación resultante. - Asignar ese nuevo ID al registro que quieres cambiar.
El conjunto original permanece igual. Si la nueva combinación ya existía, se reutiliza. Si no, se crea.
Regla de supervivencia: no hagas
ModifyoDeletesobre filas persistentes deDimension Set Entrypara cambiar las dimensiones de una transacción. No estás editando un detalle privado; estás serrando una rama compartida mientras otros registros están sentados encima.
El árbol de conjuntos: cómo evita Business Central los duplicados
Buscar una combinación comparando todas sus filas contra todos los
conjuntos sería caro. Dimension Set Tree Node (ID 481)
mantiene un árbol cuyos caminos se construyen con
Dimension Value ID ordenados. Es conceptualmente parecido a
un trie.
La tabla 481 guarda Parent Dimension Set ID,
Dimension Value ID, Dimension Set ID e
In Use. Dimension Set Entry.GetDimensionSetID
o el wrapper equivalente de DimensionManagement recorren la
estructura para detectar duplicados y crear ramas cuando es necesario.
Microsoft describe esta tabla como una estructura optimizada para
creación y detección de combinaciones duplicadas. Microsoft
Learn: Dimension Set Tree Node
Consecuencias prácticas
- El orden de introducción no define la identidad.
AREAy despuésDEPARTMENTdebe producir lo mismo que el orden contrario. - La reutilización ahorra espacio cuando muchas transacciones comparten clasificaciones.
- El crecimiento depende del número de combinaciones únicas, no solo del número de dimensiones.
- Un atributo de altísima cardinalidad —por ejemplo número de serie, GUID de integración o documento único— puede crear un conjunto nuevo casi por transacción y reducir el beneficio.
- Copiar un
Dimension Set IDes barato, pero solo es correcto si la combinación completa debe heredarse.
Un ejemplo completo: de tres defaults al ID 108
Tenemos la siguiente configuración:
| Origen | Default | Value Posting |
|---|---|---|
Customer C-10000 |
AREA = NORTH |
Same Code |
Item 1896-S |
DEPARTMENT = SALES |
En blanco |
Job BC-2027 |
PROJECT = BC-2027 |
Same Code |
| G/L Account de ingresos | DEPARTMENT |
Code Mandatory |
Al crear el documento, la cabecera recibe AREA = NORTH.
La línea del Item aporta DEPARTMENT = SALES. Si la
operación está vinculada al Job, aparece PROJECT = BC-2027.
El motor combina las fuentes y produce:
AREA=NORTH | DEPARTMENT=SALES | PROJECT=BC-2027
Supongamos que el árbol devuelve
Dimension Set ID = 108.
El número 108 no significa “Norte” ni “Ventas”. Solo significa esa combinación exacta en esa company. No lo integres como un código empresarial estable, no lo compares entre compañías y no lo hardcodees. En otra base de datos, el ID 108 puede describir otra combinación completamente distinta.
Si otra factura tiene exactamente los mismos tres pares, reutiliza
108. Si el usuario cambia DEPARTMENT = ADMIN, la factura
recibe otro ID. Las filas del 108 no se tocan.
¿Y si header y line tienen IDs distintos?
Es normal. La cabecera expresa el contexto común; la línea puede combinarlo con su propio origen y sus excepciones. Al registrar, cada movimiento se genera desde el contexto dimensional de la línea o de la parte del documento que corresponda. No existe una promesa de que todas las líneas deban compartir el ID de la cabecera.
Una comprobación funcional que solo mira las dimensions del header puede declarar perfecto un documento cuyas líneas cuentan otra historia.
La vida de las dimensiones dentro de un documento
Creación de la cabecera
Al validar Sell-to Customer No. o
Buy-from Vendor No., el documento obtiene defaults del
tercero y otras fuentes de cabecera. Bill-to Customer No. o
Pay-to Vendor No. pueden introducir contexto adicional
según el flujo.
Creación de líneas
Las líneas parten normalmente del conjunto de la cabecera y lo combinan con el tipo y número de línea: Item, Resource, G/L Account, Fixed Asset, Charge (Item) u otros dominios. Location, Job y variantes funcionales pueden añadir fuentes.
Cambios posteriores
Modificar Customer, Vendor, Location o dimensiones de cabecera puede
ofrecer actualizar líneas. El sistema necesita respetar diferencias
específicas de cada línea; para ello existen patrones como
GetDeltaDimSetID, que trasladan el cambio del padre sin
destruir dimensiones propias del hijo.
Copias y documentos correctivos
Copiar un documento o crear un credit memo desde un documento registrado requiere decidir si se conserva el conjunto histórico, se recalculan defaults actuales o se mezcla ambos comportamientos. El estándar tiene reglas por proceso. Una extensión no debería asumir que “copiar campos” y “recalcular dimensions” son equivalentes.
El registro
Antes de registrar, los posting routines validan:
- que las dimensions y values no estén bloqueados;
- que la combinación no viole
Dimension Combination; - que cada fuente satisfaga
Value Posting; - que los values cumplan restricciones por account;
- que los global dimension fields sean coherentes con el conjunto.
Después, el Dimension Set ID se copia a los ledger
entries correspondientes. El proceso puede generar varios movimientos
—G/L, VAT, customer/vendor, item, value, job, fixed asset— y no todos
tienen necesariamente la misma combinación, porque representan
componentes distintos de la operación.
Qué queda guardado después de registrar
G/L Entry (table 17) incluye
Global Dimension 1 Code,
Global Dimension 2 Code y Dimension Set ID.
Esto permite filtros rápidos para las dos globales y acceso al conjunto
completo para cualquier otra.
Muchas tablas de movimientos también contienen
Dimension Set ID: Cust. Ledger Entry,
Vendor Ledger Entry, Item Ledger Entry,
Value Entry, Job Ledger Entry,
FA Ledger Entry, VAT Entry y otras. Algunas
incluyen además shortcut dimension fields físicos.
Dos matices importan:
- Tener el mismo origen no garantiza el mismo ID en todos los ledgers. Reglas de registro, redondeos, cuentas y contextos específicos pueden producir conjuntos diferentes.
- La corrección de G/L no reescribe necesariamente subledgers. El modelo permite que la vista contable corregida y el detalle operativo histórico diverjan.
Por eso una conciliación dimensional debe declarar qué ledger considera autoritativo. “He filtrado por dimensión y no coincide” no es todavía un diagnóstico; es el título de la investigación.
Correcciones: arreglar el análisis sin recontabilizar importes
La funcionalidad de dimension corrections permite cambiar dimensions
en G/L Entry ya registradas y actualizar analysis views. No
cambia importes, cuentas contables, posting dates ni documentos
originales.
El codeunit Dimension Correction Mgt (ID 2580), dentro
de Microsoft.Finance.Dimension.Correction, gestiona
validación, generación de conjuntos objetivo, ejecución, programación y
estados. El subsistema utiliza tablas de cabecera, cambios, selección de
movimientos, buffers y logs.
La limitación más importante
Microsoft lo indica expresamente: las correcciones se aplican a G/L entries, no a los movimientos relacionados de otros ledgers. Después de corregir, las dimensions del mayor pueden no coincidir con customer, vendor o item ledger entries del mismo registro. Microsoft Learn: Troubleshoot and correct dimensions
Eso no convierte la función en peligrosa; define su propósito. Sirve para corregir reporting financiero cuando la naturaleza económica es correcta y la clasificación analítica no. No sustituye a desregistrar o revertir procesos operativos cuando el error afecta al documento, a existencias, a impuestos o a la cuenta.
Antes de ejecutar una corrección
- Define exactamente qué G/L entries entran en el alcance.
- Revisa la vista previa de cambios.
- Comprueba bloqueos y combinaciones.
- Entiende qué analysis views se actualizarán.
- Decide cómo se explicará la divergencia con subledgers.
- Conserva una evidencia del motivo y aprobación.
Una corrección de dimensión puede mejorar un informe sin alterar el saldo. Precisamente por eso necesita gobierno: es capaz de cambiar la narrativa analítica de movimientos históricos sin una nueva contabilización.
Cambiar las global dimensions: una operación de datos, no cosmética
Modificar Global Dimension 1 Code o
Global Dimension 2 Code obliga a sincronizar campos
dedicados en múltiples tablas y actualizar el indicador correspondiente
dentro de dimension sets. El proceso estándar dispone de páginas, tablas
de log y codeunits específicos como
Change Global Dim. Log Mgt. y
Update Dim. Set Glbl. Dim. No..
Microsoft ofrece dos modos:
- Sequential: una operación que puede bloquear múltiples tablas; adecuada para compañías pequeñas.
- Parallel: divide el trabajo en sesiones de fondo y transacciones; recomendada para volúmenes grandes, con restricciones de sesiones activas.
Esto tiene impacto en disponibilidad, duración, bloqueos y plan de reversión. Trátalo como una migración de datos:
- medir volumen por tabla;
- probar en copia representativa;
- calcular ventana;
- validar extensiones con campos dimensionales propios;
- ejecutar con monitorización;
- reconciliar filtros y analysis views.
La mejor optimización sigue siendo elegir bien las global dimensions al principio.
Arquitectura AL para un objeto personalizado
Supongamos una tabla personalizada Service Allocation
que debe comportarse como un documento estándar. El patrón mínimo
contiene:
Global Dimension 1 Code.Global Dimension 2 Code.Dimension Set ID.- Validación sincronizada entre shortcut fields y conjunto.
- Una acción para editar el conjunto completo.
- Herencia de defaults mediante las APIs estándar.
- Validación antes de registrar.
Campos y triggers
table 50120 "Service Allocation"
{
DataClassification = CustomerContent;
fields
{
field(1; "No."; Code[20])
{
Caption = 'No.';
}
field(20; "Customer No."; Code[20])
{
Caption = 'Customer No.';
TableRelation = Customer;
trigger OnValidate()
begin
CreateDimFromDefaultDim();
end;
}
field(30; "Global Dimension 1 Code"; Code[20])
{
CaptionClass = '1,1,1';
TableRelation = "Dimension Value".Code
where("Global Dimension No." = const(1), Blocked = const(false));
trigger OnValidate()
begin
DimMgt.ValidateShortcutDimValues(
1, "Global Dimension 1 Code", "Dimension Set ID");
end;
}
field(31; "Global Dimension 2 Code"; Code[20])
{
CaptionClass = '1,1,2';
TableRelation = "Dimension Value".Code
where("Global Dimension No." = const(2), Blocked = const(false));
trigger OnValidate()
begin
DimMgt.ValidateShortcutDimValues(
2, "Global Dimension 2 Code", "Dimension Set ID");
end;
}
field(40; "Dimension Set ID"; Integer)
{
Caption = 'Dimension Set ID';
Editable = false;
TableRelation = "Dimension Set Entry";
}
}
keys
{
key(PK; "No.") { Clustered = true; }
}
var
DimMgt: Codeunit DimensionManagement;
local procedure CreateDimFromDefaultDim()
var
DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
begin
DimMgt.AddDimSource(
DefaultDimSource, Database::Customer, "Customer No.");
"Dimension Set ID" := DimMgt.GetDefaultDimID(
DefaultDimSource,
'',
"Global Dimension 1 Code",
"Global Dimension 2 Code",
"Dimension Set ID",
Database::"Service Allocation");
end;
procedure ShowDimensions()
begin
"Dimension Set ID" := DimMgt.EditDimensionSet(
Rec,
"Dimension Set ID",
StrSubstNo('%1 %2', TableCaption, "No."),
"Global Dimension 1 Code",
"Global Dimension 2 Code");
end;
}
El ejemplo ilustra el patrón, no una aplicación completa. El
Source Code, los orígenes y el
InheritFromTableNo deben representar el proceso real. Una
línea debería considerar su header y el maestro de su tipo. Un posting
routine debería volver a validar, no confiar solo en los triggers de
página.
Editar el conjunto completo
DimensionManagement.EditDimensionSet(...) abre
Edit Dimension Set Entries sobre una tabla temporal y
devuelve el ID resultante. La overload con variables de global
dimensions mantiene sincronizados los campos 1 y 2.
trigger OnAction()
begin
Rec.ShowDimensions();
CurrPage.SaveRecord();
end;
La página estándar no edita las filas persistentes del conjunto. Carga un buffer temporal, permite cambios y obtiene un ID nuevo o existente al cerrar. Esa distinción es la arquitectura, no un detalle de interfaz.
Mostrar shortcut dimensions 3-8
Para leer las ocho posiciones:
var
GetShortcutDimValues: Codeunit "Get Shortcut Dimension Values";
ShortcutDimCode: array[8] of Code[20];
local procedure LoadShortcutDimensions()
begin
Clear(ShortcutDimCode);
GetShortcutDimValues.GetShortcutDimensions(
Rec."Dimension Set ID", ShortcutDimCode);
end;
En una página de líneas, el patrón estándar decide qué columnas 3-8
son visibles, usa CaptionClass dinámica y llama a
ValidateShortcutDimValues cuando se modifica una. Copiar el
patrón de un documento estándar cercano a tu dominio suele ser más
seguro que diseñar una página genérica desde cero.
Construir o transformar un conjunto sin interfaz
local procedure ReplaceProjectDimension(
OldDimSetID: Integer;
NewProjectCode: Code[20]
): Integer
var
DimMgt: Codeunit DimensionManagement;
TempDimSetEntry: Record "Dimension Set Entry" temporary;
DimValue: Record "Dimension Value";
begin
DimMgt.GetDimensionSet(TempDimSetEntry, OldDimSetID);
TempDimSetEntry.SetRange("Dimension Code", 'PROJECT');
TempDimSetEntry.DeleteAll();
TempDimSetEntry.Reset();
if NewProjectCode <> '' then begin
DimValue.Get('PROJECT', NewProjectCode);
DimValue.TestField(Blocked, false);
TempDimSetEntry.Init();
TempDimSetEntry."Dimension Set ID" := 0;
TempDimSetEntry."Dimension Code" := DimValue."Dimension Code";
TempDimSetEntry."Dimension Value Code" := DimValue.Code;
TempDimSetEntry."Dimension Value ID" := DimValue."Dimension Value ID";
TempDimSetEntry.Insert();
end;
exit(DimMgt.GetDimensionSetID(TempDimSetEntry));
end;
En código productivo también debes decidir cómo validar
combinaciones, Value Posting, allowed values y global
dimension fields. La transformación mecánica del conjunto y la
autorización contable para registrarlo son pasos distintos.
Validar antes de registrar
local procedure CheckDimensionsBeforePosting(
DimSetID: Integer;
CustomerNo: Code[20];
GLAccountNo: Code[20])
var
DimMgt: Codeunit DimensionManagement;
TableID: array[10] of Integer;
No: array[10] of Code[20];
begin
if not DimMgt.CheckDimIDComb(DimSetID) then
Error(DimMgt.GetDimCombErr());
TableID[1] := Database::Customer;
No[1] := CustomerNo;
TableID[2] := Database::"G/L Account";
No[2] := GLAccountNo;
if not DimMgt.CheckDimValuePosting(TableID, No, DimSetID) then
Error(DimMgt.GetDimValuePostingErr());
end;
Las APIs antiguas basadas en arrays conviven con APIs modernas para defaults basadas en lists y dictionaries. Usa la firma pública disponible en tus símbolos y evita envolver todo el codeunit en una copia local: perderías correcciones estándar y eventos futuros.
El contrato de sincronización
Un objeto con dimensions mantiene varias representaciones del mismo significado. Deben moverse juntas.
Dimension Set ID representa el conjunto; DimensionManagement mantiene el contrato entre ambos.Errores típicos de extensiones:
- Asignar
Global Dimension 1 Codesin recalcularDimension Set ID. - Cambiar el ID sin actualizar los dos global fields.
- Mostrar shortcut dimension variables sin recargarlas al cambiar de línea.
- Copiar el ID del header sobre líneas y borrar excepciones válidas.
- Omitir
CheckDimValuePostingen un posting routine propio. - Insertar directamente en table 480 con un ID inventado.
Estos fallos son incómodos porque la página puede mostrar una cosa, el conjunto contener otra y el error aparecer mucho después durante el posting o en reporting.
Extensibilidad: dónde intervenir
DimensionManagement expone numerosos integration events
alrededor de obtención de defaults, creación de conjuntos, validación y
actualización de global dimensions. Los documentos estándar también
publican eventos en los momentos en que construyen
DefaultDimSource, actualizan header/lines o verifican
posting.
Una extensión suele necesitar intervenir por una de estas razones:
- Añadir un maestro personalizado como fuente.
- Introducir una dimensión derivada de un proceso propio.
- Propagar cambios del header a líneas personalizadas.
- Añadir una validación empresarial que las combinaciones estándar no expresan.
- Copiar dimensions a un ledger personalizado.
La estrategia preferible es suscribirse al evento más cercano al concepto. Añadir una fuente cuando se construye la lista conserva prioridades y reglas estándar. Sobrescribir el ID después de que el sistema haya terminado puede saltarse validaciones o eliminar otras dimensions.
Qué no hacer
- No reemplaces todo el cálculo con
IsHandled := truesi solo quieres añadir una fuente. - No uses códigos de dimensión literales cuando
General Ledger Setupo una configuración propia debería definirlos. - No supongas que
DEPARTMENTsiempre es Global Dimension 1. - No llames a la interfaz desde un proceso background.
- No conviertas eventos de posting en consultas masivas repetidas a
Dimension Set Entrypor cada línea si puedes cachear o trabajar por ID.
Una personalización dimensional buena parece aburrida: usa las APIs estándar, conserva el ID, valida en posting y publica eventos propios alrededor de su dominio. El aburrimiento, en contabilidad, es una característica premium.
Rendimiento y cardinalidad
El modelo de conjuntos ahorra espacio cuando se repiten combinaciones. Pero no elimina el coste de una taxonomía descontrolada.
Si existen 5 valores de DEPARTMENT, 20 de
AREA, 300 de PROJECT y 4 de
CHANNEL, el máximo teórico ya es 120.000 combinaciones. La
realidad suele usar una fracción. Añadir una dimensión
EXTERNAL TRANSACTION ID con un valor único por movimiento
puede acercar el número de conjuntos al número de transacciones.
Señales de una dimensión demasiado granular
- Cada documento crea un dimension set nuevo.
- El valor ya existe como campo de trazabilidad indexable.
- Nadie agrega por ese valor; solo lo busca individualmente.
- El valor cambia después de registrar por razones operativas.
- La lista de dimension values necesita una integración continua solo para mantenerse viva.
Document number, serial number, shipment ID y GUID suelen pertenecer a campos propios. Una dimensión es buena para segmentar; no necesariamente para identificar.
Consultas y reporting
Para pocas dimensiones conocidas, los global fields o queries
estándar pueden ser eficientes. Para explotar todas las dimensions, el
análisis debe expandir Dimension Set ID contra
Dimension Set Entry.
Evita un patrón N+1 que, por cada G/L Entry, ejecute una
lectura individual del conjunto. Agrupa por IDs, usa queries o carga una
caché. En AL, Get Shortcut Dimension Values ya aplica caché
para las posiciones configuradas. En Power BI o un data warehouse,
modela una tabla puente Dimension Set ID → pares y
considera materializar las dimensiones relevantes en la capa
analítica.
El ID no es una dimensión empresarial válida fuera de su company. En una consolidación, la clave técnica debe incluir company/environment o, mejor, expandirse a códigos de dimensión y valor antes de unificar datos.
Analysis View:
rendimiento a cambio de una estructura explícita
Analysis View (table 363, namespace
Microsoft.Finance.Analysis) permite seleccionar hasta
cuatro dimensiones, filtros, fecha inicial y compresión.
Analysis View Entry almacena agregados para acelerar
análisis recurrentes. La opción Update on Posting decide si
se mantiene al registrar o mediante actualizaciones posteriores.
Esto introduce una distinción importante:
G/L Entry+Dimension Set Entrycontienen el detalle contable dimensional.Analysis View Entryes una proyección agregada preparada para consultar.
Si una analysis view no está actualizada, el análisis puede no incluir los últimos movimientos. Si se cambia su definición, puede requerir reset y regeneración. Si se ejecuta una dimension correction, deben actualizarse las vistas afectadas.
No elijas las cuatro dimensiones de una analysis view porque son las
primeras cuatro de General Ledger Setup. Elige las que
forman una pregunta recurrente y cuya combinación justifica la
preagregación.
Impacto funcional en toda la aplicación
Las dimensions no son un accesorio de General Ledger. Atraviesan:
- sales y purchases;
- general, payment, item y job journals;
- inventory y costing;
- jobs/projects;
- fixed assets;
- service y manufacturing;
- budgets, analysis views y account schedules;
- intercompany y consolidación;
- APIs, migraciones e integraciones.
Un default en Location puede afectar líneas de ventas, compras y
movimientos de inventario. Un Same Code en G/L Account
puede bloquear postings generados automáticamente donde el usuario nunca
ve esa cuenta. Una combinación limitada puede impedir registrar un
proceso nocturno que llevaba meses funcionando hasta que apareció un
nuevo valor.
El impacto es transversal porque las dimensions acompañan al movimiento, no a una única pantalla.
Errores habituales y lo que realmente significan
| Síntoma | Causa probable | Investigación útil |
|---|---|---|
| “Select a Dimension Value…” | Code Mandatory sin valor efectivo |
Revisar todas las fuentes del posting y el set de la línea |
| “must be …” | Same Code no coincide |
Identificar qué maestro impone el valor |
| “must not be mentioned” | No Code y el conjunto contiene la dimensión |
Localizar de qué header/default se heredó |
| “Dimension combinations … can’t be used concurrently” | Combinación Blocked o value pair bloqueado |
Revisar tables 350/351 y el ID completo |
| La cabecera parece correcta pero no registra | Una línea tiene otro set o la cuenta generada impone otra regla | Inspeccionar lines y cuentas reales del posting |
| La página muestra global dimensions distintas del conjunto | Extensión desincronizó campos e ID | Comparar fields con rows de table 480 |
| El informe no coincide con G/L entries | Analysis view desactualizada, filtros o ledger diferente | Revisar fecha de update y origen del informe |
| Corrección visible en G/L, no en Item Ledger | Comportamiento esperado de dimension correction | Documentar divergencia; no editar subledger directamente |
Método de depuración sin adivinación ceremonial
- Captura tabla, clave del registro y
Dimension Set IDque falla. - Abre todas las rows de
Dimension Set Entrypara ese ID. - Identifica los maestros que participan: header, line, account, balancing account, job, location.
- Consulta sus
Default Dimension,Value Postingy allowed values. - Revisa
Default Dimension Prioritypara elSource Codedel proceso. - Comprueba
Dimension CombinationyDimension Value Combination. - Compara global dimension fields con el conjunto.
- Reproduce en una copia y depura
CheckDimIDComb/CheckDimValuePosting.
No empieces cambiando el default que “parece sospechoso”. Primero demuestra qué regla participa. El error puede proceder de una G/L Account resuelta por posting groups que ni siquiera aparece en el documento.
Diseñar una estrategia de dimensiones
Empieza por decisiones, no por datos disponibles
Para cada dimensión propuesta, pregunta:
- ¿Qué decisión cambia al conocer este desglose?
- ¿Quién es propietario de los valores?
- ¿En qué punto del proceso se conoce el valor correcto?
- ¿Es obligatorio, derivable o editable?
- ¿Puede cambiar después de registrar?
- ¿Necesita una dimensión o ya existe como atributo del movimiento?
Define una matriz de asignación
| Dimensión | Propietario | Fuente primaria | Excepciones | Control | Global/Shortcut |
|---|---|---|---|---|---|
DEPARTMENT |
Finanzas | Employee/Location | Repartos manuales | Code Mandatory |
Global 1 |
AREA |
Comercial | Customer | Venta excepcional | Same Code en Customer |
Global 2 |
PROJECT |
PMO | Job | Gastos previos autorizados | Allowed values | Shortcut 3 |
CHANNEL |
Marketing | Document/integration | Corrección manual | Combinations | Shortcut 4 |
La columna “excepciones” evita convertir un default en una obligación que el negocio no puede cumplir. La columna “propietario” evita que el catálogo crezca por generación espontánea.
Separa captura y reporting
No todas las dimensions necesarias para el data warehouse deben capturarse manualmente en Business Central. Algunas pueden derivarse de Customer, Item Category, Country/Region o Salesperson en la capa analítica. Captura en la transacción aquello que puede variar por operación o cuyo valor histórico debe congelarse.
Derivar siempre desde el maestro actual puede reescribir el pasado analítico cuando cambia la clasificación del maestro. Guardar todo como dimensión puede saturar la experiencia. El diseño correcto decide conscientemente qué atributos deben ser snapshot transaccional.
Migración y gobierno
Una migración dimensional no termina al importar tables 348 y 349.
Orden recomendado:
- Cargar y validar
Dimension. - Cargar
Dimension Valuey jerarquías. - Configurar global/shortcut dimensions.
- Importar
Default Dimensiony allowed values. - Configurar prioridades por
Source Code. - Configurar combinations y blocked value pairs.
- Construir documentos abiertos mediante APIs estándar para obtener sets válidos.
- Validar saldos y movimientos migrados con su dimensión efectiva.
- Regenerar analysis views.
No es recomendable migrar Dimension Set ID como si fuera
una clave maestra compartida entre sistemas. Migra pares código-valor y
deja que el entorno destino obtenga sus IDs. Los IDs son internos a la
company y dependen de las combinaciones ya existentes.
Gobierno continuo
- Alta de values con propietario y fecha efectiva.
- Bloqueo, no reutilización, de códigos obsoletos.
- Revisión periódica de defaults contradictorios.
- Auditoría de
Same CodeyNo Code, por su impacto. - Control de cambios sobre global dimensions.
- Seguimiento del crecimiento de sets únicos.
- Pruebas de posting después de añadir combinations.
- Proceso aprobado para dimension corrections.
Estrategia de pruebas
Una prueba que confirma que Dimension Set ID <> 0
no confirma casi nada. Hay que inspeccionar el contenido.
Pruebas funcionales
- Crear documentos con cada fuente por separado.
- Combinar Customer/Vendor, Item, Location, Job y accounts.
- Introducir los campos en órdenes diferentes.
- Cambiar header después de crear lines.
- Probar defaults iguales, distintos y vacíos.
- Verificar las cuatro opciones de
Value Posting. - Probar allowed values y value fuera del filtro.
- Probar combinations
BlockedyLimited. - Registrar y comprobar cada ledger relevante.
- Ejecutar una correction y confirmar la divergencia esperada con subledgers.
Pruebas AL
- Dos buffers con los mismos pares en distinto orden devuelven el mismo ID.
- Editar una dimensión devuelve otro ID sin cambiar el conjunto original.
ValidateShortcutDimValuesmantiene campos e ID sincronizados.GetDeltaDimSetIDconserva dimensions propias de la line.- El posting personalizado falla con
Code Mandatory,Same Code,No Codey combinations inválidas. - Copias y reversiones conservan o recalculan según la política definida.
- Un proceso background no intenta abrir
Edit Dimension Set Entries.
Pruebas de volumen
- Número de sets antes y después de la migración.
- Sets nuevos por mil documentos.
- Tiempo de creación y posting con dimensions completas.
- Tiempo de consultas que expanden table 480.
- Actualización de analysis views.
- Ensayo del cambio de global dimensions en una copia representativa.
Checklist antes de producción
Modelo
Configuración
Desarrollo
Operación
La regla que lo conecta todo
Las dimensions de Business Central no son ocho columnas decorativas ni etiquetas pegadas después de registrar.
Son un sistema de clasificación con cuatro capas:
- Taxonomía:
DimensionyDimension Valuedefinen el idioma. - Política: defaults, priorities, allowed values y combinations definen qué se propone y qué se permite.
- Identidad:
Dimension Set Entryy su árbol convierten una combinación en un ID reutilizable. - Persistencia: documentos y ledgers transportan ese ID para conservar la fotografía analítica de cada movimiento.
Si solo entiendes la primera capa, configurarás listas. Si entiendes las cuatro, podrás explicar por qué una línea heredó un valor, por qué un posting se bloqueó, por qué dos movimientos comparten ID, por qué una correction no cambia el subledger y cómo debe comportarse una extensión sin corromper el modelo.
La regla final es esta:
No pienses en
Dimension Set IDcomo el valor de una dimensión. Piénsalo como la huella de una combinación inmutable. Los defaults la proponen, las reglas la validan, el árbol la identifica y el posting la conserva.
Ese es el blueprint.
Referencias oficiales
- Work with dimensions to track and analyze data
- Dimension Set Entries Overview
- Searching for dimension combinations
- Table
Dimension Set Entry - Table
Dimension Set Tree Node - Codeunit
DimensionManagement - Codeunit
Get Shortcut Dimension Values - Table
Default Dimension - Enum
Default Dimension Value Posting Type - Table
Dimension Combination - Table
Dimension Value Combination - Table
General Ledger Setup - Table
Analysis View - Troubleshoot and correct dimensions
- Codeunit
Dimension Correction Mgt