Ejemplo de enganche de confirmación de acción

Los enganches de confirmación realizan acciones adicionales antes de confirmar un registro en la base de datos.

En el ejemplo siguiente se comprueba si un defecto tiene duplicados ("dups"). Si el defecto original se ha marcado como "tested", el enganche marca los duplicados como "dupdone", para indicar que se deben volver a evaluar para verificar si se han arreglado. Si se produce una anomalía al confirmar una de las actualizaciones, se retrotraen todas las transacciones de la base de datos, incluida aquella a la que pertenece este enganche.
Nota: También puede llevar a cabo acciones adicionales en un enganche de validación o notificación. Cuando llame a los métodos Validate y Commit, asegúrese de que el código compruebe las excepciones y devuelva series de mensajes. En esta sección se proporcionan ejemplos de manejo de errores y excepciones. Consulte el apartado Comprobación y validación de errores para obtener más información. Además, tenga en cuenta que puede utilizar el método IsEditable del objeto Entity para determinar si debe revertir la operación de confirmación como parte del manejo de excepciones. Es posible que no desee revertir todas las anomalías de validación. La llamada al método Revert no funciona después de una confirmación satisfactoria (aunque devuelva un aviso de posnotificación debido a que la entidad ya se ha confirmado en la base de datos).

VBScript

Sub swbug_Commit(actionname, actiontype)

    ' actionname As String

    ' actiontype As Long

    ' acción = comprobada

    Dim dups  ' Matriz de todos los duplicados directos de este defecto

    Dim dupsvar ' Variant que contiene el enlace a un duplicado

    Dim dupsobj ' El mismo enlace, pero como un objeto en lugar de como una variante

    Dim record  ' El registro extraído del enlace

    Dim  session

    Dim parent_id ' El nombre de visualización de este defecto

    Dim RetVal

    ' Hacer que una API llame para verificar si este registro tiene duplicados

    If HasDuplicates() Then

      Set session = GetSession

      dups = GetDuplicates

      parent_id = GetDisplayName

      For Each dupvar In dups

        Set dupobj = dupvar

        Set entity = dupobj.GetChildEntity

        session.EditEntity entity, "dupdone"

      entity.SetFieldValue "action_reason", "Original " & parent_id & " is tested"

' validar y confirmar, con manejo de errores y excepciones
On Error Resume Next
Err.Clear
 'RetVal está vacío si es satisfactorio y, de lo contrario, mantiene una cadena
 'de caracteres de mensaje de error de la anomalía
RetVal = entity.Validate  
if  Err.Number <> 0  then       
    ' Se ha producido una excepción
    ' Err.description mantiene el mensaje de error 
    ' Este ejemplo imprime los detalles del error y revierte el registro a
    ' su estado anterior.
     StdOut "Validation exception:" & vbCrLf &_
        "    Error number: " & Err.Number & vbCrLf &_
        "    Error description: '" & Err.Description & vbCrLf
     entity.Revert  

elseif RetVal <> "" then  
    ' Se ha devuelto una serie de mensaje de error que indica
    ' que la validación 
    ha dado error, posiblemente debido a que los valores
    ' de uno o más campos no son correctos. Puede
    intentar resolver el problema
    ' al determinar qué campos
    tienen valores incorrectos, proporcionarles
    ' valores adecuados y volver a intentar
    llamar a entity.Validate. Este
    ' ejemplo de código imprime los detalles
    del error y, a continuación,
    ' revierte el registro a su estado original.
    StdOut "Validation error: " & RetVal & vbCrLf  
    entity.Revert

else 
    ' La validación ha sido satisfactoria. Puede continuar y confirmar el
    ' cambio.
    StdOut "Validation was successful." & vbCrLf                     
    Err.Clear
    RetVal = entity.Commit  
    if  Err.Number <> 0  then       
        ' Se ha producido una excepción (indica que se ha producido un
        ' error antes de
        escribir los valores en la base de datos). ' Este código de ejemplo imprime los
        detalles del error y
        ' revierte el registro a su estado anterior.
        StdOut "Commit exception:" & vbCrLf &_
            "    Error number: " & Err.Number & vbCrLf &_
            "    Error description: '" & Err.Description & vbCrLf
        entity.Revert

    elseif RetVal <> "" then 
        ' Se ha devuelto un valor de serie de mensaje de
        ' error. Indica que 
        se ha producido un error después de escribir
        ' los valores en la base de datos (por 
        ejemplo, una anomalía en
        ' un enganche de notificación de acción). Puede manejar 
        el error
        ' al corregir la anomalía e intentar volverlo a confirmar o 
        ' revertir. Este código de ejemplo imprime los detalles del mensaje
        ' de error.
        StdOut "Commit error (after committing changes): " & RetVal & vbCrLf

    else
        ' No se devuelve ninguna excepción o valor de mensaje de error
        StdOut "Commit was successful." & vbCrLf
    end if   
end if 

' Borrar el manejador de errores
Err.Clear

      Next
    end if
End Sub

Perl

sub swbug_Commit {

    my($actionname, $actiontype) = @_;

    # $actionname As string scalar

    # $actiontype as long scalar

    # action is Submit

    # Este enganche se lanza durante el paso de "confirmación" de una

    # actualización de entidad. Es la ubicación adecuada para poner una

    # actividad que se deba empaquetar en la misma

    # transacción que la confirmación, por ejemplo, subacciones

    # o actualizaciones de almacenamiento de datos externos.

    my ($RetVal);

    my ($dups, # Matriz de todos los duplicados directos de este defecto

    $record,   # El registro extraído del enlace

    $parent_id, # El nombre de visualización de este defecto 

    $session,

    $locEntity,

    $dupobj

    );

    # Hacer que una API llame para verificar si este registro tiene duplicados

    if ($entity->HasDuplicates()) {

      $session=$entity->GetSession();

      $dups = $entity->GetDuplicates();

      $parent_id = $entity->GetDisplayName();

   my $count = $dups->Count();

   my $i = 0;

   for (i=0;$i<$count;$i++){

      $dupobj = $dups->Item($i);

      $locEntity = $dupobj->GetChildEntity();

      $session->EditEntity($locEntity, "dupdone");

      $locEntity->SetFieldValue("action_reason", "Original " 
            . $parent_id . " is tested");

# validar y confirmar, con manejo de errores y excepciones

      eval {$RetVal = $locEntity->Validate(); };
      if ($@){
	print "Exception: '$@'\n";
	$locEntity->Revert();
	    }
      elsif ($RetVal ne "") { 
         	 $session->OutputDebugString ("validation error: $RetVal\n"); 
	          # corregir las validaciones anómalas e intentar volver a validar
           # o revertir
          	   }    
      else {
            eval {$RetVal = $locEntity->Commit(); };         
            if ($@){
	          print "Exception: '$@'\n";
	          $locEntity->Revert();
                          }
            elsif ($RetVal ne "") { 
          			$session->OutputDebugString ("commit error: $RetVal\n"); 
			         # manejo de error - corregir las validaciones anómalas y volverlo
            # a intentar o revertir  
                }
		        # confirmación satisfactoria			
            }

    }
   } 
}


Comentarios