2009-08-11 12 views
6

Nel corso di una complessa struttura di database, ho bisogno di fornire all'utente un mezzo per modificare i dati memorizzati in una serie di tabelle. Sebbene tutti i tipi di dati siano uguali, non sono allineati 1: 1 nel loro nome. Per alleviare questo, ho creato una query che associa i nomi originali (che provengono da report esterni) ai nomi utilizzati internamente; da queste domande, tutto è alimentato in una gigantesca query UNION.Come posso creare una query UNION modificabile?

Tutti i tipi di dati e le dimensioni del campo sono allineate correttamente.

Cos'altro devo fare per far funzionare questa query UNION?

Questa è la SQL corrente dietro la query:

SELECT * FROM MappingQuery1 UNION SELECT * FROM MappingQuery2; 

EDIT:

Una risposta al di sotto postato un link ad un KB article che indica con certezza che i dati in una query UNION non può essere aggiornato. C'è un modo per aggirare questo? Ad esempio:

SELECT * FROM MappingQuery1, MappingQuery2; 

Questo lavoro funzionerà? Ricorda, tutti i campi sono allineati in tipo, dimensione e nome.

+0

Esiste la possibilità di consolidare le singole tabelle in una tabella principale che ha la stessa struttura ad eccezione di un campo aggiuntivo per il nome della tabella da cui è stata generata ciascuna riga? – HansUp

+1

SELECT * FROM MappingQuery1, MappingQuery2; ti darà una query cartesiana (un set di risultati che contiene tutte le possibili combinazioni di ogni riga) - non sarà modificabile. Sono d'accordo con HansUp. – Fionnuala

+1

HansUp suggerisce che la struttura del database non è ottimale. Come diagnostico praticante (principalmente diagnostico i miei problemi, lo confesso), penso che sia molto probabile. Se lo è, questa sfida sarà seguita da molti altri. – Smandoli

risposta

6

Quando la query è una query dell'Unione, è possibile che non aggiorni i dati nella query.

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

Quando Access combina le righe di diverse tabelle in una query di unione, le singole righe perdono la loro identità sottostante tabella. L'accesso non può sapere quale tabella si intende aggiornare quando si tenta di modificare una riga in una query di unione, quindi non consente tutti gli aggiornamenti.

Seguendo domanda modificare:

Probabilmente si potrebbe ovviare a questo utilizzando VBA e ADO per aggiornare la tabella corrispondente. Il modo in cui mi avvicinerei a questo sarebbe quello di garantire che la tua tabella di unione contenga una colonna che ha l'id dalla tabella di origine insieme a un'altra colonna che denomina la tabella di origine.

ad es. nella vostra unione si avrebbe qualcosa di simile:

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

poi attraverso un form di inserimento dati e VBA si poteva guardare i valori della riga attualmente selezionata e aggiornare la tabella relativa.

EDIT 2: Per onedaywhen

Questo inserisce i valori in una tabella con 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

I record nelle tabelle hanno chiavi primarie univoche (in particolare, il PK in ciascuna tabella è interamente univoco per il database e intrinseco all'insieme di dati, anziché solo un Numero automatico). –

+0

A condizione che gli ID non si sovrappongano, è possibile ristrutturare le tabelle in modo che una tabella padre contenga gli id ​​e le tabelle figlio contenenti i dati. È possibile che la query risultante possa essere aggiornabile (ma prima dovresti testarla). SELECT * FROM IDTable join interno Table1 ON Table1.Id = IdTable.Id unirsi interna Table2 ON Table2.Id = IdTable.Id – pjp

+0

È possibile che questo dovrebbe usare esterno sinistro si unisce .. L'unico problema è che i valori finiranno in diverse colonne ... Il risultato è aggiornabile ... Forse è meglio attenersi alla soluzione VBA – pjp

8

mia preferenza sarebbe di consolidare quelle singole tabelle in una tabella master. Con tutti i dati in una tabella, questo potrebbe essere molto più semplice.

Tuttavia, supponendo che abbia per mantenere separate le singole tabelle, modificare le query di mapping per includere un'espressione di campo per il nome della tabella di origine. E includi il campo del nome della tabella nella query UNION.

Quindi creare un modulo continuo basato sulla query UNION di sola lettura. Aggiungi una sottomaschera basata su un'altra query che restituisce un singolo record modificabile dalla tabella appropriata. Nella forma principale è In caso attuale, riscrivere l'origine riga per la query per la sottomaschera:

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

I secondo il suggerimento (era quello che stavo per suggerire, infatti). Effettivamente, ho una pratica standard che faccio tutti i moduli continui/datasheet di sola lettura (con alcune eccezioni degne di nota, come gli articoli di dettaglio della fattura). –

-1

Questa è una discussione molto vecchio, ma ero alla ricerca di una soluzione per la stessa cosa ed è venuto attraverso di esso. Avevo un valore di spunta che era passato attraverso diverse query dell'Unione, e quando ho provato ad aggiornarlo, ovviamente non potevo.

Tuttavia, ho trovato una soluzione e ho pensato di condividerlo. Nell'evento OnEnter della casella di controllo, ho semplicemente eseguito una query di aggiornamento SQL che ha aggiornato il campo nella tabella sottostante che volevo modificare. Se era True, l'ho aggiornato a False, e se False I è stato aggiornato a true. Ecco!