it-swarm.com.de

Der Vorgang muss eine aktualisierbare Abfrage verwenden. (Fehler 3073) Microsoft Access

Bei einigen Microsoft Access-Abfragen wird die folgende Meldung angezeigt: Der Vorgang muss eine aktualisierbare Abfrage verwenden. (Fehler 3073). Ich arbeite mit temporären Tabellen um, aber ich frage mich, ob es einen besseren Weg gibt. Alle beteiligten Tabellen haben einen Primärschlüssel. Hier ist der Code:

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;
21
Knox

Seit Jet 4 sind alle Abfragen, die eine Verknüpfung mit einer SQL-Anweisung haben, die Daten zusammenfasst, nicht aktualisierbar. Sie verwenden kein JOIN, aber die WHERE-Klausel entspricht genau einem Join. Daher behandelt das Jet-Abfrageoptimierungsprogramm dieselbe Verknüpfung wie ein Join.

Ich fürchte, Sie haben ohne temporäre Tabelle kein Glück, obwohl vielleicht jemand mit größeren Jet SQL-Kenntnissen eine Problemumgehung hat.

BTW, es war möglicherweise in Jet 3.5 (Access 97) aktualisierbar, da eine ganze Reihe von Abfragen aktualisierbar waren, die beim Aktualisieren auf Jet 4 nicht mehr aktualisiert werden konnten.


23
David-W-Fenton

Ich hatte ein ähnliches Problem, bei dem die folgenden Abfragen nicht funktionierten.

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;

Durch die Verwendung von DLookup wurde das Problem jedoch behoben.

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;

Diese Lösung wurde ursprünglich unter https://stackoverflow.com/questions/537161/sql-update-woes-in-ms-access-operation-must-use-an-updateable-query vorgeschlagen.

7
Ray Brack

Es ist kein Fehler im Code. Der Fehler wird jedoch aus folgendem Grund ausgelöst.

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

angenommen, Sie sind in der Datenbank (MS-Access-Datei) im schreibgeschützten Ordner gespeichert. Während Sie Ihre Anwendung ausführen, wird die Verbindung nicht erzwungen. Ändern Sie daher die Dateiberechtigungen/die darin enthaltenen Ordnerberechtigungen, wie in C:\Program files alle fast alle c Laufwerkdateien read-only gesetzt, so dass das Ändern dieser Berechtigung dieses Problem löst.

4

Das Problem bezieht sich definitiv auf die Verwendung von (in diesem Fall) der Funktion max (). Jede während eines Joins verwendete Aggregationsfunktion (z. B. zum Abrufen des maximalen oder minimalen oder durchschnittlichen Werts aus einer verbundenen Tabelle) verursacht den Fehler. Dasselbe gilt für die Verwendung von Unterabfragen anstelle von Verknüpfungen (wie im ursprünglichen Code).

Dies ist unglaublich ärgerlich (und ungerechtfertigt!), Da dies eine ziemlich übliche Sache ist, die man tun möchte. Ich musste auch temporäre Tabellen verwenden, um das Problem zu umgehen (ziehen Sie den aggregierten Wert mit einer Einfügeanweisung in eine temporäre Tabelle, verknüpfen Sie diese Tabelle dann mit Ihrem Update und löschen Sie die temporäre Tabelle).

Glenn

4
Glenn M

Ich weiß, meine Antwort ist 7 Jahre zu spät, aber hier ist mein Vorschlag trotzdem: 

Wenn Access über eine UPDATE-Abfrage klagt, die einen JOIN enthält, speichern Sie die Abfrage einfach mit der RecordsetType-Eigenschaft, die auf Dynaset (Inconsistent Updates) gesetzt ist. 

Manchmal kann UPDATE funktionieren.

3
Patrick Honorez

Dies ist der Fall, wenn für die zu aktualisierenden Tabellen kein UNIQUE MS-ACCESS-Schlüssel vorhanden ist. (Unabhängig vom SQL-Schema).

Beim Erstellen von MS-Access-Links zu SQL-Tabellen werden Sie aufgefordert, den Index (Schlüssel) zur Linkzeit anzugeben. Wenn dies falsch oder überhaupt nicht geschieht, kann die Abfrage der verknüpften Tabelle nicht aktualisiert werden

Beim Verknüpfen von SQL-Tabellen mit Access MAKE SURE verwenden Sie, wenn Sie von Access zur Eingabe des Indexes (Schlüssels) aufgefordert werden, genau das, was SQL verwendet, um Probleme zu vermeiden. Die Angabe eines eindeutigen Schlüssels ist jedoch alles, was Access zur Aktualisierung der Tabelle benötigt.

Wenn Sie nicht die Person waren, die die Tabelle ursprünglich verknüpft hat, löschen Sie die verknüpfte Tabelle aus MS-ACCESS (die Verknüpfung wird nur gelöscht), und verknüpfen Sie sie erneut, indem Sie den Schlüssel richtig angeben, und alle werden ordnungsgemäß funktionieren.

2
Dave Nilson

Ich würde versuchen, die UPDATE-Abfrage in Access zu erstellen. Ich hatte eine UPDATE-Abfrage, die ich mir selbst geschrieben habe

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

Die Abfrage hat mir diesen Fehler gegeben. Dies funktionierte zwar auf meinem SQL Server, aber wie bereits in früheren Antworten erwähnt, ist die Access UPDATE-Syntax keine Standardsyntax. Wenn ich es jedoch mit dem Abfrageassistenten von Access neu erstellte (er verwendete die JOIN-Syntax), funktionierte es einwandfrei. Normalerweise würde ich nur die UPDATE-Abfrage zu einem Passthrough machen, um die Nicht-JET-Syntax zu verwenden, aber eine der Tabellen, mit denen ich mich verband, war eine lokale Access-Tabelle.

2
StoneJedi

(Etwas spät zur Party ...)

Die drei Arten, wie ich dieses Problem in der Vergangenheit umgehen konnte, sind:

  1. Verweisen Sie auf ein Textfeld in einem geöffneten Formular
  2. DSum
  3. DLookup
1
mark

Meine ist mit einer einfachen INSERT-Anweisung fehlgeschlagen. Behebung durch Starten der Anwendung mit 'Als Administrator ausführen' access.

1
nspire

Ich hatte das gleiche Problem.

Meine Lösung ist, zuerst eine Tabelle aus der nicht aktualisierbaren Abfrage zu erstellen und dann die Aktualisierung von Tabelle zu Tabelle durchzuführen.

1
marcnz

MS Access - Verknüpfen von Tabellen in einer Aktualisierungsabfrage ... So wird es aktualisierbar

  1. Öffnen Sie die Abfrage in der Entwurfsansicht
  2. Klicken Sie einmal auf den Link s/w tables/view
  3. Ändern Sie im Fenster "Eigenschaften" den Wert für "eindeutige Datensätze" in "Ja".
  4. Speichern Sie die Abfrage als Aktualisierungsabfrage und führen Sie sie aus.
1
Paul Dungan

Ich habe immer den gleichen Fehler erhalten, aber alle SQLs werden in Access sehr gut ausgeführt.

und wenn ich die Erlaubnis von AccessFile geändert habe.

das Problem behoben !!

Ich erteile dem Konto "Network Service" die vollständige Zugriffsberechtigung. Dieses Konto wird für IS

0

Heute in meinem MS-Access 2003 mit einer ODBC - Tabla, die auf einen SQL Server 2000 mit sa-Kennwort zeigt, gab es den gleichen Fehler.
Ich habe einen Primärschlüssel für die Tabelle in der SQL Server-Datenbank definiert, und das Problem wurde behoben.

0
Ariel Alvarez

Die Antwort von iDevlop hat für mich funktioniert. Beachten Sie, dass ich die RecordsetType-Eigenschaft in meiner Aktualisierungsabfrage nicht finden konnte. Ich konnte diese Eigenschaft jedoch finden, indem ich meine Abfrage in eine Auswahlabfrage umwandelte, diese Eigenschaft wie iDevlop feststellte und dann meine Abfrage in eine Aktualisierungsabfrage umwandelte. Dies hat funktioniert, es ist keine Temp-Tabelle erforderlich. 

Ich hätte mir gewünscht, dass dies nur ein Kommentar zu dem ist, was von iDevlop veröffentlicht wurde, sodass es von seiner Lösung floss, aber ich habe nicht genug Punkte.

0
Sue White

Es gibt hier ein anderes Szenario, das zutreffen würde. Eine Datei, die von Visual Source Safe ausgecheckt wurde, für alle, die sie noch verwenden, die weder in der Option Ansicht noch in Auschecken mit "Writeablity" versehen wurde, erhält diese Fehlermeldung.

Die Lösung besteht darin, die Datei erneut von Source Safe zu beziehen und die Einstellung für die Beschreibbarkeit anzuwenden.

0
htm11h

Sie können den Code immer in VBA schreiben, der ähnlich aktualisiert wird. Ich hatte auch dieses Problem, und meine Problemumgehung bestand darin, eine Auswahlabfrage mit all den Verknüpfungen durchzuführen, die alle Daten enthielt, nach denen ich suchen konnte, um ein Update durchführen zu können. Dabei wurde ein Recordset erstellt und die Updateabfrage wiederholt als Updateabfrage ausgeführt Nur die Aktualisierungstabelle, nur die Kriterien, nach denen Sie suchen 

    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

Ich mache dies nur mit etwa 60 Datensätzen pro Tag. Es könnte einige Zeit dauern, bis ein paar Tausend Datensätze ausgeführt werden, da die Abfrage mehrmals von Anfang bis Ende ausgeführt wird, anstatt nur eine Gesamtgruppe auszuwählen und Änderungen vorzunehmen. Möglicherweise müssen Sie die Anführungszeichen für tableID angeben, da dies eine Zeichenfolge ist, aber ich bin mir ziemlich sicher, dass dies bei mir funktioniert hat.

0
RSmith

Als ich diesen Fehler erhalten habe, liegt dies möglicherweise daran, dass meine UPDATE-Syntax falsch war, aber nachdem ich die Aktualisierungsabfrage behoben hatte, erhielt ich wieder den gleichen Fehler ... also ging ich zum ODBC Data Source Administrator und stellte fest, dass meine Verbindung schreibgeschützt war. Nachdem ich die Verbindung schreibgeschützt und neu verbunden hatte, funktionierte das einwandfrei.

0
leeand00

Überprüfen Sie Ihre DB (Datenbankberechtigung) und erteilen Sie die vollständige Berechtigung

Gehen Sie zum DB-Ordner-> Rechtsklick Eigenschaften-> Sicherheit-> Bearbeiten-> Geben Sie die volle Kontrolle & Startmenü -> Ausführen-> Typ "Uac" machen es runter (wenn es hoch ist)

0
Manoj essl

Um weiter zu antworten, worauf DRUA in seiner/ihrer Antwort hingewiesen hat ...

Ich entwickle meine Datenbanken in Access 2007. Meine Benutzer verwenden die Access 2007-Laufzeitumgebung. Sie haben Leseberechtigungen für einen database_Front (Front-End) -Ordner und Lese-/Schreibberechtigungen für den database_Back-Ordner. 

Beim Rollout einer neuen Datenbank hat der Benutzer nicht die vollständigen Anweisungen zum Kopieren des Front-End auf seinen Computer befolgt und stattdessen eine Verknüpfung erstellt. Wenn Sie das Front-End über die Verknüpfung ausführen, wird eine Bedingung erstellt, bei der die Abfrage aufgrund der Dateischreibbeschränkungen nicht aktualisierbar ist. 

Das Kopieren des Frontends in den Dokumentenordner löst das Problem. 

Ja, es macht die Dinge komplizierter, wenn die Benutzer eine aktualisierte Version des Front-End benötigen, aber zumindest die Abfrage funktioniert, ohne auf temporäre Tabellen und dergleichen zurückgreifen zu müssen. 

0

Ich habe immer die gleiche Fehlermeldung erhalten, bis ich das Verbindungsfeld in beiden Verbindungstabellen zu einem eindeutigen Index gemacht habe. Erst dann wurde die Abfrage aktualisierbar.

Philip Stilianos

0

Während Ihr SQL absolut vernünftig erscheint, hat Jet die SQL-Standardsyntax für UPDATE nie unterstützt. Stattdessen wird eine eigene proprietäre Syntax verwendet (die sich wiederum von der UPDATE-Syntax von SQL Server unterscheidet), die very limitiert ist. Oft sind die einzigen Problemumgehungen "Operation muss eine aktualisierbare Abfrage verwenden" sehr schmerzhaft. Erwägen Sie ernsthaft den Wechsel zu einem leistungsfähigeren SQL-Produkt.

Weitere Informationen zu Ihren spezifischen Problemen und mögliche Problemumgehungen finden Sie unter Aktualisieren von Abfragen basierend auf Summenabfragen .

0
onedaywhen