2009-08-11 18 views
6

En el curso de una estructura de base de datos compleja, necesito proporcionar al usuario un medio de edición de datos almacenados en una serie de tablas. Aunque todos los tipos de datos son iguales, no se alinean 1: 1 en sus nombres. Para aliviar esto, creé una consulta que asigna los nombres originales (que provienen de informes externos) a los nombres utilizados internamente; a partir de estas consultas, todo se alimenta en una única consulta UNION gigante.¿Cómo puedo hacer una consulta UNION editable?

Todos los tipos de datos y tamaños de campo se alinean correctamente.

¿Qué más debo hacer para que esta consulta UNION funcione?

Ésta es la actual SQL detrás de la consulta:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

EDIT:

Una respuesta más adelante publicó un enlace a un KB article que indica con certeza que los datos en una consulta UNION no pueden estar actualizado. ¿Hay alguna manera de que pueda evitar esto? Por ejemplo:

SELECT * FROM MappingQuery1, MappingQuery2; 
Will

este trabajo? Recuerde, todos los campos están alineados en tipo, tamaño y nombre.

+0

¿Existe alguna posibilidad de que pueda consolidar sus tablas individuales en una tabla maestra que tenga la misma estructura excepto por un campo adicional para el nombre de la tabla desde la que se originó cada fila? – HansUp

+1

SELECCIONAR * FROM MappingQuery1, MappingQuery2; le dará una consulta cartesiana (un conjunto de resultados que contiene todas las combinaciones posibles de cada fila) - no será editable. Estoy de acuerdo con HansUp. – Fionnuala

+1

HansUp sugiere que la estructura de la base de datos no es óptima. Como un diagnosticador experimentado (sobre todo el diagnóstico de mis propios problemas, lo confieso), creo que es muy cierto. Si es así, este desafío será seguido por muchos otros. – Smandoli

Respuesta

6

Cuando la consulta es una consulta de unión, no puede actualizar datos en la consulta.

http://support.microsoft.com/kb/328828

Cuando Access combina filas de diferentes tablas en una consulta de unión, las filas individuales pierden su identidad tabla subyacente. Access no puede saber qué tabla quiere actualizar cuando intenta cambiar una fila en una consulta de unión, por lo que no permite todas las actualizaciones.

Siguiendo pregunta edición:

Probablemente se podría evitar esto usando VBA y ADO para actualizar la tabla correspondiente. La forma en que abordaría esto sería asegurar que su tabla de unión contenga una columna que tenga el ID de la tabla fuente junto con otra columna que nombre la tabla fuente.

p. Ej. en su unión que tendría algo como esto:

SELECT 'Table1', id, ... FROM Table1 
UNION 
SELECT 'Table2', id, ... FROM Table2 

A continuación, a través de un formulario de entrada de datos y VBA usted podría mirar a los valores de la fila seleccionada y actualizar la tabla correspondiente.

EDIT 2: Para onedaywhen

Esto inserta valores en una tabla utilizando Access VBA

Option Compare Database 
Option Explicit 

Public Sub InsertDataPunk(TargetTable As String, IdVal As Long, MyVal As String) 

    Dim conn As ADODB.Connection 
    Set conn = CurrentProject.Connection 

    Dim sql As String 
    'You could build something fancier here 
    sql = "INSERT INTO " & TargetTable & " VALUES (" & IdVal & ",'" & MyVal & "')" 

    Dim cmd As ADODB.Command 
    Set cmd = New ADODB.Command 
    Set cmd.ActiveConnection = conn 
    cmd.CommandText = sql 
    cmd.CommandType = adCmdText 
    cmd.Execute 

End Sub 


InsertDataPunk "Table2", 7, "DooDar" 
+0

Los registros en las tablas tienen claves primarias únicas (específicamente, el PK en cada tabla es totalmente exclusivo de la base de datos e intrínseco al conjunto de datos, en lugar de solo un Autonumérico). –

+0

Siempre que los identificadores no se superpongan, podría reestructurar sus tablas para tener una tabla principal que contenga los identificadores y las tablas secundarias que contienen los datos. Es posible que la consulta resultante sea actualizable (pero tendría que probarla primero). SELECT * FROM IDTable combinación interna Tabla1 EN Table1.Id = IdTable.Id unirse interior Tabla2 EN Table2.Id = IdTable.Id – pjp

+0

Lo anterior debe utilizar externa izquierda se une .. El único problema es que los valores van a terminar en diferentes columnas ... El resultado es actualizable aunque ... Tal vez sea mejor seguir con la solución VBA – pjp

8

Mi preferencia sería consolidar estas tablas individuales en una tabla maestra. Con todos los datos en una tabla, esto podría ser mucho más fácil.

Sin embargo, asumiendo que tenga para mantener separadas las tablas individuales, cambie sus consultas de mapeo para incluir una expresión de campo para el nombre de la tabla de origen. E incluya ese campo de nombre de tabla en la consulta UNION.

A continuación, cree un formulario continuo basado en la consulta UNION de solo lectura. Agregue un subformulario basado en otra consulta que devuelva un único registro editable de la tabla correspondiente. En la forma principal de En caso actual, reescribir el OrigenDeLaFila para la consulta del subformulario:

strSQL = "SELECT fields_to_edit FROM " & Me.txtTableSource & _ 
    " WHERE pkfield =" & Me.txtPKeyField & ";" 
Me.SubformName.Rowsource = strSQL 
Me.SubformName.Requery 
+4

Seguí la sugerencia (era lo que iba a sugerir, de hecho). De hecho, tengo una práctica estándar que hago que todos los formularios continuos/de hoja de datos sean de solo lectura (con algunas excepciones notables, como los artículos detallados de la factura). –

-1

Este es un hilo muy antiguo, pero yo estaba buscando una solución a la misma cosa y se encontró con él. Tenía un valor de casilla de verificación que se envió a través de varias consultas de la Unión, y cuando traté de actualizarlo, por supuesto que no pude.

Sin embargo, encontré una solución y pensé en compartirla. En el evento OnEnter de la casilla de verificación simplemente ejecuté una consulta SQL Update que actualizó el campo en la tabla subyacente que quería modificar. Si era True, actualicé a False, y si False lo actualicé a verdadero. Voila!

Cuestiones relacionadas