How To Build Custom Triggers

  • KM00960959
  • 28-May-2014
  • 12-Apr-2021

Summary

How To Build Custom Triggers

Question

Service Manager provides triggers that can be used for a variety of purposes. This documents shows various sample custom triggers for Service Manager. 

Answer

1. Trigger type
 . 1 - Before Add - When adding a new record to this file, launch the application prior to committing the addition.
 . 2 - After Add - When adding a new record to this file, launch the application after committing the addition.
 . 3 - Before Update - When modifying a record in this file, launch the application prior to committing the change.
 . 4 - After Update - When modifying a record in this file, launch the application after committing the change.
 . 5 - Before Delete - When deleting a record in this file, launch the application prior to performing the deletion.
 . 6 - After Delete - When deleting a record in this file, launch the application after performing the deletion

2. Naming custom triggers
 - trigger runs by name order.
   It is better to have name starting by 'z_xxxx' if wish to run lastly.
   It is better to have name starting by 'A_xxxx' if wish to run firstly.
   This is because 'A' is first character and 'z' is last character in ASCII code.

3. File variables for each trigger type in Java Script
 - add, delete trigger : record
 - update trigger    : record, oldrecord
   . record     // updated information
   . oldrecord  // previous information before update

4. Basic Java Script
 - all columns' value of current record
  record
 - one of columns' value in current record
  record[brief_description]     // recommend, always working
  record.brief_description       // record.class makes issue in testing because class is real column but also reserved word in Java script
 - other variables
  vars.$lo_user_name
 
 
5. Sample triggers

A. monitor file's activity
 1) ex: monitor UPDATE in probsummary file
 2) add custom trigger in triggers file
  - Trigger Name: probsummary_before_update   // anyname
  - Table Name: probsummary
  - Trigger Type: 3 - Before Update
  - Application :
  - Script :
  print("### trigger execution: probusmmary_before_update (messagebox)");
  vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
         "### trigger execution: probusmmary_before_update (sm.log)", "NULL");
  > click 'save' then click 'compile'
 3) search any IM ticket and then update it
  - in message box,
    ### trigger execution: probusmmary_before_update (messagebox)    
  - in sm.log
    3904(  3724) 10/01/2013 10:58:42  RAD I ### trigger execution: probusmmary_before_update (sm.log)
  --> this message is shown even though no debugging options in sm.ini
 
B. mointor file's value by trigger
  - add logics into trigger, probsummary_before_update
  print("### updated record:" + record );
  vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
          "### updated record:" + record , "NULL");
  - in message box,
   ### updated record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '09/30/13 20:41:00', "Network", , , , "updat
   ed", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can’t find it"}, {}, {}, {}, {}, , , , , , , , 1
   , true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):", "te
   st", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "test",
    "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "Webmail l
   ogin failure", , , , , , , , , "Jurr.Fleijs", "SD10002", , , '09/30/13 20:41:00', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 1
   68, , , , , , , 23, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {},
    , , , , , , , , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '09/30/13 20:35:28', , , , ,
    "dept", , , {}, , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 10, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Web
   mail (North America)", , , {}, , , , , , , , {}, ]}    
  - in sm.log
    3904(  3724) 10/01/2013 11:41:00  RAD I ### updated record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '09/30/13 20:41:00', "Network", , , , "updated", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can?셳 find it"}, {}, {}, {}, {}, , , , , , , , 1, true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):", "test", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "test", "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "Webmail login failure", , , , , , , , , "Jurr.Fleijs", "SD10002", , , '09/30/13 20:41:00', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 168, , , , , , , 23, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {}, , , , , , , , , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '09/30/13 20:35:28', , , , , "dept", , , {}, , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 10, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Webmail (North America)", , , {}, , , , , , , , {}, ]}

C. monitor file's value by trigger ( before/after update )
   - add logics into trigger, probsummary_before_update
     print("### old record:" + oldrecord);
     vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
           "### old record:" + oldrecord, "NULL");

     print("### new record:" + record);
     vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
           "### new record:" + record, "NULL");

  - in message box,
     ### new record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '10/01/13 01:30:51', "Network", , , , "up
     dated", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can’t find it"}, {}, {}, {}, {}, , , , , , ,
     , 1, true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):",
     "test", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "tes
     t", "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "new",
     , , , , , , , , "Jurr.Fleijs", "SD10002", , , '10/01/13 01:30:51', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 168, , , , , , ,
      29, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {}, , , , , , , ,
     , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '10/01/13 01:30:35', , , , , "dept", , , {}
     , , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 16, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Webmail (North Ame
     rica)", , , {}, , , , , , , , {}, ]}
     ### old record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '10/01/13 01:30:35', "Network", , , , "up
     dated", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can’t find it"}, {}, {}, {}, {}, , , , , , ,
     , 1, true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):",
     "test", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "tes
     t", "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "old",
     , , , , , , , , "Jurr.Fleijs", "SD10002", , , '10/01/13 01:30:35', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 168, , , , , , ,
      28, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {}, , , , , , , ,
     , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '09/30/13 21:04:37', , , , , "dept", , , {}
     , , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 15, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Webmail (North Ame
     rica)", , , {}, , , , , , , , {}, ]}   
   - in sm.log
     3904(   496) 10/01/2013 16:30:51  RAD I ### old record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '10/01/13 01:30:35', "Network", , , , "updated", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can?셳 find it"}, {}, {}, {}, {}, , , , , , , , 1, true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):", "test", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "test", "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "old", , , , , , , , , "Jurr.Fleijs", "SD10002", , , '10/01/13 01:30:35', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 168, , , , , , , 28, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {}, , , , , , , , , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '09/30/13 21:04:37', , , , , "dept", , , {}, , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 15, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Webmail (North America)", , , {}, , , , , , , , {}, ]}
     3904(   496) 10/01/2013 16:30:52  RAD I ### new record:[C++ object Datum] - probsummary={["IM10002", "incident", '09/02/07 01:51:00', "Jurr.Fleijs", "2", "3", '10/01/13 01:30:35', "Network", , , , "updated", , , , , , , , , , , , , , , , , , "adv-nam-server-mail", , , , , , , , {"Webmail can't be reached, browser can?셳 find it"}, {}, {}, {}, {}, , , , , , , , 1, true, , '09/02/07 01:44:00', "Incident.Analyst", , , , , , {"08/04/08 12:54:14 US/Mountain (falcon):", "test", "07/23/08 17:44:03 US/Mountain (prietke):", "test", "07/23/08 16:24:22 US/Mountain (prietke):", "test", "07/23/08 14:45:54 US/Mountain (prietke):", "test", "07/23/08 13:04:15 US/Mountain (prietke):", "test", "04/23/08 23:24:17 US/Mountain (falcon):", "yo yo"}, "falcon", "IM.update.incident", 0, , , , , , , , , , , , , , , {}, {}, , , , , "advantage", , , "old", , , , , , , , , "Jurr.Fleijs", "SD10002", , , '10/01/13 01:30:35', "falcon", "Work In Progress", {}, , "Investigation", , "failure", , , false, 168, , , , , , , 28, "falcon", , , , , , , , , , , false, , , , false, "function or feature not working", "incident", , false, , , , , false, , , {}, {}, {}, {}, , , , , , , , , , , , {}, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "advantage/North America", '09/30/13 21:04:37', , , , , "dept", , , {}, , , , , , , , , , {{[, , , ]}}, {{[, , , , ]}}, true, , {}, , 15, , , , , , , , , true, , false, false, "2", , , {}, {168}, , , , "E-mail / Webmail (North America)", , , {}, , , , , , , , {}, ]}

D. replace value when any condition
   - add logics into trigger, probsummary_before_update
     print("### brief.description(old):" +  oldrecord.brief_description );
     print("### brief.description(new):" +  record.brief_description );

     // below code is also valid in "4- After Update" trigger type
     if( record.brief_description=="new" ) record.brief_description="new -> detect it";

   - when saving as brief.description="test" in the form then, it is saved as brief.description="test" in the sm system(db)
   - when saving as brief.description="new" in the form then,
      it is saved as brief_description="new -> detect it" in the sm system(db) because of trigger, probsummary_before_update

E. monitor deleting
 - tracking deletion of Todo file
 - custom trigger
  . Trigger Name : Todo_After_Delete
  . Table Name   : Todo
  . Trigger Type : 6 - After Delete
  . Applicatin   :
  . Script       :
    vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
    "### HP Support Todo delete: ID(" + record.record_id + ") username("+ vars.$lo_user_name + ")", "NULL");
    vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
    "### HP Support Todo delete(record):" + record, "NULL");
 - sm.log when deleting a record of Todo file
  3904(  3296) 10/04/2013 11:29:18  RAD I ### HP Support Todo delete: ID(C10001) username(falcon)
  3904(  3296) 10/04/2013 11:29:18  RAD I ### HP Support Todo delete(record):[C++ object Datum] - Todo={["C10001", "cm3r", "closed", "Printer memory upgrade", "Office Supplies (North America)", , , "3", "3", '10/08/13 00:00:00', , ]}

F. monitor updating
 - tracking updates of TodoMap file
 - custom trigger
  . Trigger Name : TodoMap_After_Update
  . Table Name   : TodoMap
  . Trigger Type : 4 - After Update
  . Applicatin   :
  . Script       :
     vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
          "### HP Support TodoMap update       : Table Name(" + record.name + ") username("+ vars.$lo_user_name + ")", "NULL");
     vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
           "### HP Support TodoMap update (old):" + oldrecord, "NULL");
     vars.$L_void=system.functions.rtecall("log",vars.$L_rc,
           "### HP Support TodoMap update (new):" + record, "NULL");
 - sm.log when deleting a record of Todo file
  3904(  4144) 10/04/2013 11:23:48  RAD I ### HP Support TodoMap update       : Table Name(incidents) username(falcon)
  3904(  4144) 10/04/2013 11:23:48  RAD I ### HP Support TodoMap update (old):[C++ object Datum] - TodoMap={["incidents", '10/03/13 20:14:02', 2, "falcon", open in $L.file="Closed", {"incident.id", "open", "title", "needed.by.time", "folder", "severity", "priority.code", "assignment,1", "owner.name"}, {"record.id", "status", "description", "target.date", "folder", "urgency", "priority", "group", "assignee"}]}
  3904(  4144) 10/04/2013 11:23:48  RAD I ### HP Support TodoMap update (new):[C++ object Datum] - TodoMap={["incidents", '10/03/13 20:23:48', 3, "falcon", open in $L.file="Closed" and true, {"incident.id", "open", "title", "needed.by.time", "folder", "severity", "priority.code", "assignment,1", "owner.name"}, {"record.id", "status", "description", "target.date", "folder", "urgency", "priority", "group", "assignee"}]}

G. launching multiple linker processes by trigger
 -
KM00911374 , how to launch multiple background process