Showing changes to an Entity (record) object

The following example illustrates how to use the Rational® ClearQuest® API to get information about field values before and after the user has updated a record. This example is structured as a global hook that can be called from any other hook, such as from the ACTION_COMMIT hook.

VBScript

REM Start of Global Script ShowOldNewValues

REM TODO -- put your script code here


Sub ShowOldNewValues (actionname, hookname)

   Dim fieldnames
   Dim FN
   Dim OldFV
   Dim FieldValueStatus
   Dim FieldInfo
   Dim i
   Dim NewFV
   Dim FieldType
   Dim is_short

   M = "'" & actionname & "' action's " & hookname & " script (VB" & _

   "version):" & VBCrLf & VBCrLf

   ' Get a list of the fields in this record type...

   fieldnames = GetFieldNames



   ' Loop through the fields, showing name, type, old/new value...

   if IsArray(fieldnames) Then

      i = LBound(fieldnames)

      Do While i <= UBound(fieldnames)

         FN = fieldnames(i)

         M = M & FN & ":"



         ' Get the field's original value...

         set FieldInfo = GetFieldOriginalValue(FN)

         FieldValueStatus = FieldInfo.GetValueStatus()

         If FieldValueStatus = AD_HAS_NO_VALUE Then

            OldFV = "<no value>"

         ElseIf FieldValueStatus = AD_VALUE_NOT_AVAILABLE Then

            OldFV = "<value not available>"

         ElseIf FieldValueStatus = AD_HAS_VALUE Then

            OldFV = FieldInfo.GetValue()

         Else

            OldFV = "<Invalid value status: " & FieldValueStatus & ">"

         End If



         ' Get the current value (it may have been updated during
         ' this action)...

         set FieldInfo = GetFieldValue(FN)

         FieldValueStatus = FieldInfo.GetValueStatus()

         If FieldValueStatus = AD_HAS_NO_VALUE Then

            NewFV = "<no value>"

         ElseIf FieldValueStatus = AD_VALUE_NOT_AVAILABLE Then

            NewFV = "<value not available>"

         ElseIf FieldValueStatus = AD_HAS_VALUE Then

            NewFV = FieldInfo.GetValue()

         Else

            NewFV = "<Invalid value status: " & FieldValueStatus & ">"

         End If



         ' Get and reformat the field's type...

         FieldType = FieldInfo.GetType()

         is_short = 1

         If FieldType = AD_SHORT_STRING Then

            FieldType = "Short String"

         ElseIf FieldType = AD_MULTILINE_STRING Then

            FieldType = "Multiline String"

            is_short = 0

         ElseIf FieldType = AD_INT Then

            FieldType = "Integer"

         ElseIf FieldType = AD_DATE_TIME Then

            FieldType = "Date time"

         ElseIf FieldType = AD_REFERENCE Then

            FieldType = "Reference"

         ElseIf FieldType = AD_REFERENCE_LIST Then

            FieldType = "Reference List"

            is_short = 0

         ElseIf FieldType = AD_ATTACHMENT_LIST Then

            FieldType = "Attachment List"

            is_short = 0

         ElseIf FieldType = AD_ID Then

            FieldType = "ID"

         ElseIf FieldType = AD_STATE Then

            FieldType = "State"

         ElseIf FieldType = AD_JOURNAL Then

            FieldType = "Journal"

            is_short = 0

         ElseIf FieldType = AD_DBID Then

            FieldType = "DBID"

         ElseIf FieldType = AD_STATETYPE Then

            FieldType = "STATETYPE"

         ElseIf FieldType = AD_RECORDTYPE Then

            FieldType = "RECORDTYPE"

         Else

            FieldType = "<UNKNOWN TYPE: " & FieldType & ">"

            is_short = 0

         End IF

         M = M & "  Type=" & FieldType & "."



         ' Display the results. For the purposes of this example,
          ' the following values are shown:

         ' 1. Identify whether the field's value has changed or
         '     not during the current action and indicate that in 
         '     the output.
         ' 2. For single-line fields (integer, short_string, etc.)
         '     show the field's value.

         ' 3. For single-line fields whose values have changed
         '    during the current action, show the old and the new
         '     values.

         If OldFV = NewFV Then

            M = M & " Value is unchanged."

            If is_short = 1 Then

               M = M & " Value='" & OldFV & "'"

            End If

         Else

            M = M & " Value has changed."

            If is_short = 1 Then

               M = M & " Old value='" & OldFV & "' New value='" & _

                      NewFV & "'"

            End If

         End If

         M = M & VBCrLf

         i = i + 1

      Loop

   Else

      M = M & "fieldnames is not an array" & VBCrLf

   End If

   ' At this point you could write this information to a file,
   ' present it in a message box, or write it to the debug window
   ' using the session.OutputDebugString() method. Here, is used
   ' the Windows 'MsgBox' API to present the results to the user
   ' in a message box (note this only works for the first 1024
   ' characters of "M" due to limitations in the Windows MsgBox
   ' API...)
   MsgBox M

End Sub

REM End of Global Script ShowOldNewValues 

Perl

# Start of Global Script ShowOldNewValues

# ShowOldNewValues: Show field values in the current 
# record, drawing attention to fields whose values have changed 
# during the current action.

sub ShowOldNewValues {

   # $actionname as string

   # $hookname as string

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

   my($M) = "'".$actionname."' action's ".$hookname." script (Perl 
      version):\n\n";

   # Get a list of the fields in this record type

   # (NOTE: GetFieldNames() returns a *REFERENCE* to an array)...

   my($FieldNamesRef) = $entity->GetFieldNames();



   # Loop through the fields, showing name, type, old/new value...

   foreach $FN (@$FieldNamesRef) {

      $M .= $FN . ":"; # Show the field name...



      # Get the field's original value...

      $FieldInfo = $entity->GetFieldOriginalValue($FN);

      $FieldValueStatus = $FieldInfo->GetValueStatus();

      if ($FieldValueStatus == $CQPerlExt::CQ_HAS_NO_VALUE) {

         $OldFV = "<no value>";

      } elsif ($FieldValueStatus == 
                        $CQPerlExt::CQ_VALUE_NOT_AVAILABLE) {

         $OldFV = "<value not available>";

      } elsif ($FieldValueStatus == $CQPerlExt::CQ_HAS_VALUE) {

         $OldFV = $FieldInfo->GetValue();

      } else {

         $OldFV = "<Invalid value status: 
                  " . $FieldValueStatus . ">";

      }



      # Get the current value (may have been updated during this
      # action)...

      $FieldInfo = $entity->GetFieldValue($FN);

      $FieldValueStatus = $FieldInfo->GetValueStatus();

      if ($FieldValueStatus == $CQPerlExt::CQ_HAS_NO_VALUE) {

         $NewFV = "<no value>";

      } elsif ($FieldValueStatus ==
                $CQPerlExt::CQ_VALUE_NOT_AVAILABLE) {

         $NewFV = "<value not available>";

      } elsif ($FieldValueStatus == $CQPerlExt::CQ_HAS_VALUE) {

         $NewFV = $FieldInfo->GetValue();

      } else {

         $NewFV = "<Invalid value status: 
               " . $FieldValueStatus .  ">";

      }



      # Get and reformat the field's type...

      $FieldType = $FieldInfo->GetType();

      $is_short = 1;

      if ($FieldType == $CQPerlExt::CQ_SHORT_STRING) {

         $FieldType = "Short String";

      } elsif ($FieldType == $CQPerlExt::CQ_MULTILINE_STRING) {

         $FieldType = "Multiline String";

         $is_short = 0;

      } elsif ($FieldType == $CQPerlExt::CQ_INT) {

         $FieldType = "Integer";

      } elsif ($FieldType == $CQPerlExt::CQ_DATE_TIME) {

         $FieldType = "Date Time";

      } elsif ($FieldType == $CQPerlExt::CQ_REFERENCE) {

         $FieldType = "Reference";

      } elsif ($FieldType == $CQPerlExt::CQ_REFERENCE_LIST) {

         $FieldType = "Reference List";

         $is_short = 0;

      } elsif ($FieldType == $CQPerlExt::CQ_ATTACHMENT_LIST) {

         $FieldType = "Attachment List";

         $is_short = 0;

      } elsif ($FieldType == $CQPerlExt::CQ_ID) {

         $FieldType = "ID";

      } elsif ($FieldType == $CQPerlExt::CQ_STATE) {

         $FieldType = "State";

      } elsif ($FieldType == $CQPerlExt::CQ_JOURNAL) {

         $FieldType = "Journal";

         $is_short = 0;

      } elsif ($FieldType == $CQPerlExt::CQ_DBID) {

         $FieldType = "DBID";

      } elsif ($FieldType == $CQPerlExt::CQ_STATETYPE) {

         $FieldType = "STATETYPE";

      } elsif ($FieldType == $CQPerlExt::CQ_RECORDTYPE) {

         $FieldType = "RECORDTYPE";

      } else {

         $FieldType = "<UNKNOWN TYPE: " . $FieldType . ">";

         $is_short = 0;

      }

      $M .= " Type=" . $FieldType . ".";



      # Display the results. For the purposes of this example, we
      # show values as follows:

      # 1. Identify whether the field's value has changed or not
      #     during the current action and indicate that in the
      #     output.

      # 2. For single-line fields (integer, short_string, etc.)
      #    show the field's value.

      # 3. For single-line fields whose values have changed during
      #    the current action, show the old and the new values.


      if ($OldFV eq $NewFV) {

         $M .= " Value is unchanged.";

         if ($is_short) {

            $M .= "  Value='".$OldFV."'";

         }

      } else {

         $M .= " Value has changed.";

         if ($is_short) {

            $M .= " Old value='".$OldFV."' New
               value='".$NewFV."'";

         }

      }

      $M .= "\n";

   }

   $M .= "\n'".$actionname."' action's notification script
          (Perl version) exiting.\n";



   # At this point you could write this information to a file,
   # present it in a message box, or write it to the debug window
   # using $session->OutputDebugString().

   # Here is called a subroutine 'DBGOUT' which writes the message
   # out to a file and invokes 'Notepad' on it...

   DBGOUT($M);

}

# End of Global Script ShowOldNewValues



# Start of Global Script DBGOUT

sub DBGOUT {

   my($Msg) = shift;

   my($FN) = $ENV{'TEMP'}.'\STDOUT.txt';

   open(DBG, ">>$FN") || die "Failed to open $FN";

   print DBG ($Msg);

   close(DBG);

   system("notepad $FN");

   system("del $FN");

}

# End of Global Script DBGOUT 

Feedback