<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8690984107363989409</id><updated>2011-10-26T16:11:07.929-05:00</updated><category term='xml'/><category term='MSSQL'/><category term='Siebel'/><title type='text'>Code Grok</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codegrok.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-9092055596529993828</id><published>2011-10-26T16:11:00.000-05:00</published><updated>2011-10-26T16:11:08.100-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='MSSQL'/><title type='text'>Script Extract Update</title><content type='html'>I &lt;a href="http://codegrok.blogspot.com/2010/09/siebel-script-export.html"&gt;previously blogged&lt;/a&gt; about extracting the script from the repository in order to perform post processing. This code is nice but I've been driven to update the script for some specific version over version comparisons.&lt;br /&gt;Recently I blogged about holding &lt;a href="http://codegrok.blogspot.com/2011/09/multiple-repositories-in-siebel-tools.html"&gt;multiple repositories&lt;/a&gt; in the shared development database in order to compare components.&lt;br /&gt;I decided that I need to bring these two ideas together: why can't I do code metric calculations across versions to see how much &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt; we are accumulating in our systems.&lt;br /&gt;&lt;br /&gt;I've updated the &lt;a href="http://codegrok.blogspot.com/p/script-dump-sql.html"&gt;sql which is now produces a much larger output&lt;/a&gt; (depending on how many repositories you have). To get the code out, I couldn't use SSMS so I used BCP:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;bcp "exec SIEBEL_CODE_DUMP" queryout file.xml -w -S &amp;lt;&lt;database&gt;&amp;gt; -T &lt;/database&gt;&lt;/blockquote&gt;&amp;nbsp;I created a stored procedure called SIEBEL_CODE_DUMP which could be called from BCP which used the queryout parameter to dump the script.&lt;br /&gt;We have 10 repositories in our database and the output file was over 20MB.&lt;br /&gt;This is the schema:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TpfDLsqiieI/Tqh3D1bkElI/AAAAAAAAAcQ/Pety_O8p2yA/s1600/Scripting.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-TpfDLsqiieI/Tqh3D1bkElI/AAAAAAAAAcQ/Pety_O8p2yA/s1600/Scripting.png" /&gt;&lt;/a&gt;&lt;/div&gt;Obviously, I now have a very rich model from which to build metrics from. I've just scratched the surface, but I'm happy with what I'm getting. I'm thinking of doing dependency crawling, but that will involve some scripting and I have to see how much time that will take.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-9092055596529993828?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/10/script-extract-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/9092055596529993828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/9092055596529993828'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/10/script-extract-update.html' title='Script Extract Update'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-TpfDLsqiieI/Tqh3D1bkElI/AAAAAAAAAcQ/Pety_O8p2yA/s72-c/Scripting.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-1009711180336087452</id><published>2011-10-06T14:40:00.001-05:00</published><updated>2011-10-06T14:40:30.632-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='MSSQL'/><title type='text'>Preparing for deployment</title><content type='html'>Migration to production is always a heart wrenching affair. With some Siebel releases, with multiple developers coming and going it gets worse.&lt;br /&gt;&lt;br /&gt;We have attempted to keep a fairly strict deployment method as we do deployments entirely by hand; our admins have decided not to use ADM for better or worse. We're a multilingual installation and I think there were issues in getting the LOV migration to go well. In any case, using ADM or not, managing deployment artifacts is always tricky and the more time between releases the situation can get very grave.&lt;br /&gt;&lt;br /&gt;For the latest release we've been doing a significant overhaul of some processes that use workflow processes, unfortunately some cruft has crept into the repository with multiple versions of the same process marked as Completed without being updated to Not In Use. Add to that, but how do we tell the deployment team &lt;b&gt;what&lt;/b&gt; to deploy?&lt;br /&gt;&lt;br /&gt;We have a series of deployment artifacts that document what goes into each release (and is maintained in a version control system):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bill of Materials.docx - general document that holds a list of the specific files, images, etc that must be installed, instructions etc.&lt;/li&gt;&lt;li&gt; Dispatch Rule Sets.xlsx - a spreadsheet with dispatch rules&lt;/li&gt;&lt;li&gt;List Of Values.xlsx - a spreadsheet with the LOV changes (adds in green, updates in black, and deletions (deactivations) in red&lt;/li&gt;&lt;li&gt;Siebel System Configuration.docx - the standard reference bible for our implementation. Includes the component configurations, workflow policies, repeating jobs, workflows, web services, etc. Basically, the reference guide to our environment&lt;/li&gt;&lt;/ul&gt;I was having trouble getting a good list of workflow processes that were added, updated and deactivated between this upcoming release and the last one, so I wrote some SQL that helped me come up with a proper list (and helped me clean up the WF repository).&lt;br /&gt;&lt;br /&gt;The prerequisite to using these statements is to import the last release repository into the development database under a different name. We typically just increment the version number so we have these repositories to choose from:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-r-mmfQurW3M/To4D3N896KI/AAAAAAAAAcI/1p0w7UcMcw8/s1600/Repositories.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://4.bp.blogspot.com/-r-mmfQurW3M/To4D3N896KI/AAAAAAAAAcI/1p0w7UcMcw8/s320/Repositories.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EXPIRED WORKFLOWS BETWEEN REPOSITORIES&lt;/span&gt;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SELECT DISTINCT A.PROC_NAME&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FROM S_WFR_PROC A&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN S_REPOSITORY B ON A.REPOSITORY_ID = B.ROW_ID&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;WHERE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B.NAME = 'Siebel Repository 1.9'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND A.STATUS_CD = 'COMPLETED'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AND A.PROC_NAME IN &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT DISTINCT PROC_NAME &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FROM S_WFR_PROC A &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN S_REPOSITORY B ON A.REPOSITORY_ID = B.ROW_ID &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B.NAME = 'Siebel Repository'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AND NOT EXISTS&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT * FROM S_WFR_PROC A1 &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; INNER JOIN S_REPOSITORY B1 ON A1.REPOSITORY_ID = B1.ROW_ID &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; B1.NAME = 'Siebel Repository'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AND A1.PROC_NAME = A.PROC_NAME&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AND A1.STATUS_CD = 'COMPLETED'&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; )&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;NEW AND UPDATED WORKFLOWS BETWEEN REPOSITORIES&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SELECT A.PROC_NAME, A.VERSION [v.NEXT], C.VERSION [v.1.9]&lt;br /&gt;FROM S_WFR_PROC A&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;INNER JOIN S_REPOSITORY B ON A.REPOSITORY_ID = B.ROW_ID&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;LEFT OUTER JOIN&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;-- GETS MOST CURRENT VERSION&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SELECT A.PROC_NAME, A.VERSION&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;FROM S_WFR_PROC A&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;INNER JOIN S_REPOSITORY B ON A.REPOSITORY_ID = B.ROW_ID&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;INNER JOIN &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;SELECT PROC_NAME, MAX(VERSION) [VERSION] &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;FROM S_WFR_PROC A1 &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;INNER JOIN S_REPOSITORY B1 ON A1.REPOSITORY_ID = B1.ROW_ID&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;WHERE&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B1.NAME = 'Siebel Repository 1.9'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;GROUP BY A1.PROC_NAME&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;) C ON C.PROC_NAME = A.PROC_NAME AND C.VERSION = A.VERSION&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;WHERE &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;B.NAME = 'Siebel Repository 1.9'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;AND A.STATUS_CD = 'COMPLETED'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;) C ON A.PROC_NAME = C.PROC_NAME&lt;br /&gt;WHERE &lt;br /&gt;B.NAME = 'Siebel Repository'&lt;br /&gt;AND A.STATUS_CD = 'COMPLETED'&lt;br /&gt;AND A.PROC_NAME LIKE 'ABC%'&lt;br /&gt;AND (A.VERSION != C.VERSION OR C.VERSION IS NULL)&lt;br /&gt;ORDER BY A.PROC_NAME&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-1009711180336087452?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/10/preparing-for-deployment.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1009711180336087452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1009711180336087452'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/10/preparing-for-deployment.html' title='Preparing for deployment'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-r-mmfQurW3M/To4D3N896KI/AAAAAAAAAcI/1p0w7UcMcw8/s72-c/Repositories.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-8824838294635990313</id><published>2011-09-30T19:56:00.000-05:00</published><updated>2011-09-30T19:56:17.135-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='MSSQL'/><title type='text'>Search Criteria and index field order</title><content type='html'>I was working on some complex workflows the other day and after several days I completed the logic, ran the simulator a thousand times and was finally satisfied with the outcome.&lt;br /&gt;&lt;br /&gt;Then I deployed it into test...performance was terrible.&lt;br /&gt;&lt;br /&gt;I checked the indexes on the S_EVT_ACT table and found a custom index that matched the columns in the query. We had added a new column called "X_CHANNEL" to indicate how the activity was completed (email, fax, phone, etc). My query was looking for [Status] = 'Done' and [Channel] = 'Email' (with a sort on the started date).&lt;br /&gt; Everything should be running fine...after scratching my head for quite a while, creating and dropping indexes on the table.&lt;br /&gt;&lt;br /&gt;The existing (custom) index on the table was:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CREATE NONCLUSTERED INDEX [ABC_S_EVT_ACT_X9_X] ON [dbo].[S_EVT_ACT] &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [X_CHANNEL] ASC,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [EVT_STAT_CD] ASC,&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TODO_ACTL_START_DT] DESC&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;)WITH (PAD_INDEX&amp;nbsp; = OFF, STATISTICS_NORECOMPUTE&amp;nbsp; = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS&amp;nbsp; = ON, ALLOW_PAGE_LOCKS&amp;nbsp; = ON) ON [PRIMARY]&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;GO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I changed the order of the search expression to [Channel] = 'Email' and  [Status] = 'Done', and the query took 62ms instead of 5 minutes (300000ms). I had never put much thought into the order of the fields in the index until now. I'll be keeping that in mind from now on... &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-8824838294635990313?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/search-criteria-and-index-field-order.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/8824838294635990313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/8824838294635990313'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/search-criteria-and-index-field-order.html' title='Search Criteria and index field order'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-4252541491008087660</id><published>2011-09-30T19:41:00.003-05:00</published><updated>2011-09-30T19:41:30.276-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Workflow runtime events</title><content type='html'>A lot of information is available in bookshelf and online regarding workflows and runtime events so I won't cover that again. I would like to share a diagram I created for a co-worker that is getting up to speed on Siebel workflows and run-time events.&lt;br /&gt;I was trying to explain how the same workflow needs to be duplicated in order to capture the same run-time event but under different business objects.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CHu7zQOdNXA/ToZhXQf3SYI/AAAAAAAAAb8/RCuVc8BaD2g/s1600/EventHandlers+and+Workflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="336" src="http://4.bp.blogspot.com/-CHu7zQOdNXA/ToZhXQf3SYI/AAAAAAAAAb8/RCuVc8BaD2g/s640/EventHandlers+and+Workflow.png" width="640" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Hope someone finds this helpful. &lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-4252541491008087660?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/workflow-runtime-events.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4252541491008087660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4252541491008087660'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/workflow-runtime-events.html' title='Workflow runtime events'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CHu7zQOdNXA/ToZhXQf3SYI/AAAAAAAAAb8/RCuVc8BaD2g/s72-c/EventHandlers+and+Workflow.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-4326474278587389300</id><published>2011-09-26T12:04:00.001-05:00</published><updated>2011-09-26T12:20:46.991-05:00</updated><title type='text'>Drilldowns using Minibuttons on form applets</title><content type='html'>I was looking for a convenient way for users to navigate to the service request from an activity form applet. From a list applet a drill down is a very effective tool for users to navigate - the breadcrumb provides context and quick backwards navigation, but how can we use drill downs from a form applet?&lt;br /&gt;&lt;br /&gt;This is the final product:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LToYnzYGIo8/ToC0S09qaNI/AAAAAAAAAb0/cOP0Sk5Ad_w/s1600/SR+with+drilldown+button.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="44" src="http://3.bp.blogspot.com/-LToYnzYGIo8/ToC0S09qaNI/AAAAAAAAAb0/cOP0Sk5Ad_w/s320/SR+with+drilldown+button.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Obviously, using scripting we can use GoToView, but I wanted to create a code free solution, so I used a "Named Method". On my form (which is based on the Action bc)&lt;br /&gt;&lt;br /&gt;Create two user properties on the applet:&lt;br /&gt;Name: CanInvokeMethod: GoToSR&lt;br /&gt;Value: [SR Number] is not null&lt;br /&gt;&lt;br /&gt;Name: Named Method: GoToSR&lt;br /&gt;Value: 'INVOKE', 'DrillDown', '"Service Request"'&lt;br /&gt;&lt;br /&gt;Add a new control:&lt;br /&gt;&lt;br /&gt;Name: xxx&lt;br /&gt;HTML Type: MiniButton&lt;br /&gt; Method Invoked: GoToSR&lt;br /&gt;Runtime: true&lt;br /&gt;&lt;b&gt;Field: Activity SR Id&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I bolded the Field property because it's non-intuitive: why would I define a field for a button? The field on the button is the context for the drilldown object:&lt;br /&gt;&lt;br /&gt;Name: Service Request&lt;br /&gt;&lt;b&gt;Hyperlink Field: Activity SR Id&lt;/b&gt;&lt;br /&gt;View: Service Request Detail View&lt;br /&gt;Source Field: Activity SR Id&lt;br /&gt;Business Component: Service Request&lt;br /&gt;Destination Field: Id&lt;br /&gt;&lt;br /&gt;If the field is left blank on the button an error like the one below will appear:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dusr0EU92Yc/ToCzJTC875I/AAAAAAAAAbw/cPEhF9pLc_0/s1600/Drilldown+Error.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-dusr0EU92Yc/ToCzJTC875I/AAAAAAAAAbw/cPEhF9pLc_0/s1600/Drilldown+Error.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;The drilldown isn't defined or enabled on the button because it doesn't have a field.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-4326474278587389300?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/drilldowns-with-minib.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4326474278587389300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4326474278587389300'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/drilldowns-with-minib.html' title='Drilldowns using Minibuttons on form applets'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-LToYnzYGIo8/ToC0S09qaNI/AAAAAAAAAb0/cOP0Sk5Ad_w/s72-c/SR+with+drilldown+button.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-3379781481070103475</id><published>2011-09-23T15:31:00.001-05:00</published><updated>2011-09-23T15:31:35.583-05:00</updated><title type='text'>Siebel monitoring with bubblegum (awk)</title><content type='html'>If your organization hasn't made a sizable investment in Third-Party Siebel monitoring tools (or even leveraged the impressive monitoring available from Oracle), you are risking business processes that are dependent on the background processes that keep the trains running on time.&lt;br /&gt;&lt;br /&gt;Our Siebel installation has several integrations based on asynchronous workflow processes and workflow policies. Both of these processes take work off of the main user focused object managers to maintain responsiveness and insulate our users from outages in our integrated system.&lt;br /&gt;&lt;br /&gt;That's great, except when the background processes in Siebel fail. Unless your users are very observant, it's easy for a workflow manager to go offline and no one notices until business processes and customer are impacted.&lt;br /&gt;&lt;br /&gt;Without access to the fantastic (and fantastically expensive monitoring tools available) one is left with waiting for alert email's from Siebel and/or periodic checking.&lt;br /&gt;&lt;br /&gt;Rules of Thumb &lt;br /&gt;&lt;ol&gt;&lt;li&gt;don't depend on the system being monitored to tell you when it's down. If it's not available, it probably can't send email&lt;/li&gt;&lt;li&gt;Periodic checking is a waste of everyone's time. If your organization can spend money having someone check on components manually, you are lucky (unless you are the one doing the checking). &lt;/li&gt;&lt;li&gt;Siebel has some funny defenitions of "down" especially concerning workflow monitors (or background components)&lt;/li&gt;&lt;/ol&gt;I authored this mashup of SRVRMGR.exe, dos batch, blat, and awk for text parsing.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;srvrmgr.exe is the commandline window into Siebel. Basically everything that can be done on the Administration - Configuration and Administration - Management screens can be done with the command line (actually more...)&lt;/li&gt;&lt;li&gt;dos batch (for windows) ties the output from the srvrmgr tool and pipes it into awk. I probably could have done everything in awk, but this got the job done&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blat.net/"&gt;blat&lt;/a&gt; is a command line tool for sending email (very old school, but hey...)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gnu.org/s/gawk/"&gt;awk&lt;/a&gt; (gawk actually) is a command line scripter's text wrangler. I consider it perl lite - not as capable but easy to create text parsing scripts&lt;/li&gt;&lt;/ol&gt;So...here are the scripts:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Monitor.bat&lt;/b&gt; &lt;br /&gt;&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;@echo off&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;set srvrmgr=E:\sea78\siebsrvr\BIN\srvrmgr.exe&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;set gateway=GATEWAY&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;set enterprise=SIEBEL&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;set query=list components for server SIEBELSRVR show CC_ALIAS, CC_NAME, CP_DISP_RUN_STATE, CP_END_TIME&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;REM REM REM REM REM REM REM REM REM REM REM REM REM REM &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;"%srvrmgr%" /g %gateway% /e %enterprise% /u SADMIN /p Sadm!n!! /c "%query%" /b | gawk.exe -W re-interval -f parse_siebel.awk&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;b&gt;parse_siebel.awk&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN { &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Comma seperated list of component aliases to monitor&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;components = "AsgnSrvr,WorkMonActivity,WorkMonAsset,WorkMonT4Hist,MailMgr"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Comma seperated list of email addresses (no spaces please)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;emailto = "SOMEONE@SOMEWHERE.COM"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# (Fictional) Email address that message is from&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;emailfrom = "NO_REPLY@SOMEWHERE.COM"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# Subject line&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;subject = "\"Siebel Component Failure\""&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;# SMTP server name&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;smtp = "SMTP.SERVER.COM"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;################---Don't edit below this line---###################&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FS = "[ ]{2,}"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;blat = "blat.exe"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;split(components, comps, ",")&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;};&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$3 ~ /Starting Up/ { (msg $2 " is starting up\n") }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$3 ~ /Shutdown|Offline|Shutting Down|Unavailable/ {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (c in comps) {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ($1 == comps[c]) {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; msg = (msg $2 " (" $3 ") @ " $4 "\n") &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;END { &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (msg != "") {&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; msg = ("Some components are in an invalid state, please investigate:\n\n" msg)&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cmd = (blat " - -to " emailto " -subject " subject " -server " smtp " -f " emailfrom " -q") &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print msg | cmd&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Sent mail!"&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;I know that this script could be much enhanced, but it works well for a couple hours of work&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-3379781481070103475?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/siebel-monitoring-with-bubblegum-awk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/3379781481070103475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/3379781481070103475'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/siebel-monitoring-with-bubblegum-awk.html' title='Siebel monitoring with bubblegum (awk)'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-8955840907852303848</id><published>2011-09-21T07:07:00.002-05:00</published><updated>2011-09-21T12:30:48.286-05:00</updated><title type='text'>Consuming Siebel Web Services with InfoPath</title><content type='html'>Continuing my work on InfoPath I've completed the web service interface in Siebel based on very simple web service contracts that are easy for the rules engine in InfoPath to use. I will walk through the process of setting a reference to the web service and configuring an InfoPath form to use the service.&lt;br /&gt;&lt;br /&gt;Firstly - InfoPath uses the WSDL file that Siebel produces on the Inbound Web Service page to create the internal proxy. If you don't know what WSDL is then it's best to learn about it and then continue.&lt;br /&gt;&lt;br /&gt;1. Save the wsdl from Siebel into a convenient location&lt;br /&gt;2. Open up an InfoPath form and open up the Data Connections window available from Tools, Data Connections&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-svHpRE-FsUg/TnnQaCoLB7I/AAAAAAAAAbU/CoVnIbjJEP4/s1600/DataConnections.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="317" src="http://4.bp.blogspot.com/-svHpRE-FsUg/TnnQaCoLB7I/AAAAAAAAAbU/CoVnIbjJEP4/s320/DataConnections.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;3. Click on&amp;nbsp; Add...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ICjzkIf29G8/TnnQZ6ga0rI/AAAAAAAAAbQ/iERwSK2ruQc/s1600/DataConnectionWizard2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://4.bp.blogspot.com/-ICjzkIf29G8/TnnQZ6ga0rI/AAAAAAAAAbQ/iERwSK2ruQc/s400/DataConnectionWizard2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;A wizard starts - it's important that the Receive Data option is chosen; with this method you can specify inbound parameters in our case, we want to specify the SR number as well as the name of the activity plan to attach.&lt;br /&gt;4. The next dialog asks what the source/destination of the data connection. Select Web Service&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-b3PkF6sHTsA/TnnQaI7VQpI/AAAAAAAAAbY/6dR1Wa1SmoM/s1600/DataConnectionWizard3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://2.bp.blogspot.com/-b3PkF6sHTsA/TnnQaI7VQpI/AAAAAAAAAbY/6dR1Wa1SmoM/s400/DataConnectionWizard3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;5. Here we have to specify the location of the WSDL file we saved from Siebel earlier. If we were connecting to a .Net web service we could provide the URL that would auto generate the wsdl on the fly.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ucndo402W2o/TnnQaq4Ep-I/AAAAAAAAAbc/gxLTOn8KaRw/s1600/DataConnectionWizard4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/-ucndo402W2o/TnnQaq4Ep-I/AAAAAAAAAbc/gxLTOn8KaRw/s400/DataConnectionWizard4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;6. The next step involves picking the specific operation we want to use. If the web service has multiple operations we need to pick only one. I've created a web service from a workflow process so there will only be one operation.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rSqfRphUF-k/TnnQatzAj_I/AAAAAAAAAbk/HCOkX1nv3Is/s1600/DataConnectionWizard5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/-rSqfRphUF-k/TnnQatzAj_I/AAAAAAAAAbk/HCOkX1nv3Is/s400/DataConnectionWizard5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;7.The next dialog asks us if we want to specify any default values. In this case, there are none, but there are scenarios where we want to call a staticly defined service (let's say to get a specific List Of Values type) and we don't want to use rules to set the initial parameters.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cYkHxtjl4Yk/TnnQazgQCoI/AAAAAAAAAbg/KmSj4lgORpM/s1600/DataConnectionWizard6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://4.bp.blogspot.com/-cYkHxtjl4Yk/TnnQazgQCoI/AAAAAAAAAbg/KmSj4lgORpM/s400/DataConnectionWizard6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;8. We can choose to fire the web service call when the form is launched - perhaps to refresh a set of values retrieved from an external source (again the List Of Values idea comes to the fore). In this scenario, we don't want to choose this option as the form will execute the service based on rules.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5YuCCRtiUr8/TnnQbVyx_VI/AAAAAAAAAbs/VQPWrxKfvFk/s1600/DataConnectionWizard8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://2.bp.blogspot.com/-5YuCCRtiUr8/TnnQbVyx_VI/AAAAAAAAAbs/VQPWrxKfvFk/s400/DataConnectionWizard8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;9. On the next page we can choose to pre-cache the data from the data connection. Again there are valid scenarios for this option (like a list of values query) where we want to pre-cache a set of values in the InfoPath template. It will save on network traffic if constant refreshing is not needed. (Great for combo-boxes on the form)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-YbtHSgkJBw4/TnnQbG5WjpI/AAAAAAAAAbo/zF5RyK_6DEY/s1600/DataConnectionWizard7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://2.bp.blogspot.com/-YbtHSgkJBw4/TnnQbG5WjpI/AAAAAAAAAbo/zF5RyK_6DEY/s400/DataConnectionWizard7.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;10. That's it. Quite a few steps, but the wizard interface breaks all of the options down into an easily digestible set of steps.&lt;br /&gt;&lt;br /&gt;I'll go over how to actually use the web service in a future post. (Code free!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-8955840907852303848?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/consuming-siebel-web-services-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/8955840907852303848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/8955840907852303848'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/consuming-siebel-web-services-with.html' title='Consuming Siebel Web Services with InfoPath'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-svHpRE-FsUg/TnnQaCoLB7I/AAAAAAAAAbU/CoVnIbjJEP4/s72-c/DataConnections.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-4435630928587397327</id><published>2011-09-14T20:46:00.001-05:00</published><updated>2011-09-21T06:45:54.159-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Infopath Integration with Siebel</title><content type='html'>I have worked out the front half of the integration with Infopath: the creation, prepopulation and launching of the infopath form. I'll write about that in a separate article. However, I've been scratching my head on the back half of the integration: saving the form and updating Siebel.&lt;br /&gt;&lt;br /&gt;The basis of the workflow is to use Siebel as workflow and assignment. Data capture will take place in InfoPath:&amp;nbsp; the number of data capture points is very large and subject to complex rules - a perfect fit in my mind. The interesting part is how we want to push the data capture in two directions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;the XML document that is generated will be stored in a Sharepoint document repository (but linked to via a SR attachment url)&lt;/li&gt;&lt;li&gt;data captured in the form should drive elements in Siebel such as Service Request Due Date (commit time) and priority. In addition, if the data capture indicates multiple followup steps (they almost all do), then activity plans should be attached to the Service Request.&lt;/li&gt;&lt;/ol&gt;While InfoPath has a &lt;a href="http://msdn.microsoft.com/en-us/library/gg435971.aspx"&gt;very rich object model&lt;/a&gt; and supports C# coding, adding any code immediately requires the form to be digitally signed. Do-able but not fun, and I don't want to start messing around with certificates, especially if non-programmers are going to be designing the forms primarily. Thus my objective with InfoPath is to be "code-free" and base all of the logic on the built in rules-engine for&lt;a href="http://office.microsoft.com/en-us/infopath-help/CH001109704.aspx"&gt; decision making logic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The one limitation of the InfoPath rules when calling secondary data sources is that we are limited to setting values on nodes, not creating nodes. So for example - I have a Siebel Service Request Integration Object that has a ListOfActivityPlan node with a one to many relationship with the child activity plans, I can't create additional activity plan nodes from within the form rules, I would have to resort to code thus violating my rule above.&lt;br /&gt;&lt;br /&gt;I thought about this one quite a while and considered a number of options:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;http posting the entire InfoPath form into Siebel and then writing a complex business service, or workflow to handle the logic of deciding what activity plans need to be attached.&lt;/li&gt;&lt;li&gt;send the form to an asynchronous middleware system which could do the necessary transformations into a Siebel SR Integration object. I didn't like this one because the user might be disoriented that the plan didn't generate synchronously. This would be frustrating for the user if they had to reassign an activity but had to keep re-querying the applet until the plan(s) was/were attached.&lt;/li&gt;&lt;li&gt;write a very simple web service interface for Siebel based on a custom (simple) external schema that allowed for one activity plan to be attached per call.&lt;/li&gt;&lt;/ol&gt;I decided on the last approach as it was the simplest and still kept the business logic in the form beside the data that drives the logic. (I'm sure there are arguments to externalizing the logic but this was the direction we went in) The one downside is that if there are multiple plans to attach, then multiple web services have to be called with the resultant performance hit. I'm willing to take it on the chin for that given the other trade-offs.&lt;br /&gt;&lt;br /&gt;This is what I have so far:&lt;br /&gt;InfoPathServices.xsd - this holds the request/response pairs for the web service. I consider this to be a contract-first approach that is in line with how Siebel is architected.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ew9QA9o1NFs/TnFVU6IZpPI/AAAAAAAAAa8/hyi8L7_dh_M/s1600/SRAttachActivityPlanRequest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://3.bp.blogspot.com/-Ew9QA9o1NFs/TnFVU6IZpPI/AAAAAAAAAa8/hyi8L7_dh_M/s400/SRAttachActivityPlanRequest.png" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MYauQ2M3TKE/TnFVjP_e9tI/AAAAAAAAAbA/uMlwgbASk0M/s1600/SRAttachActivityPlanResponse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="78" src="http://2.bp.blogspot.com/-MYauQ2M3TKE/TnFVjP_e9tI/AAAAAAAAAbA/uMlwgbASk0M/s400/SRAttachActivityPlanResponse.png" width="400" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;These were then added to Siebel using the new object dialog:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CQ2eptMUnaE/TnFWG5ipZUI/AAAAAAAAAbE/t0R9gM3BZyI/s1600/NewEAIObject.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="294" src="http://1.bp.blogspot.com/-CQ2eptMUnaE/TnFWG5ipZUI/AAAAAAAAAbE/t0R9gM3BZyI/s320/NewEAIObject.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Then I used the Integration Object Builder. I picked a project and then I used the EAI XSD Wizard to import the integration object from the xsd file.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-G3oohRMjn7s/TnFWg70ARyI/AAAAAAAAAbI/qcCdyGzEYpg/s1600/IntegrationObjectBuilder.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="261" src="http://4.bp.blogspot.com/-G3oohRMjn7s/TnFWg70ARyI/AAAAAAAAAbI/qcCdyGzEYpg/s400/IntegrationObjectBuilder.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Pick the element that you want to import, give it a unique name in the repository, click next a couple of times and you will have some new entries in you integration object list.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I'm using a workflow for my web service, so I defined the in and out process properties to be the integration objects I just created. The image below shows what I have so far; it isn't complete because I need to create the outbound object, but it's close and it simulates well.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gEZvsmfqv-4/TnFYPwUEr-I/AAAAAAAAAbM/naD5rIC98NQ/s1600/Infopath+workflow.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://4.bp.blogspot.com/-gEZvsmfqv-4/TnFYPwUEr-I/AAAAAAAAAbM/naD5rIC98NQ/s640/Infopath+workflow.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Note: I used the Workflow Utilities.Echo method to get the values out of the integration object. This was tricky because of the 75 character limit for "dot" notation. I used the Alias data type to define the XPath-ish retrieval pattern and I was able to get my properties.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I also know that I could have used the transformation engine to create an integration object, but that was more work than this approach. If my inbound object had more than a couple of fields I would have either used the DTE or xslt to do a transformation.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-4435630928587397327?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/infopath-integration-with-siebel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4435630928587397327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4435630928587397327'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/infopath-integration-with-siebel.html' title='Infopath Integration with Siebel'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Ew9QA9o1NFs/TnFVU6IZpPI/AAAAAAAAAa8/hyi8L7_dh_M/s72-c/SRAttachActivityPlanRequest.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-2419425439370627483</id><published>2011-09-12T13:21:00.000-05:00</published><updated>2011-09-12T18:44:04.719-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Configuring the MSMQ Receiver Component</title><content type='html'>Understanding and configuring Named Subsystems is critical for successful use of the EAI Transports. This is a powerful yet relatively misunderstood part of the Siebel Architecture.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ucr8Fw01K_E/Tm5J6gBqFUI/AAAAAAAAAa4/mD_srOh0CeY/s1600/Named+Subsystems.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://3.bp.blogspot.com/-ucr8Fw01K_E/Tm5J6gBqFUI/AAAAAAAAAa4/mD_srOh0CeY/s400/Named+Subsystems.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;@lex at Siebel Essentials has a great article on &lt;a href="http://siebel-essentials.blogspot.com/2011/09/siebel-enterprise-profiles-aka-named.html"&gt;Named Subsystems&lt;/a&gt; so I won't repeat what he said best.&lt;br /&gt;&lt;br /&gt;However there are few things that will still cause to you pull your hair out: Advanced parameters - these aren't visible in the UI and can only be managed using the command line tool. Get to know srvrmgr.exe it is your friend - really.&lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;To work effectively with the tool, make sure you spool out the results and then use an external editor to view the query results. I use &lt;a href="http://www.baremetalsoft.com/baretail/"&gt;BareTail&lt;/a&gt; as it automatically scrolls. One can also limit the columns that are emitted, but that requires remembering each column specifically and then adding those to the command when executing.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;list advanced parameters for named subsystem MSMQReceiver&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;If using a dispatch ruleset (highly recommended), this is where you set the name of the ruleset&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;change parameter RollbackOnDispatchError=False for named subsystem MSMQDataSubsys&lt;/span&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Xml Converter service - when working with the dispatch service ensure that the ConverterService parameter is set to "EAI XML Converter"&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;change parameter ConverterService="EAI XMLConverter" for named subsystem MSMQDataSubsys&lt;/span&gt;&lt;/blockquote&gt;Once your Subsystems are configured you can create (or modify the existing) background component to use these subsystems:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Receiver Data Handling Subsyst" parameter&lt;/li&gt;&lt;li&gt;"Receiver Connection Subsystem parameter&lt;/li&gt;&lt;/ul&gt;You will then still need to specify the Receiver method name to work with the data handling and connection subsystems.&lt;br /&gt;I used ReceiveDispatch as I wanted to use a rules based routing approach (the workflow process/BS is specified in the rule) with a separate return path. One can also specify ReceiveDispatchSend to use same connection parameters for a response.&lt;br /&gt;&lt;br /&gt;Thanks &lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-2419425439370627483?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/configuring-msmq-receiver-component.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/2419425439370627483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/2419425439370627483'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/configuring-msmq-receiver-component.html' title='Configuring the MSMQ Receiver Component'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ucr8Fw01K_E/Tm5J6gBqFUI/AAAAAAAAAa4/mD_srOh0CeY/s72-c/Named+Subsystems.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-2814582097821954997</id><published>2011-09-06T10:32:00.001-05:00</published><updated>2011-09-08T15:04:16.354-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Multiple repositories in Siebel Tools</title><content type='html'>Normally one develops using a single repository but upon occasion - especially when working with support - there is a need to do some testing and/or comparisons with the vanilla repository.&lt;br /&gt;&lt;br /&gt;One approach is to load the repository into the Server Db using "Repository Migration Configuration Utility" with a new name - such as "Siebel Repository - Vanilla". Then one can connect to the server db using tools and export sif files for comparisons. This works well for comparisons, but if one is wanting to check for that one "breaking change", then being able to make a quick local change to the repository to then do a compile, managing multiple local repositories is preferable.&lt;br /&gt;&lt;br /&gt;Managing Multiple repositories: there are actually two ways of doing this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Maintain multiple local databases and multiple tools configurations&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Con: unable to use the Compare Objects --&amp;gt; Other repository command&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Single database with multiple repositories integrated&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Pro: able to use the Compare Objects --&amp;gt; Other Repository command&lt;/li&gt;&lt;li&gt; Pro: easy to switch between repositories in one window&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;I use the second approach as it is a little simpler to manage.&lt;br /&gt;&lt;br /&gt;Steps to extract a second repository into your local database (all steps take place within Siebel Tools):&lt;br /&gt;1. Tools --&amp;gt; Check Out&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-MUM7XxHzOSA/TmY6YNOzSRI/AAAAAAAAAak/nlMCYOhaJ8I/s1600/Check+out+dialog.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-MUM7XxHzOSA/TmY6YNOzSRI/AAAAAAAAAak/nlMCYOhaJ8I/s400/Check+out+dialog.gif" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Check out dialog&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-E4NIAmrpepc/TmY6XcIlicI/AAAAAAAAAac/m43_y7t6wsQ/s1600/Check+out+dialog+2.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="296" src="http://3.bp.blogspot.com/-E4NIAmrpepc/TmY6XcIlicI/AAAAAAAAAac/m43_y7t6wsQ/s400/Check+out+dialog+2.gif" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Choose repository&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GdhD_eIlSiE/TmY6X0pVNCI/AAAAAAAAAag/i01H3tfXods/s1600/Check+out+dialog+3.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-GdhD_eIlSiE/TmY6X0pVNCI/AAAAAAAAAag/i01H3tfXods/s400/Check+out+dialog+3.gif" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Click on Get&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;After clicking on get some warning dialogs appear:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-y4tCVq1elAo/TmY6YW7xx-I/AAAAAAAAAao/GI2C0qyic_w/s1600/Warning+1.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="215" src="http://2.bp.blogspot.com/-y4tCVq1elAo/TmY6YW7xx-I/AAAAAAAAAao/GI2C0qyic_w/s400/Warning+1.gif" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Initial warning&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-81yQfVC1uU4/TmY6YqlGCmI/AAAAAAAAAas/gBXsEP-_JxM/s1600/Warning+2.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="99" src="http://1.bp.blogspot.com/-81yQfVC1uU4/TmY6YqlGCmI/AAAAAAAAAas/gBXsEP-_JxM/s640/Warning+2.gif" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Second warning&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;These warnings can be dismissed without concern.&lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uTkhFkFfnLA/TmY6ZMyN-0I/AAAAAAAAAaw/SiSgRZcLdac/s1600/Warning+3.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="152" src="http://3.bp.blogspot.com/-uTkhFkFfnLA/TmY6ZMyN-0I/AAAAAAAAAaw/SiSgRZcLdac/s640/Warning+3.gif" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Final Warning&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Finally after the Get has completed, this dialog appears that indicates you have multiple repositories including one that isn't active.&lt;/div&gt;&lt;br /&gt;After I've retrieved the repository I'll lock it locally, make a change and cut a new SRF. If I put it on the server I'll be able to do a quick check to see if that one change was the "breaking change" and is invaluable for providing the feedback to Oracle Support.&lt;br /&gt;&lt;br /&gt;[Edit]&lt;br /&gt;&lt;br /&gt;I posted a link to this article on a &lt;a href="http://www.blogger.com/%20http://www.linkedin.com/groups/MyOracleSupport-MOS-Siebel-CRM-3961379?goback=%2Egde_3961379_member_69558548"&gt;LinkedIn Group &lt;/a&gt;and the group's created (an Oracle Support engineer) commented, pointing to the following link in Oracle support:&lt;br /&gt;&lt;br /&gt;&lt;span class="comment-body" data-li-comment-text=""&gt;Multiple Repositories Causes Task Based UI (TBUI) Field To Not Show Any Values [ID 1297783.1]&amp;nbsp;                    &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Please keep that in mind when using multiple repositories - thanks Valter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-2814582097821954997?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/multiple-repositories-in-siebel-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/2814582097821954997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/2814582097821954997'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/multiple-repositories-in-siebel-tools.html' title='Multiple repositories in Siebel Tools'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-MUM7XxHzOSA/TmY6YNOzSRI/AAAAAAAAAak/nlMCYOhaJ8I/s72-c/Check+out+dialog.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-6092733305563672436</id><published>2011-09-05T21:49:00.000-05:00</published><updated>2011-09-05T11:50:48.838-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>MSMQ Inbound Integration</title><content type='html'>We have built a custom middleware solution at our organization that leverages MSMQ for a lot of workload balancing internally. We have also started to push the MSMQ concept to our application partners as we find that it provides a resiliency to network outages and the various maintenance windows that are required for patches and upgrades.&lt;br /&gt;&lt;br /&gt;We haven't done much MSMQ work with Siebel until recently as there wasn't much documentation on the MSMQ transport. However, given the potential, we recently invested the time and effort to make this happen.&lt;br /&gt;&lt;br /&gt;These are the requirements that the middleware imposed:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;have one inbound queue on our Siebel application server&lt;/li&gt;&lt;li&gt;this one inbound queue would be the channel for multiple message types that might require different processing in Siebel.&lt;/li&gt;&lt;li&gt;once processing is complete (or an exception takes place) processing status for the inbound message needs to be echoed back to the middleware server to a specific message queue &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hA7EHSmw9LA/TmT1omIMLTI/AAAAAAAAAaY/sXVz6nTEOA4/s1600/Message+Queuing+with+Siebel+Architecture.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="346" src="http://2.bp.blogspot.com/-hA7EHSmw9LA/TmT1omIMLTI/AAAAAAAAAaY/sXVz6nTEOA4/s400/Message+Queuing+with+Siebel+Architecture.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The diagram above illustrates the components and the flow of control and data.&lt;br /&gt;&lt;br /&gt;Important points:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; The MSMQ Receiver is configured as Receive and Dispatch and not Receive, Dispatch and Send as I wanted to specify a different response queue depending on the situation.&lt;/li&gt;&lt;li&gt;Using the EAI Dispatcher allows the design to accommodate multiple workflow processes based on incoming data. It also allows for parameter injection into the invoked workflow process. (I've found other methods of making workflows environment agnostic, but this is great!)&lt;/li&gt;&lt;li&gt;Sending acknowledgement using an asynch server request is key so that the original message can be committed off the queue - this took me a long time to figure out.&lt;/li&gt;&lt;/ol&gt;Sending a response was packaged into a workflow process that accepts a message id plus some sort of error message if required. This is then sent back to the middleware system using a standard xml document contract as an xsd/integration object. Middleware then knows to remove the sent message from its internal processing queues.&lt;br /&gt;Getting the right xml converter configured on the MSMQ Receiver was important for the dispatcher so that the (quasi) xpath rules would function properly. In this case the following search expression worked.&lt;br /&gt;&lt;blockquote&gt;/*/SiebelMessage/ListOfShippingHistoryIO&lt;/blockquote&gt;The "/*/" at the beginning accomodates the Siebel-Property-Set root node.&lt;br /&gt;&lt;br /&gt;This setup is working well - it's high performance and outage resilient. Just remember to set a reasonable Time-to-recieve on the MSMQ message so that if there is a problem on the Siebel side, the message will bounce back to the sender.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-6092733305563672436?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/msmq-inbound-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/6092733305563672436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/6092733305563672436'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/msmq-inbound-integration.html' title='MSMQ Inbound Integration'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hA7EHSmw9LA/TmT1omIMLTI/AAAAAAAAAaY/sXVz6nTEOA4/s72-c/Message+Queuing+with+Siebel+Architecture.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-1794502993026049730</id><published>2011-09-04T22:09:00.000-05:00</published><updated>2011-09-12T12:32:03.608-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>EAI HTTP Transport</title><content type='html'>&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;Little known fact: the HTTP transport supports PUT in addition to the documented GET and POST. Just set the HTTPRequestMethod parameter to the literal PUT.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;Also, for bonus points the transport supports NTLM authentication out of the box. There is an Oracle Support tic&lt;/span&gt;&lt;span style="font-size: small;"&gt;ket (&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;[ID 758617.1]) that indicates that it is not, but that is wrong. I did a Wireshark capture from our Siebel server and found that not only did it support NTLM, but it pre-authenticated thus reducing the number of round trips that are required.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;---&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;These undocumented facts were discovered while attempting to integrate InfoPath and Sharepoint with Siebel. As part of our process to bind the products together I need to create an instance xml document of an InfoPath form and then upload it to Sharepoint (thereby storing only the link in the SR attachments table).&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;Several approaches were taken with varying complexity, but none with satisfaction until I discovered that the HTTP Transport supported PUT. (the instance document is created by an xslt on the server) &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;1. Have the workflow process save the instance document to a webdav share from sharepoint. It works from windows explorer but not from the EAI File Transport Send method.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;2. I explored using the Sharepoint web service API's and creating a Java business service - the complexity was too high for something this simple. It had a code smell to it that I didn't like. Plus this would be our first Java business service so there would have to be a significant server deployment footprint.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;3. Use the MSXMLHTTP COM object in a custom business service. The code is dead easy b/c sharepoint supports a simple PUT method to a document library. I was in the process of starting to code the new business service when I decided to just "Try" inserting the PUT into the business service method arg.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;&lt;span style="font-weight: normal;"&gt;So, if your target server want an HTTP PUT you &lt;b&gt;can&lt;/b&gt; use it using the built in HTTP Transport. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-1794502993026049730?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/09/eai-http-transport.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1794502993026049730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1794502993026049730'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/09/eai-http-transport.html' title='EAI HTTP Transport'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-1597220052169172331</id><published>2011-08-30T13:04:00.000-05:00</published><updated>2011-08-30T13:12:11.477-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Infopath and Siebel integration</title><content type='html'>Why would one want to integrate InfoPath and Siebel? Here are some reasons that I thought of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Siebel data is highly structured - it's a relational database after all&lt;/li&gt;&lt;li&gt;InfoPath is based on semi-structured data - it's document focused&lt;/li&gt;&lt;li&gt;Siebel releases take months&lt;/li&gt;&lt;li&gt;InfoPath forms can be updated and released the same day&lt;/li&gt;&lt;/ul&gt;InfoPath may already be in use as a flexible data capture tool that can be line of business and process specific. It has a great declarative designer that can be used by non-programmers and technical BA's. Also, because it's based on XML, the form data can travel wherever XML is accepted.&lt;br /&gt;&lt;br /&gt;Siebel on the other hand is a great work package management tool in &lt;b&gt;directing&lt;/b&gt; and &lt;b&gt;assigning&lt;/b&gt; work to teams and users. It manages the life cycle of work. Stitching the two tools together is not so easy and requires a bit of thinking for how things need to work together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-1597220052169172331?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/08/infopath-and-siebel-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1597220052169172331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1597220052169172331'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/08/infopath-and-siebel-integration.html' title='Infopath and Siebel integration'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-4301277400446807191</id><published>2011-08-30T12:50:00.000-05:00</published><updated>2011-08-30T12:50:14.711-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><title type='text'>Siebel Workflow Wait steps for input validation</title><content type='html'>One of the most common requests I see involve comparing old row values to proposed row values. This is used in input validation or conditional execution of business logic.&lt;br /&gt;&lt;br /&gt;For instance, we wanted to trigger the update to the employee profile if an activity status changed from one status to another status.&lt;br /&gt;&lt;br /&gt;This is easily achieved through code using the PreSetFieldValue and WriteRecord events using a shared variable in the buscomp code. In looking for a workflow approach I was able to use a simple workflow that used the Workflow Utilities.Echo method, right after the start step and then right after a wait step with the WriteRecord event attached to it. Simple, see the picture below for an example with a workflow using the Asset Management business object:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--7-76sDWSRU/Tl0h89ZK_tI/AAAAAAAAAaQ/4nQdY28UqCU/s1600/Workflow.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--7-76sDWSRU/Tl0h89ZK_tI/AAAAAAAAAaQ/4nQdY28UqCU/s1600/Workflow.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Get Original Value step output argument is configured like this:&lt;br /&gt;&lt;br /&gt;Property Name: &lt;b&gt;OriginalStatus&lt;/b&gt;&lt;br /&gt;Type: &lt;b&gt;Business Component&lt;/b&gt;&lt;br /&gt;Business Component Name: &lt;b&gt;Asset Mgmt - Asset&lt;/b&gt;&lt;br /&gt;Business Component Field: &lt;b&gt;Status&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Get New Value step output argument is configured like this:&lt;br /&gt;Property Name: &lt;b&gt;NewStatus&lt;/b&gt;&lt;br /&gt;Type: &lt;b&gt;Business Component&lt;/b&gt;&lt;br /&gt;Business Component Name: &lt;b&gt;Asset Mgmt - Asset&lt;/b&gt;&lt;br /&gt;Business Component Field: &lt;b&gt;Status&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This approach works well if you are capturing the events on the primary buscomp of your business object. For example: the Asset Mgmt - Asset bc of the Asset Management bo. Great!&lt;br /&gt;&lt;br /&gt;What if you want to capture the events of a child bc. Not so easy - after trolling around Oracle support I came across one document that looked promising: &lt;a href="https://support.oracle.com/CSP/ui/flash.html#tab=KBHome%28page=KBHome&amp;amp;id=%28%29%29,%28page=KBNavigator&amp;amp;id=%28bmDocID=496724.1&amp;amp;bmDocTitle=Object%20Id%20set%20to%20the%20Row%20Id%20of%20parent%20record%20when%20process%20invoked%20using%20runtime%20event.&amp;amp;viewingMode=1143&amp;amp;bmDocDsrc=KB&amp;amp;bmDocType=PROBLEM&amp;amp;from=BOOKMARK%29%29"&gt;[ID 496724.1]&lt;/a&gt;. The problem with this approach is that I was unable to get the values &lt;b&gt;before&lt;/b&gt; the write event, in other words, when the wait step was reached the values had already been copied into the BC.&lt;br /&gt;&lt;br /&gt;I updated my workflow to include a Workflow Utilities.Echo step before the wait step, but instead of retrieving the values from the BC, I used the expression syntax. It worked beautifully. &lt;br /&gt;&lt;br /&gt;The Get Original Value step is configured with output args like this: &lt;br /&gt;Property Name: &lt;b&gt;OriginalStatus&lt;/b&gt;&lt;br /&gt;Type: &lt;b&gt;Expression&lt;/b&gt;&lt;br /&gt;Business Component Name: &lt;b&gt;Asset Mgmt - Asset&lt;/b&gt;&lt;br /&gt;Value: [&lt;b&gt;Status]&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Get New Value step output argument is configured like this:&lt;br /&gt;Property Name: &lt;b&gt;NewStatus&lt;/b&gt;&lt;br /&gt;Type: &lt;b&gt;Expression&lt;/b&gt;&lt;br /&gt;Business Component Name: &lt;b&gt;Asset Mgmt - Asset&lt;/b&gt;&lt;br /&gt;Value: [&lt;b&gt;Status]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-4301277400446807191?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2011/08/siebel-workflow-wait-steps-for-input.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4301277400446807191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4301277400446807191'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2011/08/siebel-workflow-wait-steps-for-input.html' title='Siebel Workflow Wait steps for input validation'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--7-76sDWSRU/Tl0h89ZK_tI/AAAAAAAAAaQ/4nQdY28UqCU/s72-c/Workflow.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-974718606348525182</id><published>2010-09-30T11:59:00.000-05:00</published><updated>2010-09-30T12:08:37.849-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Siebel'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='MSSQL'/><title type='text'>Siebel script export</title><content type='html'>From time to time, it would be very useful to conduct code analysis on the script that is buried within the multiple tables of the Siebel Repositories.&lt;br /&gt;Things like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;line count&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;code complexity calculations&lt;/a&gt; (edge detection)&lt;/li&gt;&lt;li&gt;release over release comparisons&lt;br /&gt;&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;Getting the code out of the repository is a pain. I can use the repository search functionality to find specific things, but its tough.&lt;br /&gt;To solve this I fired up my sql editor and using the xml features of sql 2005, I built a query that exports the script into a big xml document.&lt;br /&gt;One can then run xslt's or other scripts against the code file.&lt;br /&gt;Below is the script:&lt;br /&gt;&lt;br /&gt;DECLARE @APPLET_BROWSER XML&lt;br /&gt;DECLARE @APPLET_SERVER XML&lt;br /&gt;DECLARE @BUSINESS_COMP_BROWSER XML&lt;br /&gt;DECLARE @BUSINESS_COMP_SERVER XML&lt;br /&gt;DECLARE @BUSINESS_SERVICE_BROWSER XML&lt;br /&gt;DECLARE @BUSINESS_SERVICE_SERVER XML&lt;br /&gt;DECLARE @APPLICATION_BROWSER XML&lt;br /&gt;DECLARE @APPLICATION_SERVER XML&lt;br /&gt;&lt;br /&gt;SET @APPLET_SERVER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Applet Browser Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_APLT_BRSSCRPT D&lt;br /&gt;                    WHERE D.APPLET_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_APPLET A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_APLT_BRSSCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.APPLET_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @APPLET_BROWSER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Applet Server Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_APPL_WEBSCRPT D&lt;br /&gt;                    WHERE D.APPLET_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    ORDER BY SEQUENCE&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_APPLET A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_APPL_WEBSCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.APPLET_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @BUSINESS_COMP_SERVER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Business Component Server Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_BUSCOMP_SCRIPT D&lt;br /&gt;                    WHERE D.BUSCOMP_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    ORDER BY SEQUENCE&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_BUSCOMP A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_BUSCOMP_SCRIPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.BUSCOMP_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @BUSINESS_COMP_BROWSER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Business Component Browser Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_BC_BRS_SCRPT D&lt;br /&gt;                    WHERE D.BUSCOMP_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_BUSCOMP A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_BC_BRS_SCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.BUSCOMP_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @BUSINESS_SERVICE_SERVER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Business Service Server Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_SERVICE_SCRPT D&lt;br /&gt;                    WHERE D.SERVICE_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    ORDER BY SEQUENCE&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_SERVICE A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_SERVICE_SCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.SERVICE_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @BUSINESS_SERVICE_BROWSER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Business Service Browser Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_SVC_BRS_SCRPT D&lt;br /&gt;                    WHERE D.SERVICE_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_SERVICE A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_SVC_BRS_SCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.SERVICE_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @APPLICATION_SERVER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Application Server Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_APPL_SCRIPT D&lt;br /&gt;                    WHERE D.APPLICATION_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    ORDER BY SEQUENCE&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_APPLICATION A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_APPL_SCRIPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.APPLICATION_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;SET @APPLICATION_BROWSER =&lt;br /&gt;    (&lt;br /&gt;        SELECT&lt;br /&gt;            'Application Browser Script' "@name",&lt;br /&gt;            (&lt;br /&gt;            SELECT&lt;br /&gt;                A.NAME "@Name",&lt;br /&gt;                (&lt;br /&gt;                    SELECT&lt;br /&gt;                        D.NAME "@name",&lt;br /&gt;                        D.LAST_UPD "@lastUpdated",&lt;br /&gt;                        D.SCRIPT "text()"&lt;br /&gt;                    FROM S_APPL_BRSSCRPT D&lt;br /&gt;                    WHERE D.APPLICATION_ID = A.ROW_ID AND D.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;                    FOR XML PATH('Method'), Type&lt;br /&gt;                )&lt;br /&gt;            FROM S_APPLICATION A&lt;br /&gt;                INNER JOIN S_REPOSITORY C ON A.REPOSITORY_ID = C.ROW_ID&lt;br /&gt;            WHERE&lt;br /&gt;                C.NAME = 'Siebel Repository'&lt;br /&gt;                AND A.INACTIVE_FLG = 'N'&lt;br /&gt;                AND EXISTS(SELECT * FROM S_APPL_BRSSCRPT B WHERE B.INACTIVE_FLG = 'N' AND A.ROW_ID = B.APPLICATION_ID)&lt;br /&gt;            FOR XML PATH('Object'), Type&lt;br /&gt;            )&lt;br /&gt;        FOR XML PATH('Type')&lt;br /&gt;    )&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;SELECT @BUSINESS_COMP_SERVER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @BUSINESS_COMP_BROWSER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @BUSINESS_SERVICE_SERVER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @BUSINESS_SERVICE_BROWSER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @APPLICATION_SERVER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @APPLICATION_BROWSER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @APPLET_BROWSER.query('//Type')&lt;br /&gt;UNION ALL&lt;br /&gt;SELECT @APPLET_SERVER.query('//Type')&lt;br /&gt;FOR XML PATH(''), ROOT('Scripting'), TYPE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-974718606348525182?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2010/09/siebel-script-export.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/974718606348525182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/974718606348525182'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2010/09/siebel-script-export.html' title='Siebel script export'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-6844006949228042938</id><published>2009-07-16T22:59:00.000-05:00</published><updated>2009-07-16T23:09:54.649-05:00</updated><title type='text'>Patterns in enterprise integration architecture</title><content type='html'>I have been working with Siebel for about 8 years now and I must admit that while I enjoy developing solutions for my organization in Siebel, I actually only spend about 20-30% of my time actually with Siebel. As I'm sure most Siebel architects will agree, large enterprise CRM products become a hub of a companies data architecture. This really means that the remaining 70-80% of my time is spent on integrating Siebel with other internal systems.&lt;br /&gt;&lt;br /&gt;This is my true passion. I love making data flow between systems and was introduced to EAI toolsets about 6 and 1/2 years ago with SeeBeyond and the &lt;yech&gt;BizTalk 2000&lt;/yech&gt;. What those tools taught me, is that integrating should be focused on the business process flow and not the plumbing.&lt;br /&gt;&lt;br /&gt;At the time, I was managing a whole constellation of crappy VB6 apps that were inconsistently written, had different alerting mechanisms (some wrote to the event log, some sent email, some wrote log files, some called out to Blat for god sake).&lt;br /&gt;&lt;br /&gt;I knew there had to be a better way and really got sucked up into finding one.&lt;br /&gt;&lt;br /&gt;Along the way I discovered that the problems that I was looking at were not unique - of course not - every good programmer know the GOF patterns, but what I also found was the excellent work by Gregor Hohpe and Bobby Woolf. I swear by this book. I take it to every meeting with executives and managers.&lt;br /&gt;&lt;br /&gt;The patterns are great and I must say that the layout and structure of the book is very unique. It is the most accessible and friendly patterns book I've ever seen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width: 361px; height: 154px;" align="left" border="0" cellpadding="1" cellspacing="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://amazon.com/o/asin/0321200683/ref=nosim/enterpriseint-20" target="_blank"&gt;&lt;img src="http://www.eaipatterns.com/img/0321200683.gif" alt="Enterprise Integration Patterns" style="padding-right: 5px; padding-bottom: 5px;" align="left" border="0" /&gt;&lt;/a&gt;&lt;a href="http://amazon.com/o/asin/0321200683/ref=nosim/enterpriseint-20" target="_blank"&gt;Enterprise Integration Patterns&lt;/a&gt;&lt;br /&gt;        Gregor Hohpe and Bobby Woolf&lt;br /&gt;        ISBN 0321200683&lt;br /&gt;        650 pages&lt;br /&gt;        Addison-Wesley         &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-6844006949228042938?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2009/07/patterns-in-enterprise-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/6844006949228042938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/6844006949228042938'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2009/07/patterns-in-enterprise-integration.html' title='Patterns in enterprise integration architecture'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-1832308675160275807</id><published>2009-07-02T14:39:00.000-05:00</published><updated>2009-07-02T14:46:53.470-05:00</updated><title type='text'>Executing Webservices in Siebel</title><content type='html'>I've been bashing my head about trying to stay scriptless when calling an outbound web service from Siebel 7.8.&lt;br /&gt;&lt;br /&gt;I think I've found a neat way which is basically what &lt;a href="http://siebelunleashed.com/invoking-outbound-web-service/"&gt;this link&lt;/a&gt; and &lt;a href="http://www.siebelintegration.com/tutorials/index.php/eai/how-to-test-outbound-web-services/"&gt;this link&lt;/a&gt; show. What was missing was the ability to set the type to XXXopertation:parameters on the message. Based on what I was just doing, it doesn't look one needs to.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x8W_DHPm7o0/Sk0OOJgK9_I/AAAAAAAAAIY/YkoSLNFwhsw/s1600-h/workflow.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 54px;" src="http://2.bp.blogspot.com/_x8W_DHPm7o0/Sk0OOJgK9_I/AAAAAAAAAIY/YkoSLNFwhsw/s400/workflow.png" alt="" id="BLOGGER_PHOTO_ID_5353951168245200882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The workflow above shows that we can use the PRM AMI services to get the blank integration object and then directly call the web service. In addition I'm doing some kung fu in order to send an integration object (account interface) to an external web service (hosted in BizTalk) which I have to append to the operation integration object. Fun stuff.&lt;br /&gt;&lt;br /&gt;Sweet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-1832308675160275807?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2009/07/executing-webservices-in-siebel.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1832308675160275807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/1832308675160275807'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2009/07/executing-webservices-in-siebel.html' title='Executing Webservices in Siebel'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_x8W_DHPm7o0/Sk0OOJgK9_I/AAAAAAAAAIY/YkoSLNFwhsw/s72-c/workflow.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8690984107363989409.post-4177873901194343521</id><published>2009-01-02T09:43:00.001-06:00</published><updated>2009-01-02T09:43:42.591-06:00</updated><title type='text'>First Post</title><content type='html'>This is the obligitory first post, indicating that its the first post.&lt;br /&gt;&lt;br /&gt;Thanks&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8690984107363989409-4177873901194343521?l=codegrok.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://codegrok.blogspot.com/2009/01/first-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4177873901194343521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8690984107363989409/posts/default/4177873901194343521'/><link rel='alternate' type='text/html' href='http://codegrok.blogspot.com/2009/01/first-post.html' title='First Post'/><author><name>Gavin Hay</name><uri>http://www.blogger.com/profile/05853051870332446785</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
