Makroereignis "Vor Änderung"
Gilt für: Access 2013, Office 2013
Das Ereignis Vor Änderung tritt ein, wenn ein Datensatz geändert wird, jedoch bevor der Commit für die Änderung erfolgt ist.
Hinweis
Das Ereignis Vor Änderung ist nur in Datenmakros verfügbar.
Hinweise
Mit dem Ereignis Vor Änderung führen Sie sämtliche Aktionen vor dem Ändern eines Datensatzes aus. Das Ereignis Vor Änderung wird häufig verwendet, um Überprüfungen auszuführen und benutzerdefinierte Fehlermeldungen auszugeben.
Mithilfe der Funktion Aktualisiert(„Feldname“) können Sie feststellen, ob sich ein Feld verändert hat. Das folgende Codebeispiel zeigt, wie sie mithilfe einer If-Anweisung ermitteln, ob das Feld PaidInFull geändert wurde.
If Updated("PaidInFull") Then
/* Perform actions based on changes to the field. */
End If
Mit der IstEingefügt-Eigenschaft ermitteln Sie, ob das Ereignis Vor Änderung durch das Erstellen eines neuen Datensatzes oder eine Änderung an einem vorhandenen Datensatz ausgelöst wurde. Die IstEingefügt -Eigenschaft enthält True, wenn das Ereignis durch einen neuen Datensatz ausgelöst wurde, und False, wenn das Ereignis durch eine Änderung an einem vorhandenen Datensatz ausgelöst wurde.
Das folgende Codebeispiel veranschaulicht die Syntax der IstEingefügt -Eigenschaft.
If [IsInsert] = True Then
/* Actions for validating a new record go here. */
Else
/* Actions for processing a changed record go here. */
End If
Mit der folgenden Syntax können Sie auf einen vorherigen Wert in einem Feld zugreifen.
[Old].[Field Name]
For example, to access the previous value of the QuantityInStock field, use the following syntax.
[Old].[QuantityInStock]
Am Ende des Ereignisses Vor Änderung werden die vorherigen Werte dauerhaft gelöscht.
Mit der AuslösenFehler -Aktion können Sie das Ereignis Vor Änderung abbrechen. Bei einem Fehler werden die Änderungen im Ereignis Vor Änderung verworfen.
In der folgenden Tabelle sind Makros ausgeführt, die im Ereignis Vor Änderung verwendet werden können.
Befehlstyp |
Befehl |
---|---|
Programmablauf |
|
Programmablauf |
|
Programmablauf |
|
Datenblock |
|
Datenaktion |
|
Datenaktion |
|
Datenaktion |
|
Datenaktion |
|
Datenaktion |
|
Datenaktion |
Zum Erstellen eines Datenmakros, mit dem das Ereignis Vor Änderung erfasst wird, führen Sie die folgenden Schritte aus.
Öffnen Sie die Tabelle, für die Sie das Ereignis Vor Änderung erfassen möchten.
Klicken Sie auf der Registerkarte Tabelle in der Gruppe Vorabereignisse auf Vor Änderung.
Im Makro-Designer wird ein leeres Datenmakro angezeigt.
Beispiel
Im folgenden Codebeispiel wird das Before Change-Ereignis verwendet, um die Statusfelder zu überprüfen. An error is raised if an inappropriate value is contained in the Resolution field.
/* Check to ensure that if the bug is resloved that the user has selected a resolution */
If [Status]="3 - Resolved" And IsNull([Resolution]) Then
RaiseError
Error Number 1
Error Description You must select a resolution.
End If
/* Check to ensure that if a bug is closed that the user has selected a resolution first */
If [Status]="4 - Closed" And IsNull([Resolution]) Then
RaiseError
Error Number 2
Error Description An issue must be resolved before it can be closed.
End If
If [Status]<>"3 - Resolved" And [Status]<>"4 - Closed" Then
SetField
Name Resolution
Value =Null
End If
Zum Anzeigen dieses Beispiels im Makro-Designer gehen Sie folgendermaßen vor:
Öffnen Sie die Tabelle, für die Sie das Ereignis Vor Änderung erfassen möchten.
Klicken Sie auf der Registerkarte Tabelle in der Gruppe Vorabereignisse auf Vor Änderung.
Wählen Sie den Code im folgenden Codebeispiel aus, und drücken Sie dann STRG+C , um ihn in die Zwischenablage zu kopieren.
Aktivieren Sie das Makro-Designer-Fenster, und drücken Sie dann STRG+V.
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/04/application">
<DataMacro Event="BeforeChange">
<Statements>
<Comment>Check to ensure that if the bug is resloved that the user has selected a resolution </Comment>
<ConditionalBlock>
<If>
<Condition>[Status]="3 - Resolved" And IsNull([Resolution])</Condition>
<Statements>
<Action Name="RaiseError">
<Argument Name="Number">1</Argument>
<Argument Name="Description">You must select a resolution.</Argument>
</Action>
</Statements>
</If>
</ConditionalBlock>
<Comment>Check to ensure that if a bug is closed that the user has selected a resolution first </Comment>
<ConditionalBlock>
<If>
<Condition>[Status]="4 - Closed" And IsNull([Resolution])</Condition>
<Statements>
<Action Name="RaiseError">
<Argument Name="Number">2</Argument>
<Argument Name="Description">An issue must be resolved before it can be closed.</Argument>
</Action>
</Statements>
</If>
</ConditionalBlock>
<ConditionalBlock>
<If>
<Condition>[Status]<>"3 - Resolved" And [Status]<>"4 - Closed"</Condition>
<Statements>
<Action Name="SetField">
<Argument Name="Field">Resolution</Argument>
<Argument Name="Value">Null</Argument>
</Action>
</Statements>
</If>
</ConditionalBlock>
</Statements>
</DataMacro>
</DataMacros>
Das folgende Beispiel zeigt, wie Sie die Aktion RaiseError verwenden, um das Datenmakroereignis "Before Change" abzubrechen. Wenn das Feld AssignedTo aktualisiert wird, wird ein LookupRecord-Datenblock verwendet, um zu bestimmen, ob der zugewiesene Techniker derzeit einer offenen Serviceanfrage zugewiesen ist. Wenn dies zutrifft, wird das Ereignis Before Change abgebrochen, und der Datensatz wird nicht aktualisiert.
Der Beispielcode stammt von:Microsoft Access 2010 Programmer's Reference.
/* Get the name of the technician */
Look Up A Record In tblTechnicians
Where Condition =[tblTechnicians].[ID]=[tblServiceRequests].[AssignedTo]
SetLocalVar
Name TechName
Expression [tblTechnicians].[FirstName] & " " & [tblTechnicians].[LastName]
/* End LookUpRecord */
If Updated("AssignedTo") Then
Look Up A Record In tblServiceRequests
Where Condition SR.[AssignedTo]=tblServiceRequests[AssignedTo] And
SR.[ID]<>tblServiceRequests.[ID] And IsNull(SR.[ActualCompletionDate])
Alias SR
RaiseError
Error Number 1234
Error Description ="Cannot assign a request to the specified technician: " & [TechName]
End If