2015-01-18

Mensaje de error en Access: no se pudo eliminar nada en las tablas especificadas

Title Cuando queremos realizar una consulta de eliminación que emplea varias tablas puede aparecer el siguiente mensaje de error: No se pudo eliminar nada en las tablas especificadas.

Ejemplo

Empleamos la base de datos Neptuno y creamos una consulta de eliminación con las tablas Detalles de pedidos y Pedidos. Queremos eliminar todos aquellos pedidos, y sus detalles, que contengan al menos un producto con descuento.

Al ejecutar la consulta Access muestra el mensaje:

Solución

  1. Abrimos la hoja de propiedades de la consulta.
  2. Establecemos la propiedad Registros únicos en Sí.
  3. Ejecutamos la consulta de nuevo

Resultado

Elimina 380 registros de la tabla Pedidos y quedan 450 pedidos con productos sin ningún descuento. Además, habremos eliminado 1.045 registros de la tabla Detalles de pedidos. Esto es debido a que en las relaciones entre ambas tablas están activadas la casillas Exigir integridad referencial y Eliminar en cascada los registros relacionados. Access elimina automáticamente todos los registros que hacen referencia a la clave principal (IdPedido) al eliminarse el registro que contiene la clave principal.

En la tabla Detalles de pedidos quedan 1.110 productos. Cuando mostramos la consulta en modo Ver nos muestra los 838 registros que tienen algún descuento. Pero al ejecutar la consulta también borra aquellos productos de pedidos que contienen algún producto descontado (comparten el mismo IdPedido): 1.045.

Explicación

Instrucción SQL de la consulta antes de cambiar la propiedad de Registros únicos a No.

DELETE Pedidos.*, [Detalles de pedidos].Descuento
FROM Pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.IdPedido = [Detalles de pedidos].IdPedido
WHERE ((([Detalles de pedidos].Descuento)>0));
Instrucción SQL de la consulta antes de cambiar la propiedad de Registros únicos a Sí.

DELETE DISTINCTROW Pedidos.*, [Detalles de pedidos].Descuento
FROM Pedidos INNER JOIN [Detalles de pedidos] ON Pedidos.IdPedido = [Detalles de pedidos].IdPedido
WHERE ((([Detalles de pedidos].Descuento)>0));
Al establecer la propiedad Registros únicos en Sí, Access añade DISTINCTROW al predicado de la consulta SQL. En nuestro ejemplo, la tabla Pedidos no contiene registros duplicados de IdPedido, pero la tabla Detalles de pedidos sí, pues cada pedido incluye diferentes productos. Al indicar DISTINCTROW genera una lista de pedidos única con al menos un registro en Detalles de pedidos. Si omitimos DISTINCTROW genera varias filas para cada una de los pedidos que tengan más de un registro en Detalles de pedido.

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos