Compartilhar via


Evento da macro Antes da Alteração

Aplica-se ao: Access 2013, Office 2013

O evento Antes de Alterar ocorre quando um registro é alterado, mas antes da alteração ser submetida.

Observação

O evento Antes de Alterar está disponível somente em Macros de Dados.

Comentários

Use o evento Antes de Alterar para executar qualquer ação que você deseja que ocorra antes da alteração de um registro. O Antes de Alterar é comumente usado para executar validação e criar mensagens de erro personalizadas.

Você pode usar a função Updated("Nome do Campo") para determinar se um campo foi alterado. O exemplo de código a seguir mostra como usar uma instrução If para determinar se o campo PaidInFull foi alterado.

    If  Updated("PaidInFull")   Then 
     
        /* Perform actions based on changes to the field.   */ 
     
    End If 

Use a propriedade Inserido para determinar se o evento Antes de Alterar foi acionado por um novo registro que está sendo criado ou por uma alteração em um registro existente. A propriedade Inserido apresentará o valor True se o evento tiver sido acionado por um novo registro, e False se o evento tiver sido acionado por uma alteração em um registro existente.

O exemplo de código a seguir mostra a sintaxe para o uso da propriedade Inserido.

    If   [IsInsert] = True   Then 
     
       /*  Actions for validating a new record go here.       */ 
     
    Else 
     
       /* Actions for processing a changed record go here.    */ 
     
    End If

Você pode acessar um valor anterior em um campo utilizando a sintaxe a seguir.

    [Old].[Field Name]

Por exemplo, para acessar o valor anterior do campo QuantidadeEmEstoque, use a sintaxe a seguir.

    [Old].[QuantityInStock]

Os valores anteriores são excluídos permanentemente após a conclusão do evento Antes de Alterar.

Você pode cancelar o evento Antes de Alterar utilizando a ação GerarErro. Quando um erro é exibido, as alterações contidas no evento Antes de Alterar são descartadas.

A tabela a seguir lista comandos de macro que podem ser usadas no evento Antes de Alterar.

Tipo de comando

Comando

Fluxo do programa

Instrução de macro Comentário

Fluxo do programa

Instrução de macro Grupo

Fluxo do programa

Bloco de macro Se... Então... Senão

Bloco de dados

Ação de macro LookupRecord

Ação de Dados

Ação de macro LimparErrodaMacro

Ação de Dados

Ação de macro AoOcorrerErro

Ação de Dados

Ação de macro GerarErro

Ação de Dados

Ação de macro DefinirCampo

Ação de Dados

Ação de macro DefinirVarLocal

Ação de Dados

Ação de macro PararMacro

Para criar uma Macro de Dados que capture o evento Antes de Alterar, siga estas etapas.

  1. Abra a tabela na qual deseja capturar o evento Antes de Alterar.

  2. Na guia Tabela, no grupo Antes de eventos, clique em Antes de Alterar.

Uma macra de dados vazia é exibida no designer de macros.

Exemplo

O exemplo de código a seguir usa o evento Antes de Alterar para validar os campos Status. Um erro será exibido se houver um valor incorreto no campo Resolução.

 
/* 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 
 

Para exibir este exemplo no designer de macros, siga estas etapas.

  1. Abra a tabela na qual deseja capturar o evento Antes de Alterar.

  2. Na guia Tabela, no grupo Antes de Eventos, clique em Antes de Alterar.

  3. Selecione o código no exemplo de código a seguir e pressione CTRL+C para copiá-lo para a área de transferência.

  4. Ative a janela do designer de macro e pressione 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>

O exemplo a seguir mostra como usar a ação RaiseError para cancelar o evento de macro de dados Antes de Alterar. Quando o campo AssignedTo é atualizado, um bloco de dados LookupRecord é usado para determinar se o técnico atribuído está atribuído atualmente a uma solicitação de serviço aberta. Se isso for verdadeiro, o evento Before Change será cancelado e o registro não será atualizado.

Código de exemplo fornecido por: a Referência do programador do 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