Событие макроса Before Change
Область применения: Access 2013, Office 2013
Событие Before Change возникает при изменении записи, но до фиксации изменения.
Примечание.
Событие Before Change доступно только в макросах данных.
Замечания
Используйте событие Перед изменением , чтобы выполнить все действия, которые необходимо выполнить перед изменением записи. До изменения обычно используется для выполнения проверки и создания пользовательских сообщений об ошибках.
Вы можете использовать функцию Updated("Имя поля"), чтобы определить, изменилось ли поле. В следующем примере кода показано, как использовать оператор If для определения того, было ли изменено поле PaidInFull.
If Updated("PaidInFull") Then
/* Perform actions based on changes to the field. */
End If
Используйте свойство IsInsert , чтобы определить, было ли событие Before Change активировано новой создаваемой записью или изменением существующей записи. Свойство IsInsert содержит значение True , если событие было активировано новой записью, значение False , если событие было спровоцировано изменением существующей записи.
В следующем примере кода показан синтаксис использования свойства IsInsert .
If [IsInsert] = True Then
/* Actions for validating a new record go here. */
Else
/* Actions for processing a changed record go here. */
End If
Можно использовать доступ к предыдущему значению в поле с помощью следующего синтаксиса.
[Old].[Field Name]
Например, для доступа к предыдущему значению поля QuantityInStock используйте следующий синтаксис.
[Old].[QuantityInStock]
Предыдущие значения удаляются безвозвратно по завершении события До изменения .
Событие Перед изменением можно отменить с помощью действия RaiseError . При возникновении ошибки изменения, содержащиеся в событии Before Change , удаляются.
В следующей таблице перечислены макрокоманды, которые можно использовать в событииПеред изменением .
Тип команды |
Команда |
---|---|
Управление |
|
Управление |
|
Управление |
|
Блок данных |
|
Действия с данными |
|
Действия с данными |
|
Действия с данными |
|
Действия с данными |
|
Действия с данными |
|
Действия с данными |
Чтобы создать макрос данных, который фиксирует событие Перед изменением , выполните следующие действия.
Откройте таблицу, для которой требуется записать событие До изменения .
На вкладке Таблица в группе Перед событиями щелкните Перед изменением.
В окне конструктора макросов отобразится пустой макрос данных.
Пример
В следующем примере кода используется событие Before Change для проверки полей Состояния. Если в поле Разрешение содержится недопустимое значение, возникает ошибка.
/* 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
Чтобы просмотреть этот пример в конструкторе макросов, выполните следующие действия.
Откройте таблицу, для которой требуется записать событие До изменения .
На вкладке Таблица в группе Перед событиями щелкните Перед изменением.
Выберите код в следующем примере кода и нажмите клавиши CTRL+C , чтобы скопировать его в буфер обмена.
Активируйте окно конструктора макросов и нажмите клавиши CTRL+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>
В следующем примере показано, как использовать действие RaiseError для отмены макроса данных перед изменением. При обновлении поля AssignedTo блок данных LookupRecord используется для определения того, назначен ли назначенный специалист для открытого запроса на обслуживание. Если это так, событие Before Change будет отменено, а запись не обновляется.
Пример кода изсправочника программиста Microsoft Access 2010.
/* 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