Dokumentenverwaltung

Hallo allerseits

Problemstellung:

einfache Tabelle z. B.
Nr.
Titel
Version
Verfasser
Erstelldatum
Text1
Text2

Jetzt soll ein Datensatz nicht einfach so verändert werden, sondern zuerst eine Kopie erstellt werden (Versionsnummer erhöht), damit die alten Versionen archiviert bleiben.
Das Ganze sollte automatisiert hinter einem Formular ablaufen.

Hat da jemand nen Tip?

Gruss

Ratz

Hallo, Ratz!

Jetzt soll ein Datensatz nicht einfach so verändert werden,
sondern zuerst eine Kopie erstellt werden (Versionsnummer
erhöht), damit die alten Versionen archiviert bleiben.
Das Ganze sollte automatisiert hinter einem Formular ablaufen.

Wie soll die Versionsnummer erhöht werden? Hast Du mehrgeteilte Versionen wie 1.0, 1.1, 1.1.1, 1.1.2, 1.2, 2.0?

Hat da jemand nen Tip?

Einfach alles im Formular sperren (Formular: Bearbeiten nicht erlaubt), dann eine Extra-Schaltfläche „Auschecken/Bearbeiten“, die den Datensatz dupliziert, die Versionsnummer erhöht und den Datensatz aktiviert. Dann eine „Check in“-Schaltfläche, die den Datensatz nicht nur speichert, sondern auch wieder die Bearbeitung verbietet.

Dabei musst Du noch aufpassen, den Zyklus des Formulars entsprechend einzustellen und ggf. PgUp/PgDown für den Datensatzwechsel zu verbieten.

Das ist auch das prinzipielle Verfahren bei Dokumenten-/Versionsverwaltungen: Pauschal sind die Daten erst mal gesperrt. Man muss sie sich explizit holen und dann auch wieder explizit freigeben.

Gruß, Manfred

Hallo Manfred
Danke erstmal für die schnelle Antwort.

Wie soll die Versionsnummer erhöht werden? Hast Du
mehrgeteilte Versionen wie 1.0, 1.1, 1.1.1, 1.1.2, 1.2, 2.0?

Einfach fortlaufende Nummern.

Einfach alles im Formular sperren (Formular: Bearbeiten nicht
erlaubt),

Ok klar

dann eine Extra-Schaltfläche
„Auschecken/Bearbeiten“, die den Datensatz dupliziert, die
Versionsnummer erhöht und den Datensatz aktiviert. Dann eine
„Check in“-Schaltfläche, die den Datensatz nicht nur
speichert, sondern auch wieder die Bearbeitung verbietet.

Dabei musst Du noch aufpassen, den Zyklus des Formulars
entsprechend einzustellen und ggf. PgUp/PgDown für den
Datensatzwechsel zu verbieten.

Das hab ich jetzt nicht kapiert.
Geht es bitte etwas Ausführlicher?

Gruss

Ratz

Hallo, Ratz!

Dabei musst Du noch aufpassen, den Zyklus des Formulars
entsprechend einzustellen und ggf. PgUp/PgDown für den
Datensatzwechsel zu verbieten.

Das hab ich jetzt nicht kapiert.
Geht es bitte etwas Ausführlicher?

Es gibt eine Formular-Eigenschaft „Zyklus“. Wenn die auf „alle Datensätze“ eingestellt ist, kannst Du mit Bild hoch/runter die Datensätze durchscrollen. Und das willst Du ja eigentlich nicht.

Du solltest halt verhindern, dass, vor allem, wenn der Datensatz zum Editieren bereit ist, der Datensatz gewechselt wird und so eigentlich gesperrte Daten verändert werden können. Als Alternative kannst Du auch als Datenquelle des Formulars jeweils nur den einen Datensatz angeben.

Gruß, Manfred

Noch ne Nachfrage
Hallo Manfred
Danke nochmal

Das andere hab ich soweit verstanden.

Wie geht jetzt das?

dann eine Extra-Schaltfläche
„Auschecken/Bearbeiten“, die den Datensatz dupliziert,
Versionsnummer erhöht und den Datensatz aktiviert. Dann eine
„Check in“-Schaltfläche, die den Datensatz nicht nur
speichert, sondern auch wieder die Bearbeitung verbietet.

Gruß

Ratz

Hallo, Ratz!

Wie geht jetzt das?

dann eine Extra-Schaltfläche
„Auschecken/Bearbeiten“, die den Datensatz dupliziert,
Versionsnummer erhöht und den Datensatz aktiviert.

Ungefähr so:

Sub cmdAuschecken\_Click()
 dim lngNeueVersion as Long
 dim lngId as Long
 dim recDaten as recordset
 dim fldFeld as Field

 ' Neue Version bestimmen: maximale um eins erhöhen
 lngNeueVersion = Nz(DMax("Version","Tabelle"),0)+1
 set recDaten=me.recordsetclone
 recDaten.AddNew
 for each fldFeld in recDaten.Fields
 ' alle Daten außer Schlüsselfeld übernehmen
 ' Hier: Ein Schlüsselfeld "Id"
 if fldFeld.Name "Id" then
 recDaten(fldFeld.Name)=Me(fldFeld.Name)
 endif
 next fldFeld
 ' Version setzen
 recDaten("Version")=lngNeueVersion
 ' Datensatz speichern
 recDaten.Update
 Me.Requery
 ' Bearbeiten zulassen
 Me.AllowEdits = True
 ' zum aktuellen Datensatz gehen
 Me.Bookmark = recDaten.LastModified 
 ' oder, falls das nicht geht:
 Me.txtVersion.SetFocus ' mit dem Versionsfeld
 DoCmd.FindRecord lngNeueVersion
 ' alternativ auch nach dem Schlüsselfeld suchen...
End Sub

Dann eine
„Check in“-Schaltfläche, die den Datensatz nicht nur
speichert, sondern auch wieder die Bearbeitung verbietet.

Hier ganz einfach ein DoCmd.runcommand accmdsaverecord und me.AllowEdits=false

Wie immer ungetestet/uncompiliert…

1 Like

Hallo,

ich haette da noch einen anderen Ansatz:

Beim Speichern des bearbeiteten Datensatzes ( ueber speichern Knopf erzwungen) fragt man den .Dirty Status ab.
Ist .Dirty = Wahr springt man in eine Routine, die ueber alle Felder des Formulars iteriert und die Werte in EingabeFeld.OldValue in eine Tabelle schreibt und dabei die Versionsnummer der Aenderung erhoeht.

Hope this helps

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo, Ratz!

Beim Speichern des bearbeiteten Datensatzes ( ueber speichern
Knopf erzwungen) fragt man den .Dirty Status ab.
Ist .Dirty = Wahr springt man in eine Routine, die ueber alle
Felder des Formulars iteriert und die Werte in
EingabeFeld.OldValue in eine Tabelle schreibt und dabei die
Versionsnummer der Aenderung erhoeht.

Ist auch ein Ansatz. Muss aber überall eingebunden werden, wenn ein Speichern ausgelöst wird. Das kann z. B. passieren, wenn Du in ein Unterformular klickst. Das ist das „Problem“ daran, dass bei Access ein Speichern nicht explizit nötig ist; wenn Du ein Formular schließt, werden die Daten automatisch gespeichert (wenn sie denn den Gültigkeitsbedingungen entsprechen).

Gruß, Manfred

Hi allerseits,

Das ist das „Problem“
daran, dass bei Access ein Speichern nicht explizit nötig ist;
wenn Du ein Formular schließt, werden die Daten automatisch
gespeichert (wenn sie denn den Gültigkeitsbedingungen
entsprechen).

Das kann man aber auf verschiedenste Weisen verhindern u.A. indem man beim Schliessen des Formulars auf den Event triggert und dort entsprechend reagiert.

Tschau
Peter

Danke für die Antworten (owt)
.