OK, I've got some examples for you.<br><br>First, let's talk about 
conditions. If your condition is simple, like just a status change, then
 that's all you need. But the moment you want to combine a status change
 with some other info, like a CF value, then you need to specify 
"User-Defined" for the condition.<br>
<br>Below is an example of a condition that checks the value of a CF 
(this is triggered <i>ONLY</i> when this particular CF is changed on a 
ticket):<br><br># Custom Condition<br># Check for CF "Review Process" 
with value of "Review Complete-Approved"<br>
<br>my $trans = $self->TransactionObj;<br>my $ticket = $self->TicketObj;<br><br>





<p class="MsoNormal">if<span>  </span>($trans->Type
eq 'CustomField')</p>

<p class="MsoNormal"><span>    </span>{my $cf = new
RT::CustomField($RT::SystemUser);<span></span></p>



<p class="MsoNormal"><span>     </span>$cf->LoadByName(Queue => $ticket->QueueObj->id,<span></span>Name =>
"Review Process");</p><p class="MsoNormal"><span>     </span>return 0 unless
$cf->id;<span>  </span></p>

<p class="MsoNormal"><span>     </span>if<span>  </span>($trans->Field
 == $cf->id &&</p>

<p class="MsoNormal"><span>         
</span>$trans->NewValue eq "Review Complete-Approved")</p>

<p class="MsoNormal"><span>          </span>{</p>

<p class="MsoNormal"><span>           </span>return 1;</p>

<p class="MsoNormal"><span>          </span>}</p>

<p class="MsoNormal"><span>    </span>}</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">return 0;</p><p class="MsoNormal"><br></p><p class="MsoNormal">Here you'll notice that if this transaction is for 
some other Custom Field, it drops out (return 0:) <i>and then checks</i>
 for the right value of the change.</p><p class="MsoNormal"><br></p>
<p class="MsoNormal">You can apply this 
type of code for any Custom Field. If you need to also check the Ticket 
Status, you can add that. I'd add(check) it up front. No sense checking data 
when the ticket isn't the right status. You can also check the Queue, 
like we discussed before.</p><p class="MsoNormal"><br></p>
<p class="MsoNormal">Now we'll go over 
Custom Actions. There are two types; "Preparation & Cleanup. Where 
to put what?</p><p class="MsoNormal">My 
line of thinking is to use Preparation in almost all cases. Reason, I 
may have other scrips that I want triggered by values I modify. For 
example, if my code is changing the Ticket Status to "resolved", I want 
to do that in the "Prep" area because that WAY RT will be aware of it 
BEFORE it ends the transaction and can trigger another scrip that 
modifies some other Custom Field value. The more I do before RT starts 
cleaning up, the more modified data is available for RT for any cleanup 
work, etc.</p><p class="MsoNormal"><br></p><p class="MsoNormal">Also, in order to ensure that any changes to Custom Fields remain, you want to set your RT_SiteConfig.pm settings to turn on the "TransactionBatch"  option <meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CKFCROC%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><style>
<!--
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-parent:"";
        margin:0in;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:12.0pt;
        font-family:"Times New Roman";
        mso-fareast-font-family:"Times New Roman";}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;
        mso-header-margin:.5in;
        mso-footer-margin:.5in;
        mso-paper-source:0;}
div.Section1
        {page:Section1;}
-->
</style><b style=""><span style="font-size: 12pt; font-family: "Times New Roman";">Set($UseTransactionBatch, '1');</span></b><span style="font-size: 12pt; font-family: "Times New Roman";">.</span></p>

<p class="MsoNormal"><br></p><p class="MsoNormal">So, the next piece of 
code will be Custom Preparation code:</p><p class="MsoNormal"><br></p><p class="MsoNormal">#--------------------------------------------------</p>

<p class="MsoNormal"># Custom action preparation code:</p>

#---------------------------------------------------------------------------<div id=":1rq" class="ii gt"><p class="MsoNormal"># Set the value for the Custom Field "Work-State"</p><p class="MsoNormal"><br></p><p class="MsoNormal">


</p><p class="MsoNormal">my $trans = $self->TransactionObj;</p>

<p class="MsoNormal">my $ticket = $self->TicketObj;</p>

<p class="MsoNormal">my $cf_obj = RT::CustomField->new($RT::SystemUser);</p>

<p class="MsoNormal">my $cf_name = "Work-State";</p>

<p class="MsoNormal">my $cf_value = "Acceptance Testing";</p>

<p class="MsoNormal">my $current =
$ticket->FirstCustomFieldValue('Work-State');</p>

<p class="MsoNormal"><br></p><p class="MsoNormal"># Won't change if 
current value is whatever<br></p><p class="MsoNormal"><br></p>

<p class="MsoNormal">if<span>  </span>($current ne
"In Production - Not Yet Used" &&</p>

<p class="MsoNormal"><span>     </span>$current ne
"In Production - Verification Required" &&</p>

<p class="MsoNormal"><span>     </span>$current ne
"Installing Modifications")</p>

<p class="MsoNormal"><span>    </span>{</p>

<p class="MsoNormal"><span>    
</span>$cf_obj->LoadByName( Name => $cf_name );</p>

<p class="MsoNormal"><span>    
</span>$RT::Logger->debug("Loaded \$cf_obj->Name = ".
$cf_obj->Name() ."\n");</p>

<p class="MsoNormal"><span>    
</span>$ticket->AddCustomFieldValue( Field=>$cf_obj, 
Value=>$cf_value,
RecordTransaction=>0);</p>

<p class="MsoNormal"><span>    </span>}</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal"># set the CF Work-Completed Date (date is in 
mm/dd/yyyy format and needs reformatting)</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">my $cf_name = "Work-Completed Date";</p>

<p class="MsoNormal">my ( undef, undef, undef, $day, $mon, $year ) = 
localtime(
time );</p>

<p class="MsoNormal">my $cf_value = sprintf( '%d/%02d/%02d', $year + 
1900, $mon +
1, $day );</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">$cf_obj->LoadByName(Name=>$cf_name);</p>

<p class="MsoNormal">$RT::Logger->debug("Loaded\$cf_obj->Name
 =
". $cf_obj->Name() ."\n");</p>

<p class="MsoNormal">$ticket->AddCustomFieldValue(Field=>$cf_obj,
Value=>$cf_value,
 RecordTransaction=>0);</p><p class="MsoNormal"><br></p><p class="MsoNormal"># set the CF "QA Approval Date" (use the current 
system date)<br><br>my $cf_name = "QA Approval Date";<br>
my ( undef, undef, undef, $day, $mon, $year ) = localtime( time );<br>my
 $cf_value = sprintf( '%d/%02d/%02d', $year + 1900, $mon + 1, $day );<br><br>$cf_obj->LoadByName(Name=>$cf_name);<br>$RT::Logger->debug("Loaded\$cf_obj->Name
 = ". $cf_obj->Name() ."\n");<br>
$ticket->AddCustomFieldValue(Field=>$cf_obj, 
Value=>$cf_value, RecordTransaction=>0);<br><br># set new value 
for CF "QA Approver" (use the name of the user doing this trans)<br><br>my
 $cf_name = "QA Approver";<br>
my $cf_value = $trans->CreatorObj->Name;<br>my $approver = 
$ticket->FirstCustomFieldValue('QA Approver');<br><br># Before 
continuing, check to see if QA Approver is blank<br><br>unless 
($approver)<br>       {<br>
        $cf_obj->LoadByName( Name => $cf_name );<br>        
$RT::Logger->debug( "Loaded \$cf_obj->Name = ". $cf_obj->Name()
 ."\n" );<br>        $ticket->AddCustomFieldValue( Field=>$cf_obj,
 Value=>$cf_value,  RecordTransaction=>0 );<br>
       }<br><br>return 1;<br></p>

<p class="MsoNormal">#----------------------------------------------------------------------------</p>

<p class="MsoNormal"># Custom action cleanup code:</p>

<p class="MsoNormal">#----------------------------------------------------------------------------</p>

<p class="MsoNormal"> return
 1;</p><span style="font-size: 12pt; font-family: "Times New Roman";"></span><p class="MsoNormal"><br><span style="font-size: 12pt; font-family: "Times New Roman";"></span></p><p class="MsoNormal">
<span style="font-size: 12pt; font-family: "Times New Roman";">As
 you can see, there's a lot of code you can use there for Custom Fields,
 compound if's, etc.</span></p><p class="MsoNormal"><br><span style="font-size: 12pt; font-family: "Times New Roman";"></span></p>
<p class="MsoNormal"><span style="font-size: 12pt; font-family: "Times New Roman";">Now, here are a couple pieces of code to 
modify certain Ticket fields:</span></p><p class="MsoNormal"><br></p><p class="MsoNormal">


</p><p class="MsoNormal">$ticket->SetOwner($ownerid); # $ownerid was 
set previously to this line of code<br></p>

<p class="MsoNormal">$ticket->SetQueue(10, 'Force'); # 10 is the ID 
of the Queue I want it moved to<br></p>

<p class="MsoNormal">$ticket->SetOwner(10, 'Force'); # Forces <i>change</i>
 in owner (in this case to ID #10) as opposed to simply setting an empty field<br></p><p class="MsoNormal"><br></p><p class="MsoNormal">Notice that in some 
cases, you might have to use "Force". Most likely, you will have to do 
that to "move" a ticket to <i>another</i> Queue. Actually, you aren't really 
"<i>moving</i>" anything. You're just changing the Queue ID for that ticket. To
 do this, you need that <i>actual Queue Id</i> to set it to. You can get the ID
 by navigating Configuration->Queues and the number on the left is 
the Queue Id.<br>
</p><p class="MsoNormal"><br></p><p class="MsoNormal">Here's code that 
will set the owner to the transaction user if there is no current owner:</p><p class="MsoNormal"><br></p><p class="MsoNormal"># set owner if Nobody<br>
<br>my $ticket = $self->TicketObj;<br>my $trans = 
$self->TransactionObj;<br>my $owner_id = $trans->CreatorObj->PrincipalId;<br><br>if 
 ($ticket->OwnerObj->Name() eq 'Nobody' )<br>    {<br>     
$ticket->SetOwner($owner_id, 'Force');<br>
    }<br><br>return 1;</p><p class="MsoNormal"><br></p><p class="MsoNormal">Well, that's about it. Hope this all helps.</p><p class="MsoNormal"><br></p><p class="MsoNormal">Kenn</p><p class="MsoNormal">LBNL<br></p></div>
<br><br><div class="gmail_quote">On Thu, Apr 29, 2010 at 9:52 AM,  <span dir="ltr"><<a href="mailto:lobo%2Brt@mental.com">lobo+rt@mental.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Kenn,<br>
<br>
() Do you REALLY care what the old value was? We use Custom Fields as triggers<br>
<div class="im">() on a lot of scrips, but we really don't care what it used to be. We only<br>
() care that it has changed and what it has changed to. It makes the code<br>
() easier to write and debug.<br>
<br>
</div>yes, I only care about the new value and that it actually has<br>
changed, sorry for not being more clear.<br>
<br>
Your mail made me search for "trigger", and that lead me to<br>
<a href="http://wiki.bestpractical.com/view/OnCustomFieldValueChange" target="_blank">http://wiki.bestpractical.com/view/OnCustomFieldValueChange</a><br>
which looks as if tells me all I need.  Thank you very much!<br>
<div><div></div><div class="h5"><br>
    Ciao, Lobo<br>
<br>
<br>
Discover RT's hidden secrets with RT Essentials from O'Reilly Media.<br>
Buy a copy at <a href="http://rtbook.bestpractical.com" target="_blank">http://rtbook.bestpractical.com</a><br>
</div></div></blockquote></div><br>