Compartir a través de


Cambio previo (evento de macro)

Se aplica a: Access 2013, Office 2013

El evento Cambio previo se produce cuando cambia un registro, pero antes de confirmar el cambio.

Nota:

El evento Cambio previo solo está disponible en macros de datos.

Comentarios

Utilice el evento Cambio previo para realizar cualquier acción que desee que ocurra antes de cambiar un registro. Cambio previo se suele utilizar para realizar la validación y para provocar mensajes de error personalizados.

Puede utilizar la función Updated("Nombre del campo") para determinar si un campo ha cambiado. En el ejemplo de código siguiente se muestra cómo usar una instrucción If para determinar si se ha cambiado el campo PaidInFull.

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

Utilice la propiedad EsInsertar para determinar si el evento Cambio previo se desencadenó por la creación de un nuevo registro o por un cambio en un registro existente. La propiedad EsInsertar contiene Verdadero si el evento se desencadenó por un nuevo registro y Falso si el evento se desencadenó por un cambio en un registro existente.

En el ejemplo de código siguiente se muestra la sintaxis para utilizar la propiedad EsInsertar.

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

Puede obtener acceso al valor anterior de un campo mediante la sintaxis siguiente.

    [Old].[Field Name]

Por ejemplo, para tener acceso al valor anterior del campo QuantityInStock, utilice la sintaxis siguiente.

    [Old].[QuantityInStock]

Los valores anteriores se eliminan permanentemente cuando finaliza el evento Cambio previo.

Puede cancelar el evento Cambio previo mediante la acción ProvocarError. Cuando se provoca un error se descartan los cambios incluidos en el evento Cambio previo.

La siguiente tabla enumera los comandos de macro que pueden utilizarse en el evento Cambio previo.

Tipo de comando

Comando

Flujo de programas

Comentario (instrucción de macro)

Flujo de programas

Grupo (instrucción de macro)

Flujo de programas

If...Then...Else (bloque de macro)

Bloque de datos

Acción de macro LookupRecord

Acción de datos

BorrarErrorDeMacro (acción de macro)

Acción de datos

AlOcurrirError (acción de macro)

Acción de datos

ProvocarError (acción de macro)

Acción de datos

EstablecerCampo (acción de macro)

Acción de datos

EstablecerVariableLocal (acción de macro)

Acción de datos

DetenerMacro (acción de macro)

Para crear una macro de datos que capture el evento Cambio previo, utilice los pasos siguientes.

  1. Abra la tabla en la que desee capturar el evento Cambio previo.

  2. En la ficha Tabla, en el grupo Eventos anteriores, haga clic en Cambio previo.

Una macro de datos vacía se muestra en el Diseñador de macros.

Ejemplo

En el ejemplo de código siguiente se usa el evento Before Change para validar los campos Status. Se produce un error si el campo Resolución contiene un valor inadecuado.

 
/* 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 ver este ejemplo en el Diseñador de macros, utilice los pasos siguientes.

  1. Abra la tabla en la que desee capturar el evento Cambio previo.

  2. En la ficha Tabla, en el grupo Eventos anteriores, haga clic en Cambio previo.

  3. Seleccione el código en el ejemplo de código siguiente y presione CTRL+C para copiarlo en el Portapapeles.

  4. Active la ventana del diseñador de macros y presione 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>

En el ejemplo siguiente se muestra cómo usar la acción RaiseError para cancelar el evento de macro de datos Antes de cambiar. Cuando se actualiza el campo AssignedTo, se usa un bloque de datos LookupRecord para determinar si el técnico asignado está asignado actualmente a una solicitud de servicio abierta. Si esto es true, el evento Antes de cambiar se cancela y el registro no se actualiza.

Código de ejemplo proporcionado por la Referencia del programador de 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