Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

ungewollte Änderungen über kombinationsfeld

Begonnen von Luisa, November 02, 2012, 11:06:32

⏪ vorheriges - nächstes ⏩

Luisa

Hallo Allerseits,

ich bin in Anfänger in Bezug auf Access. Mit VBA arbeite ich aber schon seit einigen Jahren. Vielleicht kann mir jemand helfen!?

Ich führe eine Liste zu einer jährlich wiederkehrenden Veranstaltung. Weil viele Teilnehmer jedes Jahr dabei sind, möchte ich mir natürlich die Tipparbeit ersparen und die notwendigen Daten aus einer Teilnehmerdatenbank holen, ergänzen, evtl. ändern (z.B. die Gruppenzugehörigkeit), aber auch neue Teilnehmer in die Datenbank einfügen.

Auf meinem Formlar befinden sich diverse Kombinationsfelder, z. B cmbName, cmbVorname, cmbGruppe ...
cmbName zeigt alle Nachnamen der Liste an.
cmbVorname ist mit ... WHERE teilnehmer.name = cmbName so eingestellt, dass nur die passenden Einträge aufgelistet werden.
Das gleiche gilt für alle weiteren Komb.felder

Über folgenden Code habe ich das Formular so eingestellt, dass die ersten Einträge zu cmbVorname, cmbGruppe u.s.w. sofort angezeigt werden:

Private Sub cmdName_LostFocus()
Me.cmdVorname = Me.cmdVorname.ItemData(0)
Me.cmdGruppe = Me.cmdGruppe.ItemData(0)
Me.cmdJahrg = Me.cmdJahrg.ItemData(0)
.....

End Sub


Ich musste nun feststellen, dass Daten in der Tabelle geändert werden, ohne dass ich das möchte.
Wenn ich beispielsweise mit dem Tabulator auf den nächsten Datensatz gehe, dann erscheint zwar ein neuer Name, aber Vorname, Gruppe u.s.w ändern sich nicht. (Ich müsste wohl erst auf "alle Aktualisieren" gehen). Aber noch schlimmer Vorname, Gruppe u.s.w. werden mit den noch bestehenden Einträgen überschrieben.

FRAGE: Löse ich mit Me.cmdVorname = Me.cmdVorname.ItemData(0) schon die Änderungen aus, oder erst mit mit Betätigen des Tabulators? Was kann ich tun, damit die Entscheidung Änderungen "Ja" oder "Nein" bei mir bleibt?

UND: Kann ich das Formular so einstellen, dass das "requiry" automatisch für den nächsten Datensatz erfolgt, oder ändere ich damit möglicherweise wieder ungewollt die Tabelle?


Schon mal Danke
und Gruß
Luisa

69bruno

Hm,

so ganz finde ich die Beshreibung nicht ausreichend.

Aber ich versuche mal....
Ich hoffe, Du hast die Daten nicht nur in einer Liste (=Tabelle) ?
Solltest Du mehrere Tabellen haben (was dringend zu empfehlen ist) dann müssten die Tabellen z.B. über Primärschlüssel in Beziehung zueinander gesetzt werden.
Und dann böte es sich an, ein Hauptformular mit dem Namen zu gestalten, in dem ein Unterformular mit den restlichen Daten eingebaut ist. Da erübrigt sich dann jeder VBA-Kram, um die zugehörigen Daten anzuzeigen, dass macht ein Unterformular automatisch.

Gruß
Bruno
If Brain <= requestoutofPost then
  PostonForum "Ich verstehe Dein Problem nicht....."
Else
  PostonForum "Denk erst mal über die Normalisierung nach......"
End If

Beaker s.a.

Hallo Luisa,
Da die Kombis ja wohl an die Tabellenfelder gebunden
sind, funzt das so nur bei neuen DS.
Private Sub cmdName_LostFocus()
    If Me.NewRecord Then
        Me.cmdVorname = Me.cmdVorname.ItemData(0)
        Me.cmdGruppe = Me.cmdGruppe.ItemData(0)
        Me.cmdJahrg = Me.cmdJahrg.ItemData(0)
        .....
    End If
End Sub

Ansonsten musst die Kombis ungebunden einrichten
und die Tabellenfelder programmatisch mit den Werten
füllen.
hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Luisa

Hallo und Danke für die Antworten!

Die Kombis sind tatsächlich gebunden. Aber auch mit ungebundene Kombis sind die Tabelle überschrieben worden.

Einen neuen DS habe ich noch gar nicht eingefügt, weil ich erst einmal mit Access "rumbasteln" wollte, um zu sehen, wie gut ich damit klarkomme.

Ich sitze im Augenblick an einer anderen Maschine und kann es nicht ausprobieren, aber ich glaube, dass dieser Effekt nicht auftritt, wenn die Verbindung wieder neu aufgefrischt wurde. Ich muss es einmal mit einer sehr kleinen Tabelle versuchen. Vielleicht kann ich dann erkennen, ob die Änderungen IMMER durchgeführt werden. (Komme aber erst am Montag dazu.)

Ich verstehe das bisher so: mit Me.cmdVorname = Me.cmdVorname.ItemData(0) weise ich die Darstellung eines DS in den Kombis an. Wenn ich dann den nächsten DS aufrufe und dabei Vorname ... usw. nicht aktualisiert werden, dann hat der Kombi cmbName schon den nächsten Datensatz am Wickel, und ändert deren Einträge (Vorname ...) im dann aktuellen Datensatz mit den noch in der Anzeige verbliebenen Daten.
Gibt es denn keine explicite Anweiseung daten nur zu lesen? Und alternativ natürlich Ändern und Hinzufügen von Datensätzen?

Hab grad selbst eine Idee. Vielleicht sollte ich beim erneuten Wechsel auf cmbName ein me.requery durchführen. Ich werde es ausprobieren!

Gibt es eigentlich auch Versionsunterschiede? Auf der linken Seite des Formulars erscheint ein Bleistift! Denn hab ich bei älteren Versionen nie gesehen!

Gruß
Luisa


Beaker s.a.

#4
Hallo Luisa,
ZitatAber auch mit ungebundene Kombis sind die Tabelle überschrieben worden.
Das glaube ich eher nicht, konnte ich bei mir jedenfalls
noch nicht beobachten.
ZitatIch verstehe das bisher so: mit
Me.cmdVorname = Me.cmdVorname.ItemData(0)weise ich die Darstellung eines DS in den Kombis an.
Nö, damit änderst Du das (gebundene) Feld auf den
ersten Eintrag im Kombi.
ZitatGibt es denn keine explicite Anweiseung daten nur zu lesen?
Wozu? Das ist doch das, was ein Formular macht, -
DS zeigen damit Du sie lesen kannst. Geändert
wird automatisch, wenn Du ein Feld überschreibst
und Access den DS speichern kann. Angefügt wird
indem Du zu einem neuen DS wechselst.
Edit
Du kannst natürlich auch die Formulareigenschaft
"Änderungen zulassen" auf Nein einstellen, dann wird
auch nichts geändert, Du läufst mit Deinem Code aber
evtl. auf einen Fehler (ungetestet).
/Edit
ZitatAuf der linken Seite des Formulars erscheint ein Bleistift! Denn hab ich bei älteren Versionen nie gesehen!
Den gibt es schon immer (zumindest seit A2K).
Das ist der Datensatzmarkierer, den Du aber per
Formulareigenschaft auch ausblenden kannst.
Der Bleistift zeigt an, das sich der DS im Bearbeitungs-
modus befindet (Formeigenschaft "Dirty" ist True).
hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Luisa

Hallo Beaker,

ZitatDas ist doch das, was ein Formular macht, -
DS zeigen damit Du sie lesen kannst. Geändert
wird automatisch, wenn Du ein Feld überschreibst
und Access den DS speichern kann. Angefügt wird
indem Du zu einem neuen DS wechselst.

Ja, das erwarte ich ja auch  ;D , aber leider werden nicht alle Kombis gleichzeitig aktualisiert!


Ich habe aber noch ein weiteres Problem festgestellt: Die Tabelle enthält eine Spalte, die ich lfdNr genannt habe. Sie ist indiziert! Wenn ich einen neuen Datensatz aufrufe (nach einem manuellen requiry) dann steht der neue Datensatz immer an der obersten Stelle der Tabelle und hat IMMER die lfdNr 1!

Ich habe jetzt mit dem Assistenten ein Formular erstellt, dort passieren diese "Fehler" nicht! Ich muss also etwas Grundsätzliches fehlen! Oder?

Ich teste also weiter mit dem automatisch erstellten Formular, lasse den Beitrag aber noch offen, falls doch noch jemand eine Antwort geben kann.


Gruß
Luisa

DF6GL

Hallo,


was soll mit:

ZitatMe.cmdVorname = Me.cmdVorname.ItemData(0)

denn überhaupt bezweckt werden?



Am Besten lädst Du die Db mal (komprimiert/repariert und gezippt) hier hoch und beschreibst anhand der genauen Tabellen-,Formular- und Textfeld-Namen, was wann genau passieren soll, bzw.was genau erwartet wird.




Luisa

Hallo und Danke für die Antworten.

Ich habe mir inzwischen ein Buch zur Einführung zu besorgt. Die Lösung für mein Problem ist das recordset.
Ich habe also folgendes gelernt:

Mit dem Recordset lade ich die Kopie einer Tabelle oder einer Abfrage

dim rs as recordset
set rs = currentdb.openrecordset("Tabellenname, dbopenDynaset")

und kann die Daten dann aus dem recordset in einem Formular anzeigen, bearbeiten und zurück in die Tabelle speichern.

Eine Frage hätte ich aber noch dazu: Wenn ich obigen Code verwende, ist das dann ein ADO oder eine DAO Objekt?

Gruß
Luisa

Beaker s.a.

Hallo Luisa,
Erstmal:
set rs = currentdb.openrecordset("Tabellenname", dbopenDynaset)
Zitatist das dann ein ADO oder eine DAO Objekt
Wenn Du das so deklarierst entscheidet das VBA anhand
der gesetzten Verweise. Ansonsten entscheidest Du das selber,
indem Du entweder
Dim rs As DAO.Recordset oder
Dim rs As ADODB.Recordset
schreibst. Musst Du aber aufpassen, ADO funzt etwas anders
als DAO (schau in Dein Buch, oder suche im Forum).
hth
gruss ekkehard

Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Luisa

Hallo Ekkehard,

ich habe mich da an mein neues Buch gehalten. Ein Verweis auf DAO oder ADO ist überhaupt nicht gesetzt. Ich dachte es gibt eine Voreinstellung.
Für mich ist das Thema nun aber erledigt. Ich werde die Verweise also in der Variablendeklaration setzen.

Gruß
Wolfgang

Beaker s.a.

#10
Hallo,
ADO wurde nur für A2K mal als Standard gesetzt, aber
seit A2003 ist der Standard wieder DAO, und der Verweis
ist auch gesetzt, sonst könntest Du die DB gar nicht ohne
Fehlermeldung kompilieren.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,


kurz noch dazu:

ZitatIch werde die Verweise also in der Variablendeklaration setzen

Bei der Variablen-Deklaration werden keine Verwesie gesetzt, allenfalls die Referenz(-Angabe) zum entspr. Datenzugriffsmodell.

Verweise (Zeiger auf die entspr. Code-Bibliotheken) sind im VBA-Editor unter "Extras/Verweise" anzugeben (Haken setzen).