<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Notes On Siebel &#187; Workflow</title>
	<atom:link href="http://blog.notesonsiebel.com/category/siebel/workflow/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.notesonsiebel.com</link>
	<description>Technical advice, help and instruction with Siebel Systems</description>
	<lastBuildDate>Wed, 13 Aug 2008 23:24:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Workflow to process multiple rows</title>
		<link>http://blog.notesonsiebel.com/2008/08/06/workflow-to-process-multiple-rows/</link>
		<comments>http://blog.notesonsiebel.com/2008/08/06/workflow-to-process-multiple-rows/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 11:40:33 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/?p=60</guid>
		<description><![CDATA[There&#8217;s no standard loop construction (For/While/Do) in Siebel Workflow, but there are still a couple of ways to have a Workflow Process handle multiple rows.
Update Operation
For a simple update to a child entity use a Siebel Operation. When a Workflow Process has a Business Object then a Siebel Operation Update step defined for a child [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s no standard loop construction (For/While/Do) in Siebel Workflow, but there are still a couple of ways to have a Workflow Process handle multiple rows.</p>
<h4>Update Operation</h4>
<p>For a simple update to a child entity use a Siebel Operation. When a Workflow Process has a Business Object then a Siebel Operation <strong>Update </strong>step defined for a child Business Component will update <em>all</em> records that are children of the selected record in the Primary Buisiness Component. The update can be filtered to specific records by specifying  a SearchSpec on the Update.</p>
<p>This technique can be expanded through the use of Runtime Events: define an Event on the child BusComp to catch a simple update operation and trigger further processing of the record.</p>
<p style="text-align: left;"><img class="size-full wp-image-61 alignnone" title="multipleupdate" src="http://blog.notesonsiebel.com/wp-content/uploads/2008/08/multipleupdate.gif" alt="Siebel Update Workflow" width="353" height="111" /></p>
<p>Bear in mind that for this to work then the Object Id process property must specify a valid record in the Primary Business Component. Also, watch out for <a title="MetaLink3 login required" href="https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=498993.1&amp;h=Y" target="_blank">this gotcha</a> if you&#8217;re trying to dynamically update a field.</p>
<h4>Sub Process SearchSpec</h4>
<p>An alternative way to process more complicated actions is to call a sub-process for multiple rows. In this case a Workflow Process is defined as normal to act on a single record specified through the Object Id. Then to have this workflow run for multiple rows, define a new &#8216;wrapper&#8217; workflow and add a Sub Process step to call the original process. To this Sub Process step add the Input Argument <strong>SearchSpec</strong>, supplying a search specification through the Value in the normal way.</p>
<p>When the wrapper workflow is executed, the SearchSpec is applied to the primary Business Component of the sub-process and the child workflow is run once for each row returned.</p>
<p><img class="size-full wp-image-62 alignnone" title="multiplesubprocess" src="http://blog.notesonsiebel.com/wp-content/uploads/2008/08/multiplesubprocess.gif" alt="Siebel Sub Process Workflow" width="353" height="111" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2008/08/06/workflow-to-process-multiple-rows/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Defining Workflow Process Properties</title>
		<link>http://blog.notesonsiebel.com/2008/03/03/defining-workflow-process-properties/</link>
		<comments>http://blog.notesonsiebel.com/2008/03/03/defining-workflow-process-properties/#comments</comments>
		<pubDate>Mon, 03 Mar 2008 10:59:54 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2008/03/03/defining-workflow-process-properties/</guid>
		<description><![CDATA[Okay, time for a rant. This is bugging me.
I spend a lot of time with Workflow: EAI work kind of forces that on you. Any moderately complicated workflow process always ends up needing a stack of workflow process properties. The vanilla processes Siebel provide are good examples of this phenomenon. This is understandable, and equivalent [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, time for a rant. This is bugging me.</p>
<p>I spend a lot of time with Workflow: EAI work kind of forces that on you. Any moderately complicated workflow process always ends up needing a stack of workflow process properties. The vanilla processes Siebel provide are good examples of this phenomenon. This is understandable, and equivalent to a scripted function justifiably defining a bunch of local variables. So here&#8217;s the thing: when working with processes, why do I always see <em>all </em>the process properties defined to be &#8216;In/Out&#8217;? <strong>This</strong> is equivalent to a scripted function putting every local variable into the function definition. Crazy talk!</p>
<p>For those who don&#8217;t know, the <strong>In/Out</strong> parameter on a process property defines the purpose of the property. The values are <em>In</em> for input properties, <em>Out</em> for outputs, <em>In/Out</em> (the default) for properties that both accept and return a value, and <em>None</em> for those variables just used internally by the process. Pretty clear cut. Setting this parameter properly makes the workflow easier to understand &#8211; particularly helping when calling the workflow as a sub-process. Leaving it as the default <em>In/Out</em> value is lazy config, and I&#8217;ve seen too much of it. So there. Someone pass the message on to the developers inside Siebel, please.</p>
<p>P.S. While we&#8217;re at it: how about using process property types <em>other</em> than &#8216;String&#8217; and &#8216;Hierarchy&#8217; &#8211; and that &#8216;Integration Object&#8217; parameter is pretty useful too&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2008/03/03/defining-workflow-process-properties/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Synchronous Wait Steps</title>
		<link>http://blog.notesonsiebel.com/2007/08/17/synchronous-wait-steps/</link>
		<comments>http://blog.notesonsiebel.com/2007/08/17/synchronous-wait-steps/#comments</comments>
		<pubDate>Fri, 17 Aug 2007 01:22:44 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/08/17/synchronous-wait-steps/</guid>
		<description><![CDATA[This one caught me out just recently while I was building a business process to poll a service every couple of seconds. Seemed simple enough: add a Wait Step to my flow, set MeasureUnit to Seconds and duration to 1, then call my service and loop back to the Wait under certain conditions. In my [...]]]></description>
			<content:encoded><![CDATA[<p>This one caught me out just recently while I was building a business process to poll a service every couple of seconds. Seemed simple enough: add a Wait Step to my flow, set <em>MeasureUnit</em> to <em>Seconds</em> and <em>duration</em> to <em>1</em>, then call my service and loop back to the Wait under certain conditions. In my example I want the flow to fail if the service doesn&#8217;t complete after half a dozen attempts, so I set the <em>Maximum Iterations</em> property on the service step to 6 and handled the error that occurs on the 7th attempt. The workflow should run synchronously in the Application Object Manager, with the UI waiting for a response.</p>
<p>According to all documentation this should have worked, but instead the workflow was immediately returning a response to the UI the first time it hit the Wait Step. The workflow was continuing on exactly as expected in the background, but it appeared that Siebel was automatically persisting the workflow, making the flow asynchronous.</p>
<p>Took a bit of digging around, but the solution was to change the <em>Mode</em> of the business process. In <em>Interactive Flow</em> or <em>Service Flow</em> mode the Wait step causes the flow to move out of the UI context, but in good old <em>7.0 Flow</em> compatibility mode it works as expected, blocking the UI until the workflow completes.</p>
<p>Doesn&#8217;t fit in very well with Siebel&#8217;s mandate of not creating new 7.0 Flows, but what can you do when there are bugs..?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/08/17/synchronous-wait-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Order of Events</title>
		<link>http://blog.notesonsiebel.com/2007/07/19/order-of-events/</link>
		<comments>http://blog.notesonsiebel.com/2007/07/19/order-of-events/#comments</comments>
		<pubDate>Thu, 19 Jul 2007 00:04:17 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/07/19/order-of-events/</guid>
		<description><![CDATA[A quick list, for reference:

Runtime Applet.PreInvokeMethod
Browser Applet_PreInvokeMethod
Server WebApplet_PreInvokeMethod
Runtime BusComp.PreInvokeMethod
Server BusComp_PreInvokeMethod
Runtime BusComp.InvokeMethod
Server BusComp_InvokeMethod
Runtime Applet.InvokeMethod
Server WebApplet_InvokeMethod
Browser Applet_InvokeMethod

Essentially, the Runtime Event occurs before the equivalent server script event for the same object, plus the Applet browser script events &#8216;wrap&#8217; all server side events.All of which makes perfect logical sense, but it&#8217;s sometimes handy to see it written down [...]]]></description>
			<content:encoded><![CDATA[<p>A quick list, for reference:</p>
<ul>
<li><em>Runtime</em> Applet.PreInvokeMethod</li>
<li><em>Browser</em> Applet_PreInvokeMethod</li>
<li><em>Server</em> WebApplet_PreInvokeMethod</li>
<li><em>Runtime</em> BusComp.PreInvokeMethod</li>
<li><em>Server </em>BusComp_PreInvokeMethod</li>
<li><em>Runtime </em>BusComp.InvokeMethod</li>
<li><em>Server </em>BusComp_InvokeMethod</li>
<li><em>Runtime </em>Applet.InvokeMethod</li>
<li><em>Server </em>WebApplet_InvokeMethod</li>
<li><em>Browser </em>Applet_InvokeMethod</li>
</ul>
<p>Essentially, the Runtime Event occurs before the equivalent server script event for the same object, plus the Applet browser script events &#8216;wrap&#8217; all server side events.All of which makes perfect logical sense, but it&#8217;s sometimes handy to see it written down in a list.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/07/19/order-of-events/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Editing XML in Workflow</title>
		<link>http://blog.notesonsiebel.com/2007/05/22/editing-xml-in-workflow/</link>
		<comments>http://blog.notesonsiebel.com/2007/05/22/editing-xml-in-workflow/#comments</comments>
		<pubDate>Mon, 21 May 2007 23:37:24 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/05/22/editing-xml-in-workflow/</guid>
		<description><![CDATA[Talking about the Echo method the other day I mentioned that you can use dot notation to get at property set elements, but this is such a useful tactic that I think it&#8217;s worth revisiting.
Dot notation is what Siebel call your fairly standard &#8216;parent.child.grandchild&#8217; notation. Imagine a workflow with a hierarchical process property called Employee, [...]]]></description>
			<content:encoded><![CDATA[<p>Talking about the <a href="http://blog.stuandgravy.com/2007/05/08/manipulating-workflow-process-properties/" title="Workflow Utilities Echo">Echo method</a> the other day I mentioned that you can use dot notation to get at property set elements, but this is such a useful tactic that I think it&#8217;s worth revisiting.</p>
<p>Dot notation is what Siebel call your fairly standard &#8216;parent.child.grandchild&#8217; notation. Imagine a workflow with a hierarchical process property called <strong>Employee</strong>, which has assigned to it a property set with the properties <strong>Login</strong> and <strong>Password</strong>. What dot notation allows you to do is access that Login property directly, by reference to <strong>Employee.Login</strong>. Simple enough.</p>
<p>This notation works both ways &#8211; so you can both retrieve and set properties. To set a property using the Workflow Utilities.Echo method, you need to have the top-level hierarchical process property assigned in the first input variable and then child properties in following variables. As an example: we want to set up the simple Employee Property Set above. We already have the LoginString in a process properties and want the Password &#8216;geenoos&#8217;. Create a Workflow Utilities.Echo step and assign the input variables:</p>
<blockquote>
<table width="100%">
<tr>
<td><strong>Input Argument</strong></td>
<td><strong>Type</strong></td>
<td><strong>Value</strong></td>
<td><strong>Property Name</strong></td>
</tr>
<tr>
<td>Employee</td>
<td>Process Property</td>
<td>&nbsp;</td>
<td>Employee</td>
</tr>
<tr>
<td>Employee.Login</td>
<td>Process Property</td>
<td>&nbsp;</td>
<td>LoginString</td>
</tr>
<tr>
<td>Employee.Password</td>
<td>Literal</td>
<td>geenoos</td>
<td>&nbsp;</td>
</tr>
</table>
</blockquote>
<p>Next &#8211; as I&#8217;m sure you&#8217;ve worked out &#8211; if your Employee property set has a child property set, lets say a child PS with a type of <strong>Address</strong> and properties <strong>Street </strong>and <strong>Postcode</strong>, then the Employee&#8217;s Street can be accessed with <strong>Employee.Address.Street</strong>. You can also get at the Property Set&#8217;s Value argument, using the notation <strong>property.&lt;Value&gt;</strong>, which also works at all levels of the hierarchy.</p>
<p>This is all great, useful stuff, but the real kicker comes when you&#8217;re working with XML. XML hierarchies in Siebel are just property sets, with attributes as properties and elements as &lt;Values&gt;. By using dot notation in input arguments, output argument and Echo steps, you can construct and edit XML hierarchies on-the-fly, something that previously was impossible without scripting.</p>
<p>The one limitation of dot notation is the 75-character limit to a workflow step argument. This can kick in fairly quickly when you&#8217;re dealing with all the ListOfBusinessComponent hierarchies. The workaround is to assign a sub-hierarchy to a secondary process property, do your manipulation, then assign it back in.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/05/22/editing-xml-in-workflow/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Manipulating Workflow Process Properties</title>
		<link>http://blog.notesonsiebel.com/2007/05/08/manipulating-workflow-process-properties/</link>
		<comments>http://blog.notesonsiebel.com/2007/05/08/manipulating-workflow-process-properties/#comments</comments>
		<pubDate>Mon, 07 May 2007 23:08:39 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/05/08/manipulating-workflow-process-properties/</guid>
		<description><![CDATA[There&#8217;s every chance you&#8217;ve never heard of the business service Workflow Process Utilities method Echo. It&#8217;s under-documented, under-used and under-rated. I&#8217;d built a whole bunch of complex workflow processes before I came across it, now I &#8216;Echo&#8217; stuff all over the place.
All the method does is reflect back the input arguments. Big deal, eh? The [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s every chance you&#8217;ve never heard of the business service <b>Workflow Process Utilities</b> method <b>Echo</b>. It&#8217;s under-documented, under-used and under-rated. I&#8217;d built a whole bunch of complex workflow processes before I came across it, now I &#8216;Echo&#8217; stuff all over the place.</p>
<p>All the method does is reflect back the input arguments. Big deal, eh? The thing is, the input arguments can be expressions or business component fields or property set values or functions or anything you can usually reference from a workflow. So you can manipulate process properties without taking any other action, or you can get a current business component field value without doing a query, or you can get at property set child elements using dot notation &#8211; all things that I&#8217;d struggled to do previously without scripting.</p>
<p>Plenty of good examples on SupportWeb under a search of &#8216;Workflow AND Echo&#8217;. Note that in early versions of Siebel 7 the display name of the method is &#8216;Return Property Values&#8217;, plus there&#8217;s a <a href="https://metalink3.oracle.com/od/faces/secure/km/DocumentDisplay.jspx?id=526087.1&amp;h=Y" target="_blank" title="MetaLink login required">fixable bug</a> in 7.0.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/05/08/manipulating-workflow-process-properties/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Detecting when a WriteRecord is New or Updated</title>
		<link>http://blog.notesonsiebel.com/2007/05/01/detecting-when-a-writerecord-is-new-or-updated/</link>
		<comments>http://blog.notesonsiebel.com/2007/05/01/detecting-when-a-writerecord-is-new-or-updated/#comments</comments>
		<pubDate>Mon, 30 Apr 2007 23:17:32 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/05/01/detecting-when-a-writerecord-is-new-or-updated/</guid>
		<description><![CDATA[Nathan&#8217;s enthusiatically followed up on his first contribution to eulogise about a couple of new Runtime Events&#8230;
This one is relatively simple but it is worth pointing out.  Sometimes its the little things that make you weep for joy as a developer.
In the bad old days of Siebel (i.e. before 7.7), the world was running [...]]]></description>
			<content:encoded><![CDATA[<p>Nathan&#8217;s enthusiatically followed up on his <a href="http://blog.stuandgravy.com/2007/04/12/workflow-process-business-objects/" title="Workflow Process Business Objects">first contribution</a> to eulogise about a couple of new Runtime Events&#8230;</p>
<blockquote><p><span class="q">This one is relatively simple but it is worth pointing out.  Sometimes its the little things that make you weep for joy as a developer.</span></p>
<p>In the bad old days of Siebel (i.e. before 7.7), the world was running around clubbing each other over the head, saying &#8220;ugh&#8221; a lot and wearing animal skins.  Then the light shone upon the world and we were given:</p>
<p><strong>WriteRecordNew </strong>and <strong>WriteRecordUpdated</strong>.</p>
<p>These are Runtime Events that I noticed just recently.  Many many times in config, you need to do something when a record is written. <span class="q">You place code on the WriteRecord event (so that you can avoid having to worry about the user doing Undo, stepping off a field and recorrecting etc). But then you need to do <em>different</em> things depending on whether the record is </span>new or updated.</p>
<p>Usually what you needed to do was <span class="q">set some global variable when</span> the NewRecord event fired, test that variable in WriteRecord, then clear the variable.  It usually worked, but it was not elegant. I have seen implementations where the code on the WriteRecord event runs into the thousands. But we won&#8217;t mention those. <span class="q"> </span></p>
<p><span class="q">Now, the great and glorious Siebel gods have seen fit to now provide us with Runtime Events that distinguish between New and Updated records! Hallelujah brother!</span></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/05/01/detecting-when-a-writerecord-is-new-or-updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workflow Process Business Objects</title>
		<link>http://blog.notesonsiebel.com/2007/04/12/workflow-process-business-objects/</link>
		<comments>http://blog.notesonsiebel.com/2007/04/12/workflow-process-business-objects/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 22:50:45 +0000</pubDate>
		<dc:creator>stuandgravy</dc:creator>
				<category><![CDATA[Siebel]]></category>
		<category><![CDATA[Workflow]]></category>

		<guid isPermaLink="false">http://blog.notesonsiebel.com/2007/04/12/workflow-process-business-objects/</guid>
		<description><![CDATA[A first contribution from elsewhere! Outstanding. Nathan kindly offered this note in return for &#8216;getting famous&#8217;. Not sure I can help with that, but everyone has to start somewhere&#8230;
I did this trying to prototype a problem I had for an interface I was working on.  When you setup a Workflow Process you must assign [...]]]></description>
			<content:encoded><![CDATA[<p>A first contribution from elsewhere! Outstanding. Nathan kindly offered this note in return for &#8216;getting famous&#8217;. Not sure I can help with that, but everyone has to start somewhere&#8230;</p>
<blockquote><p>I did this trying to prototype a problem I had for an interface I was working on.  When you setup a Workflow Process you must assign it a Business Object, or else a whole heap of functionality within that Workflow Process does not work i.e. you cannot select Business Components etc.</p>
<p>My Workflow Process was triggered by a Runtime Event, and all was fine for the UI contexts where the business component of the Workflow action matched the primary business component of the UI.  However, when I was in a different business object, the Row Id passed was that of a different Business Component and so my workflow did not “flow”.</p>
<p>For example, upon creation of a Contact in “My Contacts”, the Row Id passed in was the Row Id of the Contact.  However, when you create a Contact in Account-&gt;Contacts, then the Row Id passed in is that of the Account record.</p>
<p>Well, there is a simple way around this, ready for it?</p>
<p>Are you sure you’re ready?</p>
<p>Okay, here it is&#8230;</p>
<p>In the Runtime Event, you need to set a Profile Attribute to the current Row Id to pass into the Workflow. You can then put as many Runtime Events on as many business objects as you require, as long as it always sets that Profile Attribute for the Row Id.</p></blockquote>
<p>Too easy. A gentle warm-up from Nathan, there&#8217;s more to come&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.notesonsiebel.com/2007/04/12/workflow-process-business-objects/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
