L’operazione deve utilizzare una query aggiornabile. (Errore 3073) Microsoft Access

Su alcune query di Microsoft Access, viene visualizzato il seguente messaggio: L’operazione deve utilizzare una query aggiornabile. (Errore 3073). Ci lavoro attorno usando tabelle temporanee, ma mi chiedo se c’è un modo migliore. Tutte le tabelle coinvolte hanno una chiave primaria. Ecco il codice:

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; 

A partire da Jet 4, tutte le query che hanno un join in un’istruzione SQL che riepiloga i dati non saranno aggiornabili. Non stai utilizzando un JOIN, ma la clausola WHERE è esattamente equivalente a un join e, pertanto, il Query Optimizer di Jet lo tratta nello stesso modo in cui tratta un join.

Temo che tu non abbia fortuna senza un tavolo temporaneo, anche se forse qualcuno con una conoscenza Jet SQL più grande di me può inventare una soluzione alternativa.

A proposito, potrebbe essere stato aggiornabile in Jet 3.5 (Access 97), poiché un sacco di query erano aggiornabili e quindi diventate non aggiornabili durante l’aggiornamento a Jet 4.

Ho avuto un problema simile in cui le seguenti query non avrebbero funzionato;

 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; 

Tuttavia utilizzando DLookup risolto il 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; 

Questa soluzione è stata originariamente proposta su https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query

Il problema si riferisce in modo definitivo all’uso (in questo caso) della funzione max (). Qualsiasi funzione di aggregazione utilizzata durante un join (ad es. Per recuperare il valore max o min o avg da una tabella unita) causerà l’errore. Lo stesso vale per l’utilizzo di sottoquery anziché di join (come nel codice originale).

Questo è incredibilmente fastidioso (e ingiustificato!) Poiché è una cosa abbastanza comune da voler fare. Ho anche dovuto usare le tabelle temporanee per aggirare il problema (estrarre il valore aggregato in una tabella temporanea con un’istruzione insert, quindi partecipare a questa tabella con il proprio aggiornamento, quindi rilasciare la tabella temporanea).

Glenn

Non c’è nessun errore nel codice. Ma l’errore viene generato a causa del seguente motivo.

  - 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..? 

supponiamo di aver memorizzato il database (file MS-Access) nella cartella di sola lettura, mentre durante l’esecuzione della tua applicazione la connessione non viene aperta forzatamente. Quindi modificare il permesso del file / il suo permesso di cartella contenente come in C:\Program files tutti i C:\Program files tutti i drive c sono stati impostati di sola lettura, quindi la modifica di questa authorization risolve questo problema.

So che la mia risposta è 7 anni in ritardo, ma ecco il mio suggerimento comunque:

Quando Access si lamenta di una query UPDATE che include un JOIN, basta salvare la query, con la proprietà RecordsetType impostata su Dynaset (Inconsistent Updates) .

Ciò a volte consentirà l’AGGIORNAMENTO di funzionare.

Vorrei provare a creare la query UPDATE in Access. Ho avuto una query UPDATE mi sono scritto come

 UPDATE TABLE1 SET Field1 = (SELECT Table2.Field2 FROM Table2 WHERE Table2.UniqueIDColumn = Table1.UniqueIDColumn) 

La query mi ha dato quell’errore che stai vedendo. Ciò ha funzionato sul mio SQL Server, ma, proprio come le risposte precedenti, la syntax Access UPDATE non è una syntax standard. Tuttavia, quando l’ho ricostruito usando la procedura guidata Query di Access (usava la syntax JOIN) funzionava bene. Di solito, eseguo la query UPDATE solo come passthrough per utilizzare la syntax non JET, ma una delle tabelle con cui mi stavo unendo era una tabella di accesso locale.

Ciò si verifica quando non esiste una chiave UNI-MS-ACCESS per l’aggiornamento delle tabelle. (Indipendentemente dallo schema SQL).

Quando si creano collegamenti MS-Access alle tabelle SQL, viene richiesto di specificare l’indice (chiave) al momento del collegamento. Se questo viene fatto in modo errato, o non del tutto, la query contro la tabella collegata non è aggiornabile

Quando si collegano le tabelle SQL in Access MAKE SURE che quando Access richiede l’indice (chiave), si utilizza esattamente ciò che SQL utilizza per evitare i problemi, anche se è necessario specificare una chiave univoca. Access deve aggiornare la tabella.

Se non eri la persona che originariamente collegava la tabella, elimina la tabella collegata da MS-ACCESS (il collegamento viene solo eliminato) e ricollegalo specificando correttamente la chiave e tutto funzionerà correttamente.

(Un po ‘tardi alla festa …)

I tre modi in cui mi sono imbattuto in questo problema in passato sono:

  1. Fare riferimento a una casella di testo su un modulo aperto
  2. DSum
  3. DLookup

Ho avuto lo stesso problema.

La mia soluzione è quella di creare prima una tabella dalla query non aggiornabile e quindi fare l’aggiornamento da una tabella all’altra e funziona.

Il mio ha fallito con una semplice istruzione INSERT. Risolto il problema avviando l’applicazione con l’accesso “Esegui come amministratore” .

Accesso MS: unione di tabelle in una query di aggiornamento … come renderlo aggiornabile

  1. Apri la query in visualizzazione struttura
  2. Fare clic una volta sul collegamento b / n tabelle / vista
  3. Nella finestra “Proprietà”, modifica il valore di “record univoci” in “sì”
  4. Salva la query come una query di aggiornamento ed eseguila.

Ho continuato a ricevere lo stesso errore finché non ho reso il campo di connessione un indice univoco in entrambe le tabelle di connessione. Solo allora la query è diventata aggiornabile.

Philip Stilianos

In sostanza, mentre il tuo SQL sembra perfettamente ragionevole, Jet non ha mai supportato la syntax standard SQL per UPDATE . Invece, utilizza la propria syntax proprietaria (diversa ancora dalla syntax UPDATE proprietaria di SQL Server) che è molto limitata. Spesso, le uniche soluzioni alternative “L’operazione deve utilizzare una query aggiornabile” sono molto dolorose. Valutare seriamente la possibilità di passare a un prodotto SQL più capace.

Per ulteriori dettagli sui problemi specifici e alcuni possibili soluzioni alternative, vedere Query di aggiornamento basate su Query di query totali .

Ho continuato a ricevere lo stesso errore, ma tutte le SQL vengono eseguite in Access molto bene .

e quando ho modificato il permesso di AccessFile.

il problema risolto !!

Autorizzo il controllo completo dell’account ‘ Servizio di rete ‘, questo account se per IIS

Quando ho ricevuto questo errore, potrebbe essere dovuto al fatto che la syntax UPDATE è errata, ma dopo aver corretto la query di aggiornamento ho ricevuto di nuovo lo stesso errore … quindi sono andato ODBC Data Source Administrator e ho scoperto che la mia connessione era stata letta -solo. Dopo aver effettuato la connessione in lettura, scrittura e ricollegamento, funzionava perfettamente.

Oggi nel mio MS-Access 2003 con una tabla ODBC che punta a un SQL Server 2000 con password sa mi ha dato lo stesso errore.
Ho definito una chiave primaria sulla tabella nel database di SQL Server e il problema era scomparso.

C’è un altro scenario qui che si applicherebbe. Un file che è stato estratto da Visual Source Safe, per chiunque lo usi ancora, a cui non è stato assegnato “Writeablity”, sia nell’opzione Visualizza che in Estrai, riceverà anche questo messaggio di errore.

La soluzione è riacquistare il file da Source Safe e applicare l’impostazione Writeability.

Per rispondere ulteriormente a ciò a cui si riferiva DRUA nella sua risposta …

Sviluppo i miei database in Access 2007. I miei utenti utilizzano runtime di Access 2007. Hanno permesso di leggere una cartella database_Front (front-end) e le autorizzazioni di lettura / scrittura nella cartella database_Back.

Nell’introduzione di un nuovo database, l’utente non ha seguito le istruzioni complete per copiare il front-end sul proprio computer e ha invece creato un collegamento. L’esecuzione del front-end tramite il collegamento creerà una condizione in cui la query non è aggiornabile a causa delle restrizioni di scrittura del file.

La copia del front-end nella cartella dei documenti risolve il problema.

Sì, complica le cose quando gli utenti devono ottenere una versione aggiornata del front-end, ma almeno la query funziona senza dover ricorrere a tabelle temporanee e così via.

controlla il tuo DB (permesso del Database) e dai il permesso completo

Vai alla cartella DB-> Proprietà clic destro-> Sicurezza-> Modifica-> Dare controllo completo e menu Start -> Esegui-> digita “uac” abbassalo (se è alto)

È sempre ansible scrivere il codice in VBA che si aggiorna in modo simile. Ho avuto anche questo problema, e la mia soluzione consisteva nel fare una query di selezione, con tutti i join, che aveva tutti i dati che stavo cercando per poter aggiornare, facendo di questo un recordset ed eseguendo la query di aggiornamento ripetutamente come una query di aggiornamento di solo la tabella degli aggiornamenti, solo cercando i criteri che stai cercando

  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 

Lo faccio solo per circa 60 dischi al giorno, farlo a poche migliaia potrebbe richiedere molto più tempo, poiché la query viene eseguita dall’inizio alla fine più volte, invece di selezionare un gruppo generale e apportare modifiche. Potresti aver bisogno di “intorno alle virgolette per tableID, dato che si tratta di una stringa, ma sono abbastanza sicuro che questo è ciò che ha funzionato per me.

La risposta sopra fornita da iDevlop ha funzionato per me. Si noti che non sono stato in grado di trovare la proprietà RecordsetType nella mia query di aggiornamento. Tuttavia, sono stato in grado di trovare quella proprietà cambiando la mia query in una query selezionata, impostando quella proprietà come annotata da iDevlop e poi cambiando la mia query in una query di aggiornamento. Questo ha funzionato, non c’è bisogno di un tavolo temporaneo.

Mi sarebbe piaciuto che questo fosse solo un commento a ciò che iDevlop ha pubblicato in modo che fluisca dalla sua soluzione, ma non ho un punteggio abbastanza alto.