VB6 / Access DB / Probleme mit AddNew und Update

Helau alle Zusammen,

ich kämpfe mit meiner Datenbankanwendung und komme einfach nicht weiter.
Ich habe eine kleine Access-Datenbank mit zwei Tabellen.
1.Tabelle = T_Namen und 2. Tabelle = T_Zusatz. Das erste Feld von T_Namen (KDNR) hat mit dem ersten Feld von T_Zusatz (ZKDNR) eine 1:1 Beziehung. Diese beiden Felder müssen immer die gleichen Werte haben (KDNR ist ein Schlüsselfeld). Wenn einmal ein Wert in diesen beiden Feldern steht, kann und soll der Wert nicht mehr geändert werden. Alle anderen Felder sind Kann-Felder und können somit auch leer sein.
Nun aber mein Problem:
Wenn ich mit rs.AddNew einen neuen Datensatz anlege, kommt ein 5stelliger Wert in die Felder KDNR und ZKDNR. Der Abschluss bildet rs.Update. Damit ist der neue Datensatz angelegt. Wie gesagt, nicht immer werden sofort Daten in den neuen Datensatz eingegeben. Wenn ich jetzt aber in irgend ein Feld einen Wert eingebe, und mit rs.Update abschließe, bekomme ich eine Fehlermeldung.

Laufzeitfehler –2147467259 (80004005) Unbekannter Fehler.

Das bedeutet, nach rs.AddNew kommt rs.Update , und wenn kein zusätzliches Feld ausgefüllt wird ist alles OK. Wird aber ein weiteres Feld ausgefüllt, folgt nach der Eingabe erneut wieder ein rs.Update und genau jetzt kommt die Fehlermeldung.
Wie sage ich der Anwendung, dass nach rs.AddNew und rs.Update der Datensatz angelegt ist und jede weitere Feldeingabe nur mit rs.Update erfolgen soll?

Noch ein Hinweis, wenn ich den neuen Datensatz angelegt habe und dann einen Datensatz zurück gehe und dann wieder vor, kann ich alle Felder nach einander mit rs.Update eingeben.

Ich hoffe mir kann jemand helfen.

Mit freundlichen Grüßen
Detlev

Hallo,

Das bedeutet, nach rs.AddNew kommt
rs.Update , und wenn kein zusätzliches Feld
ausgefüllt wird ist alles OK. Wird aber ein weiteres Feld
ausgefüllt, folgt nach der Eingabe erneut wieder ein
rs.Update und genau jetzt kommt die
Fehlermeldung.

korrekt, es ist kein Datensatz zur Bearbeitung geöffnet.

Wie sage ich der Anwendung, dass nach
rs.AddNew und rs.Update
der Datensatz angelegt ist und jede weitere Feldeingabe nur
mit rs.Update erfolgen soll?

Gar nicht, das funktioniert so nicht. Wenn Du etwas schließen möchtest, musst Du es vorher öffnen.

Entweder, Du lässt das erste Update weg und schließt den neuen Datensatz erst, wenn alle Daten eingetragen sind. Das ist das übliche Vorgehen, oder Du öffnest vor der Eingabe weiterer Daten den Datensatz mit RS.Edit neu, trägst die Daten ein und schließt danach mit Update. Das würde funktionieren, auch wenn sich mir der Sinn nicht erschließt.

Gruß Rainer

Hallo Rainer,
das hört sich genau so an, wie ich es gerne haben möchte. Leider funktioniert es nicht, denn 1. gibt es kein rs.Edit neu sondern nur rs.EditMode und 2. bei rs.EditMode kommt die Fehlermeldung: Ungültige Verwendung einer Eigenschaft.
Irgendwie verstehe ich das nicht.

Noch etwas zu Deiner Information:
Wenn ich das Schlüsselwort (KDNR) eingegeben habe, können noch weitere 14 Datenfelder ausgefüllt werden. Da ich aber nicht immer weis, welche Datenfelder ausgefüllt werden, kann ich im voraus auch nicht sagen wo ich das rs.Update setzen soll, ohne alle Datenfelder durchgehen zu müssen. Ich wollte nur die z.Zt. benötigten Datenfelder einzeln mit rs.Update eingeben.

Mit freundlichen Grüßen
Detlev

Hallo,

das hört sich genau so an, wie ich es gerne haben möchte.
Leider funktioniert es nicht, denn 1. gibt es kein
rs.Edit neu

Doch, das ist das ‚Add‘, das Du verwendest.

sondern nur
rs.EditMode und 2. bei
rs.EditMode kommt die Fehlermeldung:
Ungültige Verwendung einer Eigenschaft.

Dann hast Du nicht vorher auf einen Datensatz positioniert.

Irgendwie verstehe ich das nicht.

Noch etwas zu Deiner Information:
Wenn ich das Schlüsselwort (KDNR) eingegeben habe, können noch
weitere 14 Datenfelder ausgefüllt werden. Da ich aber nicht
immer weis, welche Datenfelder ausgefüllt werden, kann ich im
voraus auch nicht sagen wo ich das
rs.Update setzen soll, ohne alle
Datenfelder durchgehen zu müssen. Ich wollte nur die z.Zt.
benötigten Datenfelder einzeln mit
rs.Update eingeben.

Das geht aber nicht.
Rs.Update funktioniert nur, wenn vorher entweder RS.Addnew oder RS.Edit steht.

Vergleichbar ist das mit einem Ordner. Den kannst Du neu anlegen oder zum Bearbeiten öffnen. Schließen kannst Du ihn nur, wenn er geöffnet ist. Was schon zu ist, kann man nicht schließen.

Im Weiteren scheinen die Unterschiede zwischen VB6 und VBA größer zu sein, als ich ertwartet habe. In der Syntax gibt es also zwischen Deinem und meinem Code deutliche Unterschiede. Das Prinzip, daß man einen Datensatz zum bearbeiten öffnen muss, dann Daten hineinschreiben und dann die Daten gesichert werden, wenn der Datensatz wieder geschlossen wird, ist aber allen Datenbanken gemein.

Gruß Rainer

Hallo Rainer,
ich glaube Du hast den richtigen Weg gefunden, nur muss ich ihn noch umsetzen können. Du hast geschrieben:

Dann hast Du nicht vorher auf einen Datensatz positioniert.

Das könnte das Problem sein, denn folgendes ist mir aufgefallen.
Wenn ich einen neuen Datensatz mit rs.AddNew anlege und nach dem Schlüsselfeld mit rs.Update schließe, kann ich in den nächsten Feldern Daten eingeben. Wenn ich jetzt die VB6-Anwendung schließe und wieder öffne, sind die Datenfelder leer. Die Werte die ich in die Datenfelder eingegeben habe wurden in den ersten Datensatz der Tabelle gespeichert. Das würde bedeuten, ich kann die Daten eingeben, aber der Couser steht nicht im richtigen Datensatz.
Kann das sein? Oder liege ich da wieder mal falsch?
Wie bekomme ich jetzt aber den Couser in den richtigen Datensatz? Vielleicht mit rs.MoveLast. Ich muss es noch mal testen.

Mit freundlichen Grüßen
Detlev

Hallo,

Wenn ich einen neuen Datensatz mit
rs.AddNew anlege und nach dem Schlüsselfeld
mit rs.Update schließe, kann ich in den
nächsten Feldern Daten eingeben. Wenn ich jetzt die
VB6-Anwendung schließe und wieder öffne, sind die Datenfelder
leer.

Das ist korrekt.
Um Daten in einen Datensatz schreiben zu können, musst Du den Datensatz öffnen, bearbeiten und dann beim schließen schreiben.

VB6 sollte sich auch weigern, den Datensatz zu wechseln, so lange der offene Datensatz nicht geschrieben wurde. Das scheint bei Dir zu gehen, ist dann aber ein Fehler.

Die Werte die ich in die Datenfelder eingegeben habe
wurden in den ersten Datensatz der Tabelle gespeichert. Das
würde bedeuten, ich kann die Daten eingeben, aber der Couser
steht nicht im richtigen Datensatz.
Kann das sein? Oder liege ich da wieder mal falsch?

Nein, da liegst Du nicht falsch.

Wie bekomme ich jetzt aber den Couser in den richtigen
Datensatz? Vielleicht mit rs.MoveLast. Ich
muss es noch mal testen.

Den letzten eingetragenen Datensatz findest Du mit RS.Movelast nur, wenn Du die Daten sequentiell einträgst, Deine Tabelle keinen Primärschlüssel hat.

Hat die Tabelle einen Primärschlüssel, musst Du den Datensatz mit .Find oder .FindFirst suchen. Die Syntax ist je nach Datenbank (ADO oder DAO) verschieden.

Gruß Rainer

Hallo Rainer,
ich habe es ausprobiert und es funktioniert nach meinen Vorstellungen.

Den letzten eingetragenen Datensatz findest Du mit RS.Movelast
nur, wenn Du die Daten sequentiell einträgst, Deine Tabelle
keinen Primärschlüssel hat.

Ich habe keinen Primärschlüssel und jede KDNR in einem neuen Datensatz ist immer höher als die vorhergehende KDNR. Somit funktioniert es mit rs.MoveLast.

Rainer, vielen Dank für Deine tollen Tipps, ich habe wieder einiges gelernt.
Ich wünsche Dir noch einen schönen Tag.
Mit freundlichen Grüßen
Detlev