Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Juno am Oktober 25, 2010, 16:01:55

Titel: Code vor speichern
Beitrag von: Juno am Oktober 25, 2010, 16:01:55
Hallo,

in Access werden die Daten ja immer gespeichert sobald man in das nächste Feld springt. Wie kann ich vor dem speichern immer zuerst einen VBA-Code durchlaufen lassen?

Also immer wenn ein Datensatz gespeichert wird soll zuerst ein VBA-Code durchlaufen werden.
Titel: Re: Code vor speichern
Beitrag von: database am Oktober 25, 2010, 16:17:53
Hallo,

da gibts verschieden Möglichkeiten!

Zitatin Access werden die Daten ja immer gespeichert sobald man in das nächste Feld springt
Das stimmt so nicht ganz - die Daten werden automatisch in die Tabelle geschrieben, wenn der aktuelle Datensatz verlassen wird.

Du kannst dazu jedoch m.E. am Besten das Ereignis 'BeforeUpdate' also 'Vor Aktualisierung' des Formulars benutzen.

Was möchtest du denn mit deinem geplanten Code bewirken?

Grüße
Peter
Titel: Re: Code vor speichern
Beitrag von: Juno am Oktober 25, 2010, 16:36:46
Ich möchte dort eine If-Anweisung vor setzen. Je nach dem welche Daten ausgefüllt wurden soll dann dem Datensatz ein "status" verpasst werden.

Bei meinem "Speicher-Button" funktioniert das schon.

Ich hatte gedacht ich könnte einfach bei "vor Aktualisierung" des Formulares schreiben call button_save_click. Aber dann kommt immer eine Fehlermeldung und springt in diese Zeile:

DoCmd.RunCommand (acCmdSaveRecord)

Fehlermeldung= Das Makro oder die Funktion, das bzw. die für dieses Feld auf die Eigenschaft 'VorAktualisierung' oder 'Gültigkeitsregel' festgelegt ist, hindert Microsoft Office Access daran, die Daten im Feld zu speichern.
Titel: Re: Code vor speichern
Beitrag von: database am Oktober 25, 2010, 16:57:46
Hallo,

im Prinzip geht's ja auch so nur den Aufruf des Klick-Ereignisses des Speicherbuttons kannst du dir sparen.

Nimm deine Bedingung und schreib sie ins BeforeUpdate-Ereignis.

Zitat...soll dann dem Datensatz ein "status" verpasst werden...

Wenn ich recht gehe in der Annahme, dass deine zugrunde liegende Tabelle auch ein Feld namens Status enthält,
KÖNNTEST du folgendes ins Ereignis BeforeUpdate aufnehmen:

If Me!DeinFeld = "1" Then
       DoCmd.RunSQL ("UPDATE DeineTabelle SET Status = 1 WHERE ID=" & Me!DeinIDFeld )
End If


Ich habe hier die Bedingung natürlich nur beispielhaft eingetragen.
Das ID-Feld deiner Datenherkunft des Formulars MUSS sich aber am Formular befinden (kann jedoch ausgeblendet sein - unsichtbar)

Damit wird veranlasst dass, wenn die Bedingung erfüllt ist, das Feld 'Status' in der Tabelle XY auf den Wert 1 gesetzt wird.
Wenn du bei der Tabellendefinition angegeben hast, dass das Feld 'Status' einen Standardwert hat z.B. 2 sollte das in der Form genügen.

Wenn das nicht der Fall ist brauchst du noch die richtige Aktion wenn die Bedingung nicht erfüllt ist:


If Me!DeinFeld = "1" Then
   DoCmd.RunSQL ("UPDATE DeineTabelle SET Status = 1 WHERE ID=" & Me!DeinIDFeld )
Else
   DoCmd.RunSQL ("UPDATE DeineTabelle SET Status = 2 WHERE ID=" & Me!DeinIDFeld )
End If


HTH
Peter
Titel: Re: Code vor speichern
Beitrag von: Juno am Oktober 25, 2010, 17:11:45
Dann wird der Code aber nicht mehr ausgeführt wenn ich den Speicher-Button anklicke.
Titel: Re: Code vor speichern
Beitrag von: database am Oktober 25, 2010, 17:55:11
Hi,

sicher wirds ausgeführt, das Speichern hinter dem Speicher-Button ebenso wie die Bedingung im BeforeUpdate-Ereignis.
Du darfst nur KEINEN Haltepunkt auf die Speicherbutton_Click - Prozedur setzen!

Oder was meinst du, welcher Code NICHT ausgeführt wird?
Titel: Re: Code vor speichern
Beitrag von: Juno am Oktober 26, 2010, 08:14:46
Ich habe mir jetzt zum testen in den Code ein Msgbox eingefügt.
Wenn ich einfach so von den DS wechsel dann führt der BeforteUpdate aus. Aber wenn ich einfach auf speichern klicke dann wird der Code nicht ausgeführt. Ich meine damit den Code mit der If -Anweisung bei BeforeUpdate.

Vielleicht liegt das auch an meinem Speicher-Code?!?
Private Sub button_save_Click()
Dim vk_nr As Long

'--------------------------------------------------------------
' Speicher-Kommando
'--------------------------------------------------------------
DoCmd.RunCommand (acCmdSaveRecord)
vk_nr = Me!vk_nr
'--------------------------------------------------------------
' Aktualisieren der Kundenliste
'--------------------------------------------------------------
Liste15.Enabled = True
Liste15.Requery
Liste15.SetFocus
Liste15 = vk_nr

Call Liste15_AfterUpdate


End Sub

Private Sub Liste15_AfterUpdate()

Dim rs As DAO.Recordset

Set rs = Me.Recordset.Clone
rs.FindFirst "[vk_nr] = " & str(Liste15)
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
Titel: Re: Code vor speichern
Beitrag von: database am Oktober 26, 2010, 08:55:54
Hallo, guten Morgen!

Nimm alle Befehle aus dem Speicherbutton raus und lass nur das Speicher-Kommando drin.
Die anderen Befehle und Aufrufe pack in die BeforeUpdate - Routine, dann müsste es ordentlich laufen.

Du KANNST auch versuchen, den Speicher-Befehl ganz ans Ende zu stellen und die anderen Befehle vor dem Speichern ausführen

Grüße
Peter
Titel: Re: Code vor speichern
Beitrag von: Juno am Oktober 26, 2010, 09:26:07
Danke, jetzt funktionierts.
Titel: Re: Code vor speichern
Beitrag von: database am Oktober 26, 2010, 09:27:50
Sehr schön, freut mich wenn wir dir hier helfen konnten.
Bitte den Thread in deinem Startbeitrag auf 'gelöst' setzen - DANKE

viel Erfolg weiterhin

Grüße
Peter