Esempio di hook di commit di azione

Gli hook di commit effettuano ulteriori azioni prima che venga eseguito il commit di un record sul database.

Il seguente esempio verifica se un difetto dispone di duplicati (dups). Nel caso in cui il difetto originale sia stato contrassegnato come tested, l'hook contrassegna i duplicati come dupdone, indicando che dovrebbero essere valutati nuovamente per verificare che siano stati corretti. Se si verifica un errore nell'esecuzione del commit di uno di questi aggiornamenti, tutte le transazioni del database vengono annullate, compresa quella a cui appartiene questo hook.
Nota: è inoltre possibile effettuare ulteriori azioni in un hook di convalida o di notifica. Quando si richiamano i metodi Validate e Commit, assicurarsi che il codice esamini la presenza di eccezioni e stringhe di messaggi di ritorno. In questa sezione vengono forniti esempi di gestione di errori ed eccezioni. Consultare Verifica errori e convalida. È inoltre possibile utilizzare il metodo IsEditable dell'oggetto Entity per convalidare i record aggiornati con un'azione EditEntry. Se l'azione EditEntry ha esito negativo, potrebbe essere necessario ripristinare l'operazione di commit per la gestione dell'eccezione. Tuttavia, l'utente potrebbe desiderare di non ripristinare tutti gli errori di convalida. Il richiamo del metodo Revert non funziona dopo aver eseguito il commit con esito positivo, anche nel caso in cui restituisca un avviso post-notifica, poiché è già stato eseguito il commit di Entity sul database.

VBScript

Sub swbug_Commit(actionname, actiontype)

    ' actionname As String
    ' actiontype As Long
    ' action = tested
    Dim dups  ' Array of all direct duplicates of this defect
    Dim dupsvar ' Variant containing link to a duplicate
    Dim dupsobj ' The same link, but as an object rather than a variant
    Dim record  ' The record extracted from the link
    Dim session
    Dim parent_id ' The display name of this defect
    Dim RetVal

    ' Make an API to call to see if this record has duplicates
    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"

       ' validate and commit, with exception and error handling
       On Error Resume Next
       Err.Clear
       'RetVal is empty on success else it holds an error message string on failure
       RetVal = entity.Validate  
       if Err.Number <> 0  then       
      ' An exception occurred
      ' Err.description holds the error message 
      ' This example prints the error details and reverts the record to
      ' its previous state.
       StdOut "Validation exception:" & vbCrLf &_
        "    Error number: " & Err.Number & vbCrLf &_
        "    Error description: '" & Err.Description & vbCrLf
     entity.Revert  

elseif RetVal <> "" then  
    ' An error message string was returned.indicating that validation failed, 
    ' possibly due to one or more fields having unacceptable values. You can
    ' attempt to resolve this problem by determining which fields
    ' have unacceptable values, give them acceptable values, and retry the
    ' call to entity.Validate. This code example prints the error
    ' details and then reverts the record to its original state.
    StdOut "Validation error: " & RetVal & vbCrLf  
    entity.Revert

else 
    ' Validate was successful. You can proceed and Commit the change.
    StdOut "Validation was successful." & vbCrLf   
    Err.Clear
    RetVal = entity.Commit  
    if  Err.Number <> 0  then       
        ' An exception occurred (this indicates that an error occurred before
        ' the values were written to the database). This example code prints the
        ' error details and reverts the record to its previous state.
        StdOut "Commit exception:" & vbCrLf &_
            "    Error number: " & Err.Number & vbCrLf &_
            "    Error description: '" & Err.Description & vbCrLf
        entity.Revert

    elseif RetVal <> "" then 
        ' An error message string value was returned. This indicates that an 
        ' error occurred after the values were written to the database (for 
        ' example, a failure in an action notification hook). You can handle 
        ' the error by correcting the failure and trying  to commit again or 
        ' revert. This example code prints the error message details.
        StdOut "Commit error (after committing changes): " & RetVal & vbCrLf

    else
        ' No exception or returned error message value
        StdOut "Commit was successful." & vbCrLf
    end if   
end if 

' Clear the error handler
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
    # This hook is fired during the "commit" step of an
    # entity update. It is the appropriate place to put an
    # activity which should be bundled into the same
    # transaction as the commit, such as subactions
    # or updates of external data storage.

    my ($RetVal);
    my ($dups, # Array of all direct duplicates of this defect
    $record,   # The record extracted from the link
    $parent_id, # The display name of this defect 
    $session,
    $locEntity,
    $dupobj
    );

    # Make an API to call to see if this record has duplicates
    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");

    # validate and commit, with exception and error handling
      eval {$RetVal = $locEntity->Validate(); };
      if ($@){
           print "Exception: '$@'\n";
           $locEntity->Revert();
      }
      elsif ($RetVal ne "") { 
          $session->OutputDebugString ("validation error: $RetVal\n"); 
          # correct whatever failed validation and then try validate again or revert
          }    
      else {
            eval {$RetVal = $locEntity->Commit(); }; 
            if ($@){
                    print "Exception: '$@'\n";
                    $locEntity->Revert();
                     }
            elsif ($RetVal ne "") { 
            $session->OutputDebugString ("commit error: $RetVal\n"); 
            # handle error - correct whatever failed and try again or revert  
                }
        # commit successful
            }
    }
   } 
}

Feedback