アクション コミット フック例

コミット フックは、レコードがデータベースにコミットされる前に、追加アクションを実行します。

以下の例は、障害に重複 (dups) があるかどうかを確認します。オリジナルの障害がテスト済み とマークされている場合、フックにより重複が dupdone とマークされ、修正されていることを検証するために再評価する必要があることを示します。これらの更新のコミットに失敗すると、このフックが組み込まれているデータベース トランザクションを含め、すべてのデータベース トランザクションがロール バックされます。
注: 検証または通知フックで、追加アクションを実行することもできます。Validate および Commit メソッドを呼び出す場合は、コードで例外および戻りメッセージ文字列を必ず確認します。この項の例に、エラーおよび例外の処理の例を示します。「エラー チェックと検証」を参照してください。また、Entity オブジェクトの IsEditable メソッドを使用すると、EditEntry アクションで更新されたレコードを検証できます。EditEntry アクションが失敗した場合、例外処理の一部としてコミット操作を元に戻す必要がある場合があります。ただし、必ずしもすべての検証の失敗について、元に戻す必要があるとは限りません。Revert メソッドの呼び出しは、コミットの成功後は機能しません。これは、Entity が既にデータベースにコミット済みであるために、操作が通知後警告を戻した場合でも同様です。

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
            }
    }
   } 
}

フィードバック