¿Por qué mi consulta no es actualizable?

Estoy intentando crear una vista actualizable en Access para un usuario. Básicamente, las tablas subyacentes se ven así:

Accounts -------- accountId accountName accountHolder TransactionStatements ------------ statementId accountId received month year 

El usuario quiere una consulta (vista) que se ve así:

 StatementView ------------- accountName accountHolder year janReceived febReceived marReceived etc... 

El SQL para lograr esto es sencillo utilizando una transposición, pero la vista resultante no es actualizable.

También intenté hacer varias combinaciones explícitamente para lograr esto:

 PARAMETERS [Enter Year:] Long; SELECT accountName, accountHolder, year, FROM ((Accounts a INNER JOIN TransactionStatements ts1 ON a.accountID = ts.accountID) 'AND month = 1 (This isn't allowed for some reason?) INNER JOIN TransactionStatements ts2 ON a.accountID = ts.accountID) 'AND month = 2 (This isn't allowed for some reason?) WHERE ts1.month = 1 AND ts2.month = 2 AND ts1.year = ([Enter Year:]) AND ts2.year = ([Enter Year:]) 

Pero una vez más el resultado se vuelve no actualizable tan pronto como agrego el segundo INNER JOIN. He consultado esta página de ayuda de MS , pero no me ha ayudado a encontrar la forma correcta de hacerlo.

Sugiere formularios como alternativa, pero crear un formulario personalizado en Access parece ser un proceso aún más arcano y complicado que escribir vistas.

¿Alguna sugerencia?

Eche un vistazo a esta lista muy completa de razones por las cuales los conjuntos de registros son y no son actualizables:

Cuando los conjuntos de registros son siempre actualizables

Un conjunto de registros siempre es actualizable cuando:

  1. Está basado en una sola tabla.
  2. Se basa en una consulta basada en una sola tabla.
  3. Se basa en una consulta basada en tablas con una relación de uno a uno.

Cuando los conjuntos de registros nunca son actualizables

Un conjunto de registros nunca es actualizable cuando:

  1. Se basa en una consulta de tabla cruzada.
  2. Se basa en una consulta de la Unión.
  3. Es una consulta agregada que calcula una sum, promedio, recuento u otro tipo de total en los valores de un campo.
  4. Es una consulta de actualización que hace referencia a un campo de la fila Actualizar a desde una consulta de tabla cruzada, una consulta seleccionada o una subconsulta que contiene totales o funciones agregadas. Nota: Al utilizar una función agregada de dominio en la fila Actualizar a de una consulta de actualización, usted puede hacer referencia a los campos desde una consulta de tabla cruzada, seleccionar consulta o subconsulta que contiene totales o funciones agregadas.
  5. Se basa en una consulta que incluye una tabla ODBC vinculada sin índice único.
  6. La base de datos se abrió como de solo lectura o está ubicada en una unidad de solo lectura.
  7. Es una consulta de paso a través de SQL.
  8. Es una consulta cuya propiedad UniqueValues ​​está establecida en Yes. (Es decir, es una consulta con un predicado DISTINCT).
  9. Uniones cartesianas (es decir, una consulta que incluye más de una tabla o consulta, y las tablas o consultas no están unidas por una línea de unión en la vista Diseño).
  10. Consulta basada en tres o más tablas en las que existe una relación de muchos a uno a muchos. Nota: Aunque no puede actualizar los datos en la consulta directamente, puede actualizar los datos en un formulario o página de acceso a datos según la consulta si la propiedad RecordsetType del formulario está configurada en Dynaset (Actualizaciones inconsistentes).
  11. Campos calculados. Incluso si la consulta en sí es actualizable, si una columna en una consulta se basa en una fórmula, el campo no se puede actualizar. Sin embargo, si los otros campos de la fórmula se actualizan, el campo calculado se actualizará automáticamente.

Los conjuntos de registros son actualizables bajo ciertas condiciones

Algunas consultas, especialmente aquellas involucradas en una unión, no serán actualizadas bajo ciertas condiciones, pero estarán bajo otras. En otras consultas, incluso si la consulta en sí es actualizable, algunos de los campos no serán. Los siguientes son casos de problemas de consulta y sus soluciones correspondientes.

  1. Consulta basada en una combinación de tablas sin relación.

    • Problema: si una consulta se basa en dos o más tablas que NO tienen una relación establecida (con Integridad referencial habilitada), la consulta no será actualizable.

    • Solución: cree una clave principal o índice único en TODOS los campos utilizados en la combinación en la tabla “de un solo lado”. Para ser claros, esto significa UNA clave primaria o índice único basado en todos los campos, no índices separados en cada campo. En una consulta basada en una combinación de tablas con una relación de uno a varios (1: M), es posible que no pueda editar los datos en uno o más campos.

  2. Unirse al campo desde el lado “uno”

    • Problema: si tiene una relación 1: M creada entre dos tablas, no puede cambiar el campo de clave principal (utilizado en la combinación) de la tabla en el lado “uno” de la relación.

    • Solución: habilite las actualizaciones en cascada entre las dos tablas.

  3. Nuevos registros, si el campo “Muchos” de unión lateral no aparece en la hoja de datos

    • Problema: en una consulta basada en una relación 1: M, puede crear un nuevo registro y completar los campos que provienen de la tabla lateral “uno”, pero si el campo de unión de la tabla lateral “muchos” no está visible en la consulta (es decir, la clave externa), no puede agregar datos a los campos secundarios “muchos”.

    • Solución: agregue el campo de unión de la tabla lateral “muchos” (es decir, clave externa) a su consulta para permitir agregar nuevos registros.

  4. Nuevos registros en el lado “uno” que son duplicados de otros registros laterales “uno”.

    • Problema: cuando agrega un nuevo registro, si intenta escribir en los campos laterales “uno”, intentará crear un nuevo registro. Incluso si usa los mismos valores de clave primaria, le dará un error.

    • Solución: agregue un valor al campo de combinación lateral “varios” (clave externa) que coincida con el campo de unión lateral “uno” (clave principal) de un registro ya existente. Los valores laterales “uno” simplemente aparecerán.

  5. Unirse al campo desde el lado “muchos”, después de haber actualizado los datos en el lado “uno”

    • Problema: si actualmente está editando campos del lado “uno” de la relación, no puede cambiar el campo de combinación lateral “muchos” (clave externa).

    • Solución: guarde el registro; entonces podrá realizar cambios en el campo de combinación lateral “muchos”.

  6. Nuevos registros, si no se emite una clave única completa de la tabla ODBC

    • Problema: Esto es diferente al # 5 en Nunca actualizable. En este caso, la clave principal de la tabla ODBC vinculada existe, pero no se agrega a la consulta.

    • Solución: seleccione todos los campos de clave primaria de las tablas ODBC para permitir inserciones en ellos.

  7. Query no tiene permisos de Actualización de datos

    • Problema: consulta (o tabla subyacente) para la que no se concede el permiso Actualizar datos.

    • Solución: para modificar datos, se deben asignar permisos.

  8. Query no tiene permisos de eliminación de datos

    • Problema: consulta (o tabla subyacente) para la que no se concede el permiso Eliminar datos

    • Solución: para eliminar datos, se deben asignar permisos. Conclusión

Las causas de los conjuntos de registros no actualizables son muchas y variadas. Algunos tienen soluciones y otros no. Con suerte, esta lista te ayudará a saber la diferencia.

Lo anterior se toma, palabra por palabra, del siguiente blog: Este conjunto de registros no es actualizable. ¿Por qué? Sentí que era mejor copiar y atribuir completamente en lugar de intentar parafrasear, para que toda la información fuera dada.

Lo primero que sugiero que mire es que sus tablas tienen una indexación adecuada y sus relaciones están configuradas correctamente. Esas son generalmente las dos cosas que primero me gustan, y tienden a resolver la mayoría de mis propios problemas de “consulta no actualizable”.