Commit hooks perform additional actions before a record is committed to the database.
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
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
}
}
}
}