Use the following action hook along with parent/child linking to create a state-based relationship between a parent record and its children. This hook moves the parent record to the next state if all the children are in that state.
Dim SessionObj
Dim ParentID
' Dimension variables that hold objects
Dim ParentObj
Dim ChildRefList
Dim ChildArray
Dim ChildID
Dim DefectChildEntityObj
Dim StateStatus
Dim SameState
Dim CurrentState
Dim ActionJustPerformed
Dim RetValue
set SessionObj = GetSession
ThisID = GetDisplayName
ActionJustPerformed = GetActionName
SessionObj.OutputDebugString "action is: "& ActionJustPerformed & vbCrLf
StateStatus = ""
SameState = 0
SessionObj.OutputDebugString "current db id is: " & ThisID & vbCrLf
ParentID = GetFieldValue("parent").GetValue()
SessionObj.OutputDebugString "parent id is: " & ParentID & vbCrLf
if ParentID <> "" then
set ParentObj=SessionObj.GetEntity("defect", parent_id)
' you can also call the GetValueAsList method instead of
' calling GetValue and using the split utility
ChildRefList=ParentObj.GetFieldValue("children").GetValue
ChildArray= split (ChildRefList, vbLf)
For Each ChildID In ChildArray
set DefectChildEntityObj=SessionObj.GetEntity("Defect", ChildID)
CurrentState=DefectChildEntityObj.GetFieldValue ("State").GetValue
SessionObj.OutputDebugString "StateStatus is: " & StateStatus & vbCrLf
SessionObj.OutputDebugString "CurrentState is: " & CurrentState &vbCrLf
SessionObj.OutputDebugString "SameState is: " & SameState & vbCrLf
if StateStatus = "" then
StateStatus = CurrentState
SameState = 1
SessionObj.OutputDebugString "coming to statestatus is null" & vbCrLf
elseif StateStatus = CurrentState then
SessionObj.OutputDebugString "coming to same state" & vbCrLf
SameState = 1
else
SessionObj.OutputDebugString "states are different" & vbCrLf
SameState = 0
end if
Next
if SameState = 1 then
SessionObj.OutputDebugString "samestate=1, setting parent state"
& vbCrLf
SessionObj.EditEntity ParentObj, ActionJustPerformed
status = ParentObj.Validate
if (status <> "") then
SessionObj.OutputDebugString "error when updating parent state: "_
& status & vbCrLf
ParentObj.Revert
exit sub
end if
ParentObj.Commit
end if
end if
$SessionObj=$entity->GetSession();
$ThisID=$entity->GetDisplayName();
$ActionJustPerformed=$entity->GetActionName();
$ParentID=$entity->GetFieldValue("parent1")->GetValue();
$StateStatus="";
$SameState=0;
# Rational ClearQuest has a message monitor to display
# Rational ClearQuest messages and your messages
$SessionObj->OutputDebugString ("perl current db id is: $ThisID\n");
$SessionObj->OutputDebugString ("perl parent id is: $parent_id\n");
if ($ParentID ne "") {
$ParentObj = $SessionObj->GetEntity("defect", $ParentID);
# you can also call the GetValueAsList method instead of
# calling GetValue and using the split utility
$ChildRefList=$ParentObj->GetFieldValue("children")->GetValue();
$SessionObj->OutputDebugString ("children are: $ChildRefList\n");
@ChildArray = split (/\n/,$ChildRefList);
foreach $ChildID (@ChildArray) {
$DefectChildEntityObj = $SessionObj->GetEntity("defect", $ChildID);
$CurrentState=$DefectChildEntityObj->GetFieldValue("State")->
GetValue();
$SessionObj->OutputDebugString("perl StateStatus is: $StateStatus\n");
$SessionObj->OutputDebugString("perl Current Status is:
$CurrentStatus\n");
$SessionObj->OutputDebugString("perl SameState is: $SameState\n");
if ($StateStatus eq "") {
$StateStatus = $CurrentState;
$SameState = 1;
$SessionObj->OutputDebugString("coming to statestatus is null\n");
} elsif ($StateStatus eq $CurrentState) {
SessionObj->OutputDebugString ("coming to same state\n");
$SameState = 1;
} else {
$SessionObj->OutputDebugString("states are different\n");
$SameState = 0;
} #nested if statements
} #End foreach Loop
if ($SameState == 1) {
$SessionObj->OutputDebugString("samestate = 1, setting parent
state \n");
$SessionObj->EditEntity($ParentObj, $ActionJustPerformed);
$status = $ParentObj->Validate();
if ($status ne "") {
$SessionObj->OutputDebugString ("error when updating parent state:
$status\n");
$ParentObj->Revert();
return -1; # Exit
}
$ParentObj->Commit();
} #end if for ($SameState == 1)
} #end if for ($ParentID ne "")