5.1k Aufrufe
Gefragt in Datenbanken von realgar Einsteiger_in (3 Punkte)
Hallo zusammen,

mir stellt sich folgendes Problem:
Ich habe mit Access ein Formular erstellt, welches zwei Unterformulare enthält, dem verbundene Tabellen zugrunde liegen. Eine Tabelle enthält Adressdaten einer Person, eine zweite Tabelle Telefonnummern der Person usw. Das Formular funktioniert soweit.

Nun möchte ich im Rahmen von Programmflusskontrolle dem Benutzer die Möglichkeit geben, während der Eingabe eines neuen Datensatzes jederzeit abzubrechen. In diesem Falle sollen die bisher eingegebenen Daten nicht gespeichert werden.
Die Speicherung soll nur dann erfolgen, wenn eine Schaltfläche "Speichern & Schliessen" betätigt wurde.
Zum Abbrechen habe ich eine Schaltfläche "Abbrechen" vorgesehen.
Deren Benutzung ruft ein Makro auf. Dieses Makro enthält die Aktionen "AbbrechenEreignis" sowie "Schließen". (Parameter: Objekttyp = Formular, Objektname = Formularname, Speichern = nein).

Leider funktioniert dies so nicht, im Falle eines Abbruches werden die bereits eingegebenen Daten trotzdem gespeichert.
Ferner habe ich noch versucht, das Formularereignis "Vor Aktualisierung" zu nutzen, d. h. hier in der Formularansicht "Ereignisprozedur" zu wählen. Nun bekomme ich jedoch noch während des Ausfüllens des Formulars eine Rückfrage, ob ich speichern will und zwar genau dann, wenn die Datenbefüllung von Feldern anfängt, die zur nächsten Tabelle des Formulars gehören (Z. B. Telefonnummern).

Besten Dank für Ideen und Hilfen & Herzliche Grüße

2 Antworten

0 Punkte
Beantwortet von
hi

in access werden daten zur laufzeit in variablen geschrieben.
also bei jeder eingabe.
du musstest dise vor beendigung leeren da access sonst die änderung
speichern will.
wenn du das formular an eine abrage koppelst kanst du jederzeit
mir Esc abbrechen und die eingaben verwerfen.
die übergabe der daten geschiht erst beim SPEICHERN oder beeginn einer neuen eingabe. neuer datensatz.

vieleicht hilft dir das.
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Realgar,

das Problem ist kompliziert und es gibt verschiedene Ansätze. Das Hauptproblem sind abgebrochene Aktionen und parallele Zugriffe durch weitere Anwender. Prinzipiell gehe ich davon aus, das dein Datenmodell eine referenzielle Integrität zwischen den 1:n-Tabellen enthält. Somit muss der Datensatz im Hauptformular bereits gespeichert sein, bevor du die Datensätze im Hunterformular hinzufügst. Dabei handelt es sich um unabhängige Ereignisse, die bei einem Abbruch der Ausfürhung beachtet werden müssen..

Ansatz 1:
Du erzeugst dir eine weitere Struktur der beteiligten Tabellen (TEMP), die die eingetragenen Informationen aufnehmen. Bei Drüclen des Save-Buttons überträgst du die Daten in die Haupttabellen, wobei evtl. die Referenzierungsfelder (bei Autowert in der 1-Tabelle) ein paar Hinternisse bereit halten. Beim Cancel.Button löschst du einfach die Daten aus den TEMP-Tabellen. In einer Mehrbenutzerumgebung musst du die TEMP-Tabellen lokal halten oder über den Benutzernamen eindeutig markieren. Beim Start der Anwendung (oder Öffen des Formulars) löschst du ebenfalls die TEMP-Tabellen, falls es abstürze gab, sicher ist sicher.

Ansatz 2:
In des Tabellen fügst du zwei weitere Felder (z.B. valid as boolean und einen eindeutigen Benutzernamen) ein. Beide Felder werden nicht angezeigt. Das Feld Benutzername setzt du direkt beim Anzeigen des Datensatzes.Das Valid-Feld wird ebenfalls nicht angezeigt, sondern durch den save-Button gesetzt. Beim Cancel-Button löschst du ganz normal die den Hauptdatenssatz und über die Löschverfolgung auch die abhängigen Datensätze. Sollte das System zwischenzeitlich abschmieren, steht der DS noch mit valid = false in der DB. Diese Daten dürfen in den weiteren Programmteilen nicht beachtet werden, was evtl. größere Programmänderungen mit sich führt. Beim Öffnen des Formulars kannst du also die Datensätze des angemeldeten Benutzers mit vald=false einfach löschen.

Ansatz 3:
mit Begintrans, committrans und rollback stehen dir DB-eigene Funktionen zur Verfügung um unabhängige SQL-Transaktionen zu kapseln, die aber nach meiner Meinung nur komplett in VB sinnvoll zu realisieren sind. Das würden hier den Ansatz sprengen. Du findest über die Access-Hilfe einen ersten Einblick zu diesem Thema.

Es gibt bestimmt noch viele weitere Ansätze. Ansatz 1 ist für mich der einfachste Weg, da die bestehende Anwendung nicht beeinflusst wird. Ansatz 2 hat den Vorteil, dass du nicht weitere Tabellen verwalten musst. Ansatz 3 ist smart, beim Einsatz von Backend-DB wie MSSQL oder Oracle.

Ich hoffe, die Tipps helfen dir ein wenig bei deinen Überlegungen. Wir wirst du das Problem lösen?

Gruß
Ralf
...