UPDATE Prod, test_include SET Prod.Preis = [test_include]![Preis]
WHERE (((Prod.IdentNr) Like 'P_'+[test_include]![Ident]));
Hallo Wowbagger,
Dem komischen SQL-statement (die lange Erklärung hätts nicht gebraucht) entnehme ich, dass Du
'Prod.Preis', also die Daten in der Spalte 'Preis' der Tabelle 'prod' aktualisieren willst.
Alle 'Preis'-Werte der Datensätze in 'Prod', deren 'IdentNr'-Werte einen um 'P_' ergänzten
'Ident'-Wert der Datensätze in Tabelle 'test_include' haben, sollen den 'Preis'-Wert dieser
Datensätze aus 'test_include' bekommen.
So habe _ich_ es verstanden, aber, nimm mirs nicht übel, an Deinem SQL verzweifelt jedes
DBMS. Komplizierte Aufgabe aber, zugegeben!
Hier (hoffentlich) die Hilfe:
a) kannst Du irgendeine hyperkomplizierte Aktualisierungsabfrage entwerfen (*schüttel*),
aber am besten aber ist es, sich für sowas gleich an VBA/DAO/ADO zu gewöhnen:
deshalb b) Öffne ein Modul und füge eine Funktion 'myfunction' ein (das von Access vorgeschlagene
'Public' kannst Du löschen, wenn Du die Funktion nur in einer DB brauchst):
--------------------------------
Function myfunction()
'DAO vorausgesetzt
Dim dbs As Database, rst As Recordset
Dim strSQL As String, i As Integer, j As Integer, st As String
Dim arr()
On Error GoTo ErrHandl
Set dbs = CurrentDb()
strSQL = "SELECT Ident, Preis FROM test_include;"
Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot)
'nur auslesen, keine Aktualisierung.
arr = rst.GetRows(rst.RecordCount)
'ins array reinziehen
rst.Close
Set rst = nothing 'object abmelden
For i = 0 Ubound(arr,2)
arr(0,i) = "P_" & arr(0,i)
Next
'anpassen
'nächster SQL-Schritt, diesmal aktualisierbar,
strSQL = "SELECT IdentNr, Preis FROM prod;"
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
'object neu anmelden, dynaset = aktualisierbar!
rst.MoveFirst
For i = 0 To Ubound(arr,2)
For j = 0 To rst.RecordCount - 1
If rst![IdentNr] = arr(0,i) Then
rst.Edit
rst![Preis] = arr(1,i)
rst.Update
End If
rst.MoveNext
Next
Next
rst.Close
Set rst = nothing
db.Close
Set dbs = nothing
Exit Function
ErrHandl:
MsgBox Err.Description
rst.Close
Set rst = nothing
dbs.Close
Set dbs = nothing
End Function
----------------------------------
Aufruf über ein Formular 'myform'->Entwurf->Befehlsschaltfläche->Eigenschaften->Beim Klicken:
=myfunction()
----------------------------------
Falls Du ADO (in Acc2K möglich) benutzt, musst Du nur die Instanziierung des Recordsetobjektes
anpassen und vorher statt des Datenbankobjektes ein Verbindungsobjekt instanziieren.
Die db enthält etwa 1900 einträge in "Prod" und weitere ca. 1400
in "test_include", aber das ist doch eigentlich nicht die leistungsgrenze
(zumindest offline nicht)
Access verkraftet locker mehr. Ich habe eine DB mit bald 700.000 Records in der dicksten
Tabelle. Insgesamt habe ich ca. 30 Tabellen, die meisten so von 10.000 bis 50.000 Records.
Alles funzt. Nur schreibe bloss nicht mehr so ein komisches SQL, denn dann saufen alle DB-Systeme
auch schon bei 2 Records ab.
Gruss
Uwe Nohl