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 |
|
Flujo de programas |
|
Flujo de programas |
|
Bloque de datos |
|
Acción de datos |
|
Acción de datos |
|
Acción de datos |
|
Acción de datos |
|
Acción de datos |
|
Acción de datos |
Para crear una macro de datos que capture el evento Cambio previo, utilice los pasos siguientes.
Abra la tabla en la que desee capturar el evento Cambio previo.
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.
Abra la tabla en la que desee capturar el evento Cambio previo.
En la ficha Tabla, en el grupo Eventos anteriores, haga clic en Cambio previo.
Seleccione el código en el ejemplo de código siguiente y presione CTRL+C para copiarlo en el Portapapeles.
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]<>"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>
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