ms-access - operacion - microsoft jet database engine error 80004005 la operación debe usar una consulta actualizable
La operación debe usar una consulta actualizable.(Error 3073) Microsoft Access (21)
En algunas consultas de Microsoft Access, aparece el siguiente mensaje: La operación debe usar una consulta actualizable. (Error 3073). Lo soluciono usando tablas temporales, pero me pregunto si hay una mejor manera. Todas las tablas involucradas tienen una clave principal. Aquí está el código:
UPDATE CLOG SET CLOG.NEXTDUE = (
SELECT H1.paidthru
FROM CTRHIST as H1
WHERE H1.ACCT = clog.ACCT AND
H1.SEQNO = (
SELECT MAX(SEQNO)
FROM CTRHIST
WHERE CTRHIST.ACCT = Clog.ACCT AND
CTRHIST.AMTPAID > 0 AND
CTRHIST.DATEPAID < CLOG.UPDATED_ON
)
)
WHERE CLOG.NEXTDUE IS NULL;
(Un poco tarde para la fiesta ...)
Las tres formas en que he tenido este problema en el pasado son:
- Haga referencia a un cuadro de texto en un formulario abierto
- DSum
- DLookup
Cuando recibí este error, puede deberse a que mi sintaxis de ACTUALIZACIÓN era incorrecta, pero después de que solucioné la consulta de actualización recibí el mismo error otra vez ... así que fui al ODBC Data Source Administrator
y descubrí que mi conexión se había leído -solamente. Después de hacer la conexión de lectura-escritura y volver a conectar, funcionó bien.
Desde Jet 4, todas las consultas que se unen a una declaración de SQL que resume datos no serán actualizables. No está utilizando un JOIN, pero la cláusula WHERE es exactamente equivalente a una combinación, y por lo tanto, el optimizador de consultas Jet lo trata de la misma manera que trata una unión.
Me temo que no tienes suerte sin una mesa temporal, aunque tal vez alguien con mayor conocimiento de Jet SQL que yo pueda encontrar una solución alternativa.
Por cierto, podría haber sido actualizable en Jet 3.5 (Access 97), ya que muchas consultas eran actualizables y luego se volvieron no actualizables cuando se actualizaron a Jet 4.
-
El mío falló con una simple instrucción INSERT. Se solucionó iniciando la aplicación con el acceso ''Ejecutar como administrador'' .
El problema se relaciona definitivamente con el uso de (en este caso) la función max (). Cualquier función de agregación utilizada durante una combinación (por ejemplo, para recuperar el valor máximo, mínimo o promedio de una tabla unida) causará el error. Y lo mismo se aplica al uso de subconsultas en lugar de uniones (como en el código original).
Esto es increíblemente molesto (¡e injustificado!), Ya que es algo bastante común de querer hacer. También he tenido que usar tablas temporales para evitarlo (extraer el valor agregado en una tabla temporal con una instrucción de inserción, luego unirme a esta tabla con su actualización, luego soltar la tabla temporal).
Glenn
En esencia, aunque su SQL se ve perfectamente razonable, Jet nunca ha admitido la sintaxis estándar de SQL para UPDATE
. En su lugar, usa su propia sintaxis patentada (diferente una vez más de la sintaxis UPDATE
de SQL Server) que es muy limitada. A menudo, las únicas soluciones "La operación debe usar una consulta actualizable" son muy dolorosas. Considere seriamente cambiar a un producto SQL más capaz.
Para obtener más detalles sobre sus problemas específicos y algunas posibles soluciones provisionales, consulte Actualización de consultas basadas en errores de consultas totales .
Esto ocurre cuando no hay una clave ÚNICA de MS-ACCESS para la (s) tabla (s) que se está (n) actualizando. (Independientemente del esquema de SQL).
Al crear Enlaces de MS-Access a tablas SQL, se le solicita que especifique el índice (clave) en el momento del enlace. Si esto se hace incorrectamente, o no se realiza, la consulta en la tabla vinculada no es actualizable
Al vincular tablas SQL en Access ASEGÚRESE de que cuando Access le solicite el índice (clave) use exactamente lo que SQL usa para evitar problemas, aunque especificar cualquier clave única es todo lo que Access necesita para actualizar la tabla.
Si no fue la persona que originalmente vinculó la tabla, elimine la tabla vinculada de MS-ACCESS (el enlace solo se elimina) y vuélvala a vincular especificando la clave correctamente y todo funcionará correctamente.
Hay otro escenario aquí que se aplicaría. Un archivo que haya sido desprotegido de Visual Source Safe, para cualquier persona que todavía lo esté usando, que no haya recibido "Writeablity", ya sea en la opción Ver o en Check Out, también recibirá este mensaje de error.
La solución es volver a adquirir el archivo de Source Safe y aplicar la configuración de Writeability.
Hoy en mi MS-Access 2003 con una tabla ODBC apuntando a un SQL Server 2000 con una contraseña, me dio el mismo error.
Definí una clave principal en la tabla en la base de datos de SQL Server, y el problema desapareció.
Intentaría crear la consulta de ACTUALIZACIÓN en Access. Tuve una consulta de ACTUALIZACIÓN que me escribí como
UPDATE TABLE1
SET Field1 =
(SELECT Table2.Field2
FROM Table2
WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn)
La consulta me dio ese error que estás viendo. Sin embargo, esto funcionó en mi SQL Server, pero al igual que las respuestas anteriores, la sintaxis UPDATE de Access no es la sintaxis estándar. Sin embargo, cuando lo reconstruí usando el asistente de consultas de Access (usó la sintaxis JOIN) funcionó bien. Normalmente solo haría que la consulta UPDATE fuera un "pass-through" para usar la sintaxis "non-JET", pero una de las tablas con las que me estaba uniendo era una tabla de acceso local.
La respuesta dada anteriormente por iDevlop funcionó para mí. Tenga en cuenta que no pude encontrar la propiedad RecordsetType en mi consulta de actualización. Sin embargo, pude encontrar esa propiedad cambiando mi consulta a una consulta de selección, estableciendo esa propiedad como se indica en iDevlop y luego cambiando mi consulta a una consulta de actualización. Esto funcionó, no hay necesidad de una tabla temporal.
Me hubiera gustado que esto fuera solo un comentario de lo que publicó iDevlop para que fluyera de su solución, pero no tengo una puntuación lo suficientemente alta.
MS Access: unir tablas en una consulta de actualización ... cómo hacer que sea actualizable
- Abra la consulta en la vista de diseño
- Haga clic una vez en el enlace b / w tablas / vista
- En la ventana "propiedades", cambie el valor de "registros únicos" a "sí"
- Guarde la consulta como una consulta de actualización y ejecútela.
No hay error en el código. Pero el error se produce debido a la siguiente razón.
- Please check weather you have given Read-write permission to MS-Access database file.
- The Database file where it is stored (say in Folder1) is read-only..?
supongamos que está almacenada la base de datos (archivo MS-Access) en la carpeta de solo lectura, mientras ejecuta su aplicación la conexión no se abre a la fuerza. Por lo tanto, cambie el permiso de archivo / el permiso de carpeta que lo contiene, como en C:/Program files
mayoría de los archivos de unidad c han sido configurados como de solo lectura, por lo que al cambiar este permiso se resuelve este problema.
Para responder mejor a lo que DRUA hizo referencia en su respuesta ...
Desarrollo mis bases de datos en Access 2007. Mis usuarios usan el tiempo de ejecución de acceso 2007. Han leído permisos para una carpeta database_Front (front-end) y permisos de lectura / escritura en la carpeta database_Back.
Al desplegar una nueva base de datos, el usuario no siguió las instrucciones completas de copiar la interfaz a su computadora, y en su lugar creó un atajo. Ejecutar el Front-end a través del acceso directo creará una condición donde la consulta no es actualizable debido a las restricciones de escritura del archivo.
Copiar la interfaz a su carpeta de documentos resuelve el problema.
Sí, complica las cosas cuando los usuarios tienen que obtener una versión actualizada del front-end, pero al menos la consulta funciona sin tener que recurrir a tablas temporales y demás.
Sé que mi respuesta es 7 años tarde, pero esta es mi sugerencia de todos modos:
Cuando Access se queja de una consulta de actualización que incluye un JOIN, simplemente guarde la consulta, con la propiedad RecordsetType
establecida en Dynaset (Inconsistent Updates)
.
Esto a veces permitirá que la ACTUALIZACIÓN funcione.
Seguí recibiendo el mismo error hasta que convertí el campo de conexión en un índice único en ambas tablas de conexión. Solo entonces la consulta se volvió actualizable.
Philip Stilianos
Seguí recibiendo el mismo error, pero todos los SQL se ejecutan muy bien en Access.
y cuando modifiqué el permiso de AccessFile.
el problema solucionado !!
Otorgo permiso de control total a la cuenta '' Servicio de red '', esta cuenta es para IIS
Siempre puede escribir el código en VBA que se actualiza de manera similar. También tuve este problema, y mi solución fue hacer una consulta de selección, con todas las uniones, que tenía todos los datos que estaba buscando para poder actualizar, convirtiéndolo en un conjunto de registros y ejecutando la consulta de actualización repetidamente como una consulta de actualización de solo la tabla de actualización, solo buscando los criterios que está buscando
Dim updatingItems As Recordset
Dim clientName As String
Dim tableID As String
Set updatingItems = CurrentDb.OpenRecordset("*insert SELECT SQL here*");", dbOpenDynaset)
Do Until updatingItems .EOF
clientName = updatingItems .Fields("strName")
tableID = updatingItems .Fields("ID")
DoCmd.RunSQL "UPDATE *ONLY TABLE TO UPDATE* SET *TABLE*.strClientName= ''" & clientName & "'' WHERE (((*TABLE*.ID)=" & tableID & "))"
updatingItems.MoveNext
Loop
Solo estoy haciendo esto a unos 60 registros por día, hacerlo a unos pocos miles podría llevar mucho más tiempo, ya que la consulta se ejecuta de principio a fin varias veces, en lugar de simplemente seleccionar un grupo general y hacer cambios. Es posible que necesite '''' alrededor de las comillas para tableID, ya que es una cadena, pero estoy bastante seguro de que esto es lo que funcionó para mí.
Tuve el mismo problema.
Mi solución es crear primero una tabla a partir de la consulta no actualizable y luego hacer la actualización de una tabla a otra y funciona.
Tuve un problema similar en el que las siguientes consultas no funcionarían;
update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = (select LGA.LGA_NAME from tbl_Prop_LGA as LGA where LGA.LGA_CODE = LVD.LGCode)
where LVD.LGAName is null;
update tbl_LOT_VALUATION_DETAILS inner join tbl_prop_LGA on tbl_LOT_VALUATION_DETAILS.LGCode = tbl_prop_LGA.LGA_CODE
set tbl_LOT_VALUATION_DETAILS.LGAName = [tbl_Prop_LGA].[LGA_NAME]
where tbl_LOT_VALUATION_DETAILS.LGAName is null;
Sin embargo, el uso de DBookup resolvió el problema;
update tbl_Lot_Valuation_Details as LVD
set LVD.LGAName = dlookup("LGA_NAME", "tbl_Prop_LGA", "LGA_CODE="+LVD.LGCode)
where LVD.LGAName is null;
Esta solución se propuso originalmente en https://.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query
revisa tu DB (permiso de base de datos) y da permiso completo
Ir a la carpeta DB-> hacer clic derecho en propiedades-> seguridad-> editar-> dar control completo y menú de Inicio -> ejecutar-> escribir "uac" hacerla hacia abajo (si es alta)