Поделиться через


Событие макроса 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 , удаляются.

В следующей таблице перечислены макрокоманды, которые можно использовать в событииПеред изменением .

Тип команды

Команда

Управление

Оператор макроса "Примечание"

Управление

Оператор макроса "Группа"

Управление

Макроблок Если... То... Иначе

Блок данных

Макрокоманда LookupRecord

Действия с данными

Макрокоманда "УстранитьОшибкуМакроса"

Действия с данными

Макрокоманда "ПриОшибке"

Действия с данными

Макрокоманда "ВыводОшибки"

Действия с данными

Макрокоманда "ЗадатьПоле"

Действия с данными

Макрокоманда "ЗадатьЛокПеременную"

Действия с данными

Макрокоманда "ОстановитьМакрос"

Чтобы создать макрос данных, который фиксирует событие Перед изменением , выполните следующие действия.

  1. Откройте таблицу, для которой требуется записать событие До изменения .

  2. На вкладке Таблица в группе Перед событиями щелкните Перед изменением.

В окне конструктора макросов отобразится пустой макрос данных.

Пример

В следующем примере кода используется событие 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 
 

Чтобы просмотреть этот пример в конструкторе макросов, выполните следующие действия.

  1. Откройте таблицу, для которой требуется записать событие До изменения .

  2. На вкладке Таблица в группе Перед событиями щелкните Перед изменением.

  3. Выберите код в следующем примере кода и нажмите клавиши CTRL+C , чтобы скопировать его в буфер обмена.

  4. Активируйте окно конструктора макросов и нажмите клавиши 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]&lt;&gt;"3 - Resolved" And [Status]&lt;&gt;"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