Showing changes to an Entity (record) object

The following example illustrates how to use the HCL Compass 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