Discussion:
ADO Recordset Daten ändern
(zu alt für eine Antwort)
Ray
2005-10-24 14:57:55 UTC
Permalink
Hallo an Alle,

ich möchte in ein Recordset alle Zeilen durchlaufen und in zwei
spalten den Wert ändern. Die geänderten Werten kommen aus zwei
verschiedenen Tabellen und wurden via SQL dem Recordset übergeben.
Leider bringt er mir dann immer die Fehlermeldung das zu wenig
Information zur Aktualisierung vorhanden sind. Die SQL-Abfrage gibt mir
die Daten aber richtig in ein Datengrid zurück. Stimmt vielleicht mit
meiner Methode etwas nicht?

Das nachfolgende Beispiel klappt mit einem Wert aus einer Tabelle. Wie
gesagt wenn ich es mit mehreren Werten versuche bekomme ich eine
Fehlermeldung.

With adoPrimaryRS
.MoveFirst

Do Until .EOF
.Fields("stck") = 0
.Update
.MoveNext
Loop

End With
Jörg Reitze
2005-10-24 15:17:22 UTC
Permalink
Hi Ray,

wenn Du doch den Feldern immer den gleichen Wert zuordnest, warum nimmst Du
nicht ein "EXECUTE"?

Gruß: Jörg

"Ray" <baumann-***@web.de> schrieb im Newsbeitrag news:***@g49g2000cwa.googlegroups.com...
Hallo an Alle,

ich möchte in ein Recordset alle Zeilen durchlaufen und in zwei
spalten den Wert ändern. Die geänderten Werten kommen aus zwei
verschiedenen Tabellen und wurden via SQL dem Recordset übergeben.
Leider bringt er mir dann immer die Fehlermeldung das zu wenig
Information zur Aktualisierung vorhanden sind. Die SQL-Abfrage gibt mir
die Daten aber richtig in ein Datengrid zurück. Stimmt vielleicht mit
meiner Methode etwas nicht?

Das nachfolgende Beispiel klappt mit einem Wert aus einer Tabelle. Wie
gesagt wenn ich es mit mehreren Werten versuche bekomme ich eine
Fehlermeldung.

With adoPrimaryRS
.MoveFirst

Do Until .EOF
.Fields("stck") = 0
.Update
.MoveNext
Loop

End With
Peter Fleischer
2005-10-24 15:25:34 UTC
Permalink
Ray wrote:
...
Post by Ray
ich möchte in ein Recordset alle Zeilen durchlaufen und in zwei
spalten den Wert ändern. Die geänderten Werten kommen aus zwei
verschiedenen Tabellen und wurden via SQL dem Recordset übergeben.
Leider bringt er mir dann immer die Fehlermeldung das zu wenig
Information zur Aktualisierung vorhanden sind. Die SQL-Abfrage gibt
mir die Daten aber richtig in ein Datengrid zurück. Stimmt vielleicht
mit meiner Methode etwas nicht?
Das System weiß nicht, wie es aktualisieren soll, d.h. wie die Datensätze zu
identifizieren sind.

Peter
Peter Götz
2005-10-24 16:32:33 UTC
Permalink
Hallo Ray,

wir stellen uns hier üblicherweise mit unserem vollen Namen (Vor- u. Zuname)
vor. Wäre schön, wenn Du Dich dieser Gepflogenheit anschliessen könntest.
Post by Ray
ich möchte in ein Recordset alle Zeilen durchlaufen und
in zwei spalten den Wert ändern. Die geänderten Werten
kommen aus zwei verschiedenen Tabellen und wurden
via SQL dem Recordset übergeben.
Wie sieht denn dieses SQL-Statement aus?
Post by Ray
Leider bringt er mir dann immer die Fehlermeldung das zu
wenig Information zur Aktualisierung vorhanden sind.
Das passiert immer dann, wenn Dein Recordset kein Feld mit eindeutigen
Werten enthält.
Idealerweise sollte das Recordset ein Feld enthalten, welches als
Primärschlüssel definiert ist. Notfalls tut es auch ein indiziertes Feld mit
eindeutigen Werten.
Post by Ray
Die SQL-Abfrage gibt mir die Daten aber richtig in ein
Datengrid zurück. Stimmt vielleicht mit meiner Methode
etwas nicht?
Ja, da fehlt ein Primärschlüssel bzw. ein sonstiges eindeutiges Feld und
somit kann ADO in der DB den zu ändernden Datensatz nicht eindeutig
identifizieren und weiss deshalb nicht, welche Daten in der DB tatsächlich
zu ändern sind.
Post by Ray
Das nachfolgende Beispiel klappt mit einem Wert aus
einer Tabelle. Wie gesagt wenn ich es mit mehreren Werten
versuche bekomme ich eine Fehlermeldung.
With adoPrimaryRS
.MoveFirst
Do Until .EOF
.Fields("stck") = 0
hier sollte besser

.Fields("stck").Value = 0

stehen.
Post by Ray
.Update
.MoveNext
Loop
End With
Ist eines der Felder in Deinem Recordset als Primärschlüssel definiert oder
wenigstens ein indiziertes Feld mit eindeutigen Werten?

Wenn Du mehrere Datensätze in einer DB-Tabelle ändern willst, ist es u.U.
günstiger, wenn Du das per ADODB.Command mit entsprechendem SQL-Statement
machst.

Dim strSQL As String
Dim Cnn As ADODB.Connection
Dim Cmd As ADODB.Command
Dim RecordsAffected As Long

strSQL = "UPDATE Tabellenname " & _
"SET FeldnameA = NeuerWert, " & _
"FeldnameB = NeuerWert" & _
"WHERE FeldX = Kriterium"

Set Cmd = New ADODB.Command
With Cmd
Set .ActiveConnection = Cnn
.CommandText = strSQL
.CommandType = adCmdText
.Execute RecordsAffected, , adExecuteNoRecords
End With

MsgBox "Es wurden " & RecordsAffected & _
" Datensätze geändert", vbInformation

Damit würden die Felder "FeldA" und "FeldB" auf den Wert "NeuerWert" bei
allen Datensätzen in Tabelle "DeineTabelle" geändert, bei denen das "FeldX"
den Wert Kriterium enthält. Nach erfolgreicher Ausführung des Commands
enthält RecordsAffected die Anzahl der geänderten Datensätze. Cnn ist dabei
Dein geöffnetes Connectionobjekt.
Diese Methode ist deutlich schneller als ein Recordset einzulesen mit
anschliessendem Durchlaufen und Ändern aller Datensätze.

Und natürlich muss auch das in einem echten Programm durch eine saubere
Fehlerbehandlung überwacht werden.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)
Ralf Schrader
2005-10-25 17:21:59 UTC
Permalink
ADO kann systembedingt in einem Recordset, welches mit einer JOIN- Abfrage
gebildet wird, nur die Values einer Tabelle updaten. Iim Regelfall ist das
die linke Tabelle, welche den PK enthält. Wenn man das ändern will, gibt es
die Property ("Unique Table"). Dann macht es sich meist aber notwendig, über
die weitere Property("Update Resync") für die korrekte Rechronisation der
beiden Tabellen im Recordset zu sorgen. Details stehen in der Hilfe, alles
in allem ziemlich stinking, deshalb habe ich das seit Jahren nicht mehr
benutzt. Das Szenario lässt sich fast immer über ein hierarchisches
Recordset lösen, dann hast Du volle Unterstützung von ADO.

Ralf


"Ray" <baumann-***@web.de> schrieb im Newsbeitrag news:***@g49g2000cwa.googlegroups.com...
Hallo an Alle,

ich möchte in ein Recordset alle Zeilen durchlaufen und in zwei
spalten den Wert ändern. Die geänderten Werten kommen aus zwei
verschiedenen Tabellen und wurden via SQL dem Recordset übergeben.
Leider bringt er mir dann immer die Fehlermeldung das zu wenig
Information zur Aktualisierung vorhanden sind. Die SQL-Abfrage gibt mir
die Daten aber richtig in ein Datengrid zurück. Stimmt vielleicht mit
meiner Methode etwas nicht?

Das nachfolgende Beispiel klappt mit einem Wert aus einer Tabelle. Wie
gesagt wenn ich es mit mehreren Werten versuche bekomme ich eine
Fehlermeldung.

With adoPrimaryRS
.MoveFirst

Do Until .EOF
.Fields("stck") = 0
.Update
.MoveNext
Loop

End With

Loading...