<?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-3293958249891822491</id><updated>2011-11-27T16:43:23.086-08:00</updated><category term='Event Driven'/><category term='New'/><category term='Filter'/><category term='Remove'/><category term='MOSS 2007'/><category term='List Menu'/><category term='wss'/><category term='SharePoint'/><category term='SharePoint State Machine Workflow SPWorkflowTask.AlterTask'/><category term='web parts'/><category term='wf'/><category term='Fields'/><category term='Custom List Definition'/><category term='ASPX'/><title type='text'>L5R, Developement, Roleplaying, welcome to my life</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-1330068074626976181</id><published>2009-01-26T05:44:00.001-08:00</published><updated>2009-01-26T05:44:59.772-08:00</updated><title type='text'>Solace</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_er1dl9eh-8I/SX2-T8iWSsI/AAAAAAAAAK8/OGYryp6n6xA/s1600-h/gview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://1.bp.blogspot.com/_er1dl9eh-8I/SX2-T8iWSsI/AAAAAAAAAK8/OGYryp6n6xA/s400/gview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5295597986734557890" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-1330068074626976181?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/1330068074626976181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=1330068074626976181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1330068074626976181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1330068074626976181'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2009/01/solace.html' title='Solace'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_er1dl9eh-8I/SX2-T8iWSsI/AAAAAAAAAK8/OGYryp6n6xA/s72-c/gview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-1343408645880193696</id><published>2009-01-26T05:43:00.000-08:00</published><updated>2009-01-26T05:44:01.091-08:00</updated><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_er1dl9eh-8I/SX2-GhYWP_I/AAAAAAAAAK0/VM-nf04Gpeg/s1600-h/gview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_er1dl9eh-8I/SX2-GhYWP_I/AAAAAAAAAK0/VM-nf04Gpeg/s400/gview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5295597756106555378" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-1343408645880193696?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/1343408645880193696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=1343408645880193696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1343408645880193696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1343408645880193696'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2009/01/blog-post.html' title=''/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_er1dl9eh-8I/SX2-GhYWP_I/AAAAAAAAAK0/VM-nf04Gpeg/s72-c/gview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-4147063117648242302</id><published>2008-10-20T06:18:00.000-07:00</published><updated>2008-10-20T06:19:05.762-07:00</updated><title type='text'>Moving....</title><content type='html'>I'm moving my technical content posts to a new home:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dotnet.org.za/mariewessels/"&gt;http://dotnet.org.za/mariewessels/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-4147063117648242302?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/4147063117648242302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=4147063117648242302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/4147063117648242302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/4147063117648242302'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2008/10/moving.html' title='Moving....'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-6384753757854897888</id><published>2008-05-20T07:05:00.000-07:00</published><updated>2008-05-20T07:29:45.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wss'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom List Definition'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Customizing the New Form toolbar</title><content type='html'>&lt;div&gt;So, here's the requirement:&lt;br /&gt;&lt;br /&gt;Add a control (for arguements sake a link button) to the NewForm.aspx toolbar for a specific list definition.&lt;br /&gt;&lt;br /&gt;Sounds simple doesn't it? And in fact it is simple... Still took me 3 days to figure out!!&lt;br /&gt;&lt;br /&gt;What you need to do is a write an web user control that defines how you want your toolbar to look like via a SharePoint rendering template. Something like this: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_er1dl9eh-8I/SDLfVfOBZxI/AAAAAAAAAHQ/TmvYIOInxHg/s1600-h/Code.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5202466079816902418" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_er1dl9eh-8I/SDLfVfOBZxI/AAAAAAAAAHQ/TmvYIOInxHg/s400/Code.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Note the name of the rendering template - CustomToolBar&lt;br /&gt;Note also the fact that the attachment button and the link button both lack ID tags.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Right. Save that .ascx file to C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES&lt;br /&gt;&lt;br /&gt;iisreset&lt;br /&gt;&lt;br /&gt;Now, in your list schema, look riiiiiiiight at the bottom for the forms tag. See this tag? &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&amp;lt;form type="NewForm" url="NewForm.aspx" webpartzoneid="Main"/&amp;gt;&lt;br /&gt;&lt;br /&gt;You need to add a ToolbarTemplate attribute. Why did this take me three days? Because the toolbartemplate attribute is not declared!!!! It will be underlined in blue, but the solution will deploy. Don't try this in a content type, the content type feature will not be activated.&lt;br /&gt;&lt;br /&gt;Anyway, at the end your NewForm declaration should look something like this:&lt;br /&gt;&amp;lt;form type="NewForm" url="NewForm.aspx" webpartzoneid="Main" toolbartemplate="CustomToolBar"/&amp;gt;&lt;br /&gt;&lt;br /&gt;And what you end up with should be:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_er1dl9eh-8I/SDLdofOBZwI/AAAAAAAAAHI/lKOE1mPeOWk/s1600-h/NewFormModified.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5202464207211161346" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_er1dl9eh-8I/SDLdofOBZwI/AAAAAAAAAHI/lKOE1mPeOWk/s400/NewFormModified.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-6384753757854897888?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/6384753757854897888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=6384753757854897888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/6384753757854897888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/6384753757854897888'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2008/05/customizing-new-form-toolbar.html' title='Customizing the New Form toolbar'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_er1dl9eh-8I/SDLfVfOBZxI/AAAAAAAAAHQ/TmvYIOInxHg/s72-c/Code.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-5178988281113167322</id><published>2008-03-05T04:09:00.000-08:00</published><updated>2008-03-05T05:40:06.391-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wss'/><category scheme='http://www.blogger.com/atom/ns#' term='ASPX'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><category scheme='http://www.blogger.com/atom/ns#' term='web parts'/><title type='text'>ASPX Pages as SharePoint Features</title><content type='html'>So here’s the requirement:&lt;br /&gt;You need a custom page in SharePoint (WSS 3.0) that must do something. For arguments sake, we’ll say it needs to allow a user to select information from some data source via a combo box and use that to populate a list.&lt;br /&gt;How do you do this?&lt;br /&gt;Part 1: Develop the web part.&lt;br /&gt;Part 2: Create the web page.&lt;br /&gt;Part 3: Add the web page as a feature to your site collection.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Part 1:&lt;br /&gt;&lt;/strong&gt;1. Create a new Visual Studio SharePoint project.&lt;br /&gt;2. Add a web part to the project. For the purposes of my demonstration, I’ve created a web part that has a text box (for the list title), a drop down list populated by ten items and an ok button (code at the end of this part).&lt;br /&gt;3. Deploy the web part to your site (in VS, just select deploy from the build menu. This should also create the setup.bat file &amp;amp; the MOSS solution, making future deployment incredibly easy).&lt;br /&gt;4. Create a new web part page in your MOSS site.&lt;br /&gt;5. Create a custom list with fields that match the fields you want to update (in my case, the title text field and an additional text field to hold my selected value).&lt;br /&gt;6. Add the web part to your newly created MOSS page.&lt;br /&gt;7. Test.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Runtime.InteropServices;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Xml.Serialization;&lt;br /&gt;&lt;br /&gt;using Microsoft.SharePoint;&lt;br /&gt;using Microsoft.SharePoint.WebControls;&lt;br /&gt;using Microsoft.SharePoint.WebPartPages;&lt;br /&gt;&lt;br /&gt;namespace AddItem&lt;br /&gt;{&lt;br /&gt;[Guid("8f9851d9-c748-4806-b912-addd7a51beaf")]&lt;br /&gt;public class AddItem : System.Web.UI.WebControls.WebParts.WebPart&lt;br /&gt;{&lt;br /&gt;protected DropDownList ddlAvailableValues;&lt;br /&gt;protected System.Web.UI.WebControls.TextBox txtItemTitle;&lt;br /&gt;protected System.Web.UI.WebControls.Button btnAddItem;&lt;br /&gt;&lt;br /&gt;public AddItem()&lt;br /&gt;{&lt;br /&gt;this.ExportMode = WebPartExportMode.All;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected override void CreateChildControls()&lt;br /&gt;{&lt;br /&gt;base.CreateChildControls();&lt;br /&gt;&lt;br /&gt;ddlAvailableValues = new DropDownList();&lt;br /&gt;ListItem[] memoryItems = new ListItem[11];&lt;br /&gt;memoryItems[0] = new System.Web.UI.WebControls.ListItem("Please select a list item", "0"); &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for(int i = 1; i &lt; l =" new" value =" i.ToString();" text =" string.Format(" cssclass = "ms-RadioText" txtitemtitle =" new" cssclass = "ms-long" btnadditem =" new" text = "OK" cssclass = "ms-ButtonHeightWidth" bloglist =" SPContext.Current.Web.Lists[" item =" blogList.Items.Add();"&gt;&lt;br /&gt;My web part looks like this:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_er1dl9eh-8I/R86dO46uFbI/AAAAAAAAAD4/NYbGRy7orTM/s1600-h/BlogMarch.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5174245901017683378" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_er1dl9eh-8I/R86dO46uFbI/AAAAAAAAAD4/NYbGRy7orTM/s400/BlogMarch.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;strong&gt;Part 2:&lt;/strong&gt;&lt;br /&gt;So far so good. Now we come to the “let’s cheat to make this easy part”. Hehe, I knew you’d like that.&lt;br /&gt;You don’t want your web part page lying around in the library right? You want it to be part of your site collection, prefrably as a feature. That would be the ideal.&lt;br /&gt;So, we fire up SharePoint Designer.&lt;br /&gt;We open up the web part page that we created and added the web part to.&lt;br /&gt;We copy the ASPX code.&lt;br /&gt;We create a new ASPX file in the windows directory we want to use as our feature deployment folder (in my case BlogPages).&lt;br /&gt;We copy the code into the new ASPX file.&lt;br /&gt;And that creates our ASPX file. Now for ease of deployment.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Part 3: &lt;/strong&gt;&lt;br /&gt;Create a feature file.&lt;br /&gt;Create an element manifest.&lt;br /&gt;Deploy the feature (I do this via a setup.bat file that resides in the parent directory above my BlogPages directory).&lt;br /&gt;Now, on the site you deployed the feature on, enter the URL of the page, for instance: &lt;a href="http://servername/blog.aspx"&gt;http://servername&lt;server&gt;/blog.aspx&lt;/a&gt;&lt;br /&gt;And there you are. The page is part of your site, activated as a feature.&lt;br /&gt;Life is beautiful.&lt;br /&gt;&lt;br /&gt;My files for all this:&lt;br /&gt;&lt;br /&gt;&lt;table style="width:100%"&gt;&lt;tr&gt;&lt;td&gt;&lt;u&gt;feature.xml&lt;/u&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_er1dl9eh-8I/R86hPo6uFcI/AAAAAAAAAEA/GIvXstVYmVo/s1600-h/featureMarch.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5174250311949096386" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_er1dl9eh-8I/R86hPo6uFcI/AAAAAAAAAEA/GIvXstVYmVo/s400/featureMarch.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;u&gt;elements.xml&lt;/u&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_er1dl9eh-8I/R86hWI6uFdI/AAAAAAAAAEI/46yVm6ku2jA/s1600-h/elementsMarch.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5174250423618246098" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_er1dl9eh-8I/R86hWI6uFdI/AAAAAAAAAEI/46yVm6ku2jA/s400/elementsMarch.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;u&gt;setup.bat&lt;/u&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;Set stsadm="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm.exe"&lt;br /&gt;Set url="&lt;site&gt;"&lt;br /&gt;Set featureFolder="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\BlogPages\"&lt;br /&gt;&lt;br /&gt;%stsadm% -o deactivatefeature -name BlogPages -url %url%&lt;br /&gt;%stsadm% -o uninstallfeature -name BlogPages&lt;br /&gt;&lt;br /&gt;rd /s %featureFolder% /q&lt;br /&gt;&lt;br /&gt;xcopy /e "Feature\*" "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\"&lt;br /&gt;&lt;br /&gt;%stsadm% -o installfeature -name BlogPages&lt;br /&gt;&lt;br /&gt;%stsadm% -o activatefeature -name BlogPages -url %url%&lt;br /&gt;&lt;br /&gt;pause&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-5178988281113167322?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/5178988281113167322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=5178988281113167322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5178988281113167322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5178988281113167322'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2008/03/aspx-pages-as-sharepoint-features.html' title='ASPX Pages as SharePoint Features'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_er1dl9eh-8I/R86dO46uFbI/AAAAAAAAAD4/NYbGRy7orTM/s72-c/BlogMarch.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-1447260415946730570</id><published>2008-01-24T06:53:00.000-08:00</published><updated>2008-01-24T07:13:40.898-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filter'/><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Custom List Definition'/><category scheme='http://www.blogger.com/atom/ns#' term='Fields'/><title type='text'>Displaying a field for only the author of a list item.</title><content type='html'>Here is the problem: I need to display a custom list field for only the author of a discussion post.&lt;br /&gt;&lt;br /&gt;Easy you say? Not so much when you have a custom list definition. You need to get hold of author ID and then compare it to the current user id, in the schema.xml&lt;br /&gt;&lt;br /&gt;Getting hold of the author's id has to be done via the Lookup Column. Isn't that fun? Now my field is a checkbox allowing the user to close the discussion.&lt;br /&gt;&lt;br /&gt;The important bit of code is:&lt;br /&gt;&amp;lt;displaypattern&gt;&lt;br /&gt;&amp;lt;ifequal&gt;&lt;br /&gt;&amp;lt;expr1&gt;&lt;br /&gt;&amp;lt;lookupcolumn name="Author" showfield="ID"&gt;&lt;br /&gt;&amp;lt;expr1&gt;&lt;br /&gt;&amp;lt;expr2&gt;&lt;br /&gt;&amp;lt;UserId/&gt;&lt;br /&gt;&amp;lt;/expr2&gt;&lt;br /&gt;&lt;br /&gt;So a pretty short post but usefull I think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-1447260415946730570?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/1447260415946730570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=1447260415946730570' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1447260415946730570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1447260415946730570'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2008/01/displaying-field-for-only-author-of.html' title='Displaying a field for only the author of a list item.'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-829094843190063043</id><published>2008-01-02T01:16:00.000-08:00</published><updated>2008-01-02T22:40:24.583-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='List Menu'/><category scheme='http://www.blogger.com/atom/ns#' term='Remove'/><category scheme='http://www.blogger.com/atom/ns#' term='New'/><category scheme='http://www.blogger.com/atom/ns#' term='MOSS 2007'/><title type='text'>Removing the New action from a MOSS List</title><content type='html'>So I had an interesting problem with the new project. The client wants an application that uses the dicussion board functionality, but with alot of additional functionality. Amoung other things, the ability to create new dicusssions on the discussion board itself should not be available.&lt;br /&gt;&lt;br /&gt;I played around with alot of ideas, using security and disallowing everyone from creating new discussions, using CSS etc, but in the end the answer was surprisingly simple.&lt;br /&gt;&lt;br /&gt;I found a javascript function on someone's blog (I'd credit him if I could find it again, too many blogs &amp;amp; Christmas &amp;amp; New Year in between). This javascript function, when added to master page, removed all New items from list menus that are document library types.&lt;br /&gt;&lt;br /&gt;Ok, not exactly what I want, but at least a start. So I tried modding the javascript to work with my new feature off the masterpage. No luck. Then I played around with the CEWP, adding it to my forum. Worked like a charm, but I need to add alot of functionality besides this one and I could just extend the new template list with it's CEWP added.&lt;br /&gt;&lt;br /&gt;Finally, the solution I found was: Add the javascript to the AllItems.aspx page of my forum, to the content area of the main place holder. Success!&lt;br /&gt;&lt;br /&gt;This is the javascript:&lt;br /&gt;&lt;br /&gt;function HideNewQADiscussionMenuItem()&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;var tables = document.getElementsByTagName("table");&lt;br /&gt;for(var i=0; i&lt;&gt; 0 )&lt;br /&gt;{&lt;br /&gt;var elm = tables[i];&lt;br /&gt;elm.parentElement.parentElement.style.display="none";&lt;br /&gt;elm.parentElement.parentElement.nextSibling.style.display="none";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;catch(e)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;And here's how it fits in:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_er1dl9eh-8I/R3teEGYCtPI/AAAAAAAAADM/f5Fws1gMo9Y/s1600-h/Blog+-+HideNew.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5150814023352235250" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_er1dl9eh-8I/R3teEGYCtPI/AAAAAAAAADM/f5Fws1gMo9Y/s400/Blog+-+HideNew.JPG" border="0" /&gt;&lt;/a&gt; The last line is:&lt;br /&gt;if(!document.all){ window.onload=HideNewQADiscussionMenuItem; }else{ HideNewQADiscussionMenuItem(); }&lt;/p&gt;&lt;p&gt;This makes sure the javascript is called when the page is loaded. And that removes the New fucntion from the top menu of my dicussion forum.&lt;/p&gt;&lt;p&gt;Step by Step:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create a new visual studio project, select List Definition from the SharePoint projects. Select the basic list to inherit from, in my case Discussions. This creates all ASPX files &amp;amp; XML files needed for a list definition.&lt;/li&gt;&lt;li&gt;Open the AllItems.aspx file&lt;/li&gt;&lt;li&gt;Find the PlaceHolderMain content tag.&lt;/li&gt;&lt;li&gt;Below the web part zone, add the javascript. Remember the javascript tag &amp;amp; the line of code to make sure the javascript is called (I couldn't figure out why my script wasn't being called :P )&lt;/li&gt;&lt;li&gt;Build &amp;amp; Deploy the solution (Visual Studio should have this option under the build menu, if it doesn't, you deploy the list definition as a feature).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And that's that. Your new list is ready for use. Of course, you now need some way to create new list items :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_er1dl9eh-8I/R3tdeGYCtOI/AAAAAAAAADE/RVWPcgKJ4uo/s1600-h/Blog+-+HideNew.JPG"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-829094843190063043?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/829094843190063043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=829094843190063043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/829094843190063043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/829094843190063043'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2008/01/removing-new-action-from-moss-list.html' title='Removing the New action from a MOSS List'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_er1dl9eh-8I/R3teEGYCtPI/AAAAAAAAADM/f5Fws1gMo9Y/s72-c/Blog+-+HideNew.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-5419704316115287384</id><published>2007-12-21T23:08:00.000-08:00</published><updated>2007-12-21T23:33:07.317-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SharePoint State Machine Workflow SPWorkflowTask.AlterTask'/><title type='text'>Leave Workflow - The Final Trick</title><content type='html'>Unfortuantly, I've had to rebuild my machine &amp;amp; I lost my leave workflow example in the process, but I'm sure you have a good idea how to build a state machine workflow.&lt;br /&gt;&lt;br /&gt;To update tasks via the API, use SPWorkflowTask.AlterTask and this is where the final trick comes in.&lt;br /&gt;&lt;br /&gt;One final tip, there is a bug in WF SharePoint framework (note: I have NOT tried this with Service Pack 1, if SP1 does fix it, please let me know). Essentially, if there is more than one version of the workflow associated with an item, sometimes the workflow will go into an error state with the following message:&lt;br /&gt;&lt;br /&gt;"The task is locked by another user and cannot be updated".&lt;br /&gt;&lt;br /&gt;So SPWorkflowTask.AlterTask has this problem, how do we fix it? Easy enough, right a static method that looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class MyWorkflowTask&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static bool AlterTask(SPListItem task, Hashtable htData, bool fSynchronous, int attempts, int millisecondsTimeout)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((int)task[SPBuiltInFieldId.WorkflowVersion] != 1)&lt;br /&gt;&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;SPList parentList = task.ParentList.ParentWeb.Lists[new Guid(task [SPBuiltInFieldId.WorkflowListId].ToString())];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPListItem parentItem = parentList.Items.GetItemById((int)task[SPBuiltInFieldId.WorkflowItemId]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &lt; attempts; i++)&lt;br /&gt;&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;SPWorkflow workflow = parentItem.Workflows[new Guid(task[SPBuiltInFieldId.WorkflowInstanceID].ToString())];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!workflow.IsLocked)&lt;br /&gt;&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;task[SPBuiltInFieldId.WorkflowVersion] = 1;&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;task.SystemUpdate();&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;break;&lt;br /&gt;&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;if (i != attempts - 1)&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;nbspThread.Sleep(millisecondsTimeout);&lt;br /&gt;&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return SPWorkflowTask.AlterTask(task, htData, fSynchronous);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;task.SystemUpdate() is the big override.  It will override anything, so use this knowledge with care!!!!&lt;br /&gt;&lt;br /&gt;And that's that, you should now be able to put togethere a basic state machine workflow without to much in the way of trouble.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-5419704316115287384?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/5419704316115287384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=5419704316115287384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5419704316115287384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5419704316115287384'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/12/leave-workflow-final-trick.html' title='Leave Workflow - The Final Trick'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-3300544287245545413</id><published>2007-09-11T00:31:00.000-07:00</published><updated>2007-09-11T01:44:32.711-07:00</updated><title type='text'>Leave workflow - Logging &amp; Submitting</title><content type='html'>&lt;div&gt;&lt;div&gt;Finally, I have time again! With a successful live implementation of WF under my belt, let's return to the leave workflow example.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Last time, we had managed to create the complete leave application task, but now, we actually want to submit the task to the approver and log what is happening in the workflow.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;First, let's add a sharepoint user group called Leave Linemanagers.&lt;/div&gt;&lt;div&gt;Second, let's add some columns to the Leave Applications list:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Line Manager - a people selection column restricted to the leave linemanager group.&lt;/li&gt;&lt;li&gt;Start Date - a date that defaults to today&lt;/li&gt;&lt;li&gt;End Date - a date that defaults to today&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Make sure all the columns are required!&lt;/p&gt;&lt;p&gt;Now, open up the leave workflow solution. To the eventDrivenActivity1 in the InitializeLeaveState add a LogToHistoryListActivity called logLeaveCreated. Bind the HistoryDescription field to a new field calld HistoryDescription, the HistoryOutcome field to a new field calld HistoryOutcome and the UserId to a new field called HistoryUserID&lt;/p&gt;&lt;p&gt;Then go to the code behind and modify the createApplicantTask_MethodInvoking event so that it looks something like this:&lt;br /&gt;&lt;br /&gt;private void setHistory(string description, string outcome, int logginUserID)&lt;br /&gt;{&lt;br /&gt;HistoryDescription = description;&lt;br /&gt;HistoryOutcome = outcome;&lt;br /&gt;HistoryUserID = logginUserID;&lt;br /&gt;}&lt;br /&gt;private void createApplicantTask_MethodInvoking(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;applicantTaskID = Guid.NewGuid();&lt;br /&gt;createApplicantTask_TaskProperties1.AssignedTo = this.workflowProperties.Originator;&lt;br /&gt;createApplicantTask_TaskProperties1.Description = "Complete your leave application";&lt;br /&gt;createApplicantTask_TaskProperties1.Title = "Leave Application";&lt;br /&gt;setHistory(string.Format("Leave application created by {0} on {1}",&lt;br /&gt;this.workflowProperties.OriginatorUser.Name, DateTime.Today),"Created",&lt;br /&gt;this.workflowProperties.OriginatorUser.ID);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;That takes care of logging. Next, we want to move the ApplicantEditing state. Add a Sharepoint SetState activity and set the state field to be ApplicantEditing. We are done with the InitializeLeaveState!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There should be a line drawn from InitializeLeaveState to ApplicantEditing on the main canvas of the workflow. This line is the result of adding the SetState activity. Now, the applicant can edit his task and eventually submit it. So, first add and event driven activity to the ApplicantEditing state. Call it InitiatorUpdating. To the InitiatorUpdating activity add a on task changed activity which will listen for any changes made to the task. So our state will re-activate after a change occurs in some task. Which task? Well, we want to the listen for the initiator task changing, so configure the ontaskchanged activity so that the correlation token is the same as the initial create task activity and the TaskId is bound to the applicantTaskID. Bind the AfterProperties field to a new field called onApplicantTaskEdited_AfterProperties. Now the activity will listen for any task changes to our initial task.&lt;/p&gt;&lt;p&gt;What to do when we catch the changed event?  Goto the code behind and add a variable&lt;br /&gt;public bool isApplicantDone = false; &lt;br /&gt;Next add a static string&lt;br /&gt;private static string CompletedTaskStatus = "Completed";&lt;br /&gt;Now we need our event listener method. &lt;br /&gt;&lt;br /&gt;private void onApplicantTaskEdited_Invoked(object sender, ExternalDataEventArgs e)&lt;br /&gt;{&lt;br /&gt;isApplicantDone = (onApplicantTaskEdited_AfterProperties.ExtendedProperties[this.workflowProperties.TaskList.Fields["Status"].Id].ToString() == CompletedTaskStatus);&lt;br /&gt;}&lt;br /&gt;So, if the status of the task is set to completed, we isApplicantDone will be set to true.  &lt;/p&gt;&lt;p&gt;Go back to the canvas, open up InitiatorUpdating again. &lt;br /&gt;Set onApplicantTaskEdited MethodInvoking property to onApplicantTaskEdited_Invoked. &lt;br /&gt;Add an IfElse activity just beneath onApplicantTaskEdited.  Rename the first branch to ifApplicantIsDone and the second branch to ifApplicantNotDone.  &lt;/p&gt;&lt;p&gt;Set the Condition of ifApplicantIsDone to a Declarative Rules Condition and add a declarative rule condition called ApplicantDone such that:  this.isApplicantDone == True&lt;/p&gt;&lt;p&gt;The second branch is the default branch, so it doesn't need a condition, much like the else of a normal if statement.  If the applicant is not done, we want to remain in our current state, so to the ifApplicantNotDone branch, add a SetState activity and set the TargetStateName to ApplicantEditing.&lt;/p&gt;&lt;p&gt;The first branch of the IfElse activity, ifApplicantIsDone, is much more interesting. If our leave applicant is ready to submit his leave application, we must create a task for his line manager to approve the leave, log the submission and move to the LineManagerApproval state.  But what if the task for the line manager has already been created?  As in:  Applicant submits task - Line manager declines, Applicant resubmits.  We don't want to recreate the task!  So in that case, we must update the already created task.&lt;/p&gt;&lt;p&gt;So in ifApplicantIsDone, add an IfElse activity.  Rename the first branch to ifApproverTaskCreated and the second branch to ifApproverTaskNotCreated.  Set ifApproverTaskCreated condition to Code Condition and create the following method for the condition:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;private void isLineManagerTaskCreated(object sender, ConditionalEventArgs e)&lt;br /&gt;{&lt;br /&gt;if (lineMangerTaskID != default(System.Guid))&lt;br /&gt;e.Result = true;&lt;br /&gt;else&lt;br /&gt;e.Result = false;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;So, if the task has been created, we want to update the task.  Add an UpdateTask activity called updateLineManagerTask to the ifApproverTaskCreated branch.  Add a CreateTask activity called createLineManagerTask to the ifApproverTaskNotCreated branch. &lt;br /&gt;First set up createLineManagerTask as follows:&lt;br /&gt;Correlation Token:  Create a new correlation token called LineManagerTaskToken&lt;br /&gt;TaskId:  New field called lineManagerTaskID&lt;br /&gt;TaskProperties:  New Field called createLineManagerTask_TaskProperties&lt;br /&gt;Set up updateLineManagerTask to use the same fields.  Now, go to the code behind and add the following methods:&lt;br /&gt;&lt;br /&gt;private void createLineMangerTask_MethodInvoking(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;lineMangerTaskID = Guid.NewGuid();&lt;br /&gt;setLineManagerTask();&lt;br /&gt;}&lt;br /&gt;private void updateLineManagerTask_MethodInvoking(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;setLineManagerTask();&lt;br /&gt;}&lt;br /&gt;private void setLineManagerTask()&lt;br /&gt;{&lt;br /&gt;hasLineManagerApproved = false;&lt;br /&gt;hasLineManagerApproved = false;&lt;br /&gt;createLineMangerTask_TaskProperties.Title = string.Format("Leave Approval - {0}",&lt;br /&gt;this.workflowProperties.Item.Title);&lt;br /&gt;createLineMangerTask_TaskProperties.AssignedTo = getUser(this.workflowProperties.Item["Line Manager"].ToString()).LoginName;&lt;br /&gt;createLineMangerTask_TaskProperties.Description = string.Format("A leave request by {0} has been created. &lt;br /&gt;Leave start date: {1} &lt;br /&gt; Leave end date: {2} &lt;br /&gt; Please action the task as soon as possible.",&lt;br /&gt;this.workflowProperties.OriginatorUser.Name, this.workflowProperties.Item["Start Date"].ToString(), this.workflowProperties.Item["End Date"].ToString());&lt;br /&gt;setHistory(string.Format("Leave application submitted for line manager approval on {0}",&lt;br /&gt;DateTime.Today),&lt;br /&gt;"Line Manager Approval",&lt;br /&gt;this.workflowProperties.OriginatorUser.ID);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;private SPUser getUser(string fieldValue)&lt;br /&gt;{&lt;br /&gt;if (fieldValue.Contains(";"))&lt;br /&gt;{&lt;br /&gt;int userID = -1;&lt;br /&gt;int.TryParse(fieldValue.Substring(0, fieldValue.IndexOf(";")), out userID);&lt;br /&gt;if (userID != -1)&lt;br /&gt;{&lt;br /&gt;return this.workflowProperties.Web.AllUsers.GetByID(userID);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return null;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Set updateLineMangaerTask MethodInvoking to updateLineManagerTask_MethodInvoking and createLineManagerTask MethodInvoking to createLineMangerTask_MethodInvoking.  That should take care of our task.&lt;br /&gt;Next add a LogToHistoryListActivity, bind it to the history description, outcome and user id fields perviously created.&lt;br /&gt;Finally add a SetState activity to take us to the LineManagerApproval state.&lt;/p&gt;&lt;p&gt;One final step remains before looking at approval and declining.  Exception handling.  Each state must have it's own exception handler.  Right click on InitiatorUpdating event driven activity and select view fault handlers. &lt;br /&gt;Add a new faultHandlerActivity called applicantEditingFaultHandler.&lt;br /&gt;In this example, I'm just going to log the exception message &amp; stack trace to the history list, but you could do whatever you like to handle the errors in some other way if you need to.&lt;br /&gt;First set appplicantEditingFaultHandler's FaultType to System.Exception, so we'll catch all exceptions.  Next add to LogToHistoryListActivities, one called logFault and one called logStackTrace.&lt;br /&gt;Configure logFault's description to log as follows:&lt;br /&gt;Activity=applicantEditingFaultHandler, Path=Fault.Message  (click on the ellipses, open up applicantEditingFaultHandler, find the Fault variable, select message).&lt;br /&gt;Set History Outcome to ApplicantFault.&lt;br /&gt;Do the same for logStackTrace, except, select the Fault.StackTrace field.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Compile the project, unintall the previous assembly from the GAC, install the new one to the GAC, issreset (or recycle the sharepoint application pool) test:&lt;br /&gt;Create a new entry to the leave applications list.&lt;br /&gt;Open up the workflowstatus for the entry.&lt;br /&gt;Edit the task that has been created.&lt;br /&gt;Set the status to Completed and save the change.&lt;br /&gt;A new task should be created assigned to the line manager you selected for your entry.&lt;br /&gt;Your log list should have two entries:&lt;br /&gt;&lt;br /&gt;9/10/2007 3:45 PM&lt;br /&gt;Comment&lt;br /&gt;&lt;a onclick="GoToLink(this);return false;" href="http://jedimaster/leave/_layouts/userdisp.aspx?ID=1"&gt;JEDIMASTER\Administrator&lt;/a&gt;&lt;br /&gt;Leave application created by JEDIMASTER\Administrator on 2007/09/10 12:00:00 AM&lt;br /&gt;Created&lt;/p&gt;&lt;p&gt;&lt;br /&gt;9/10/2007 3:45 PM&lt;br /&gt;Comment&lt;br /&gt;&lt;a onclick="GoToLink(this);return false;" href="http://jedimaster/leave/_layouts/userdisp.aspx?ID=1"&gt;JEDIMASTER\Administrator&lt;/a&gt;&lt;br /&gt;Leave application submitted for line manager approval on 2007/09/10 12:00:00 AM&lt;br /&gt;Line Manager Approval&lt;br /&gt;&lt;br /&gt;If you need to debug, attach to the w3wp.exe process, make sure your Attach to field in the Attach to Process dialogue window is set to Workflow code.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-3300544287245545413?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/3300544287245545413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=3300544287245545413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/3300544287245545413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/3300544287245545413'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/09/leave-workflow-logging-submitting.html' title='Leave workflow - Logging &amp; Submitting'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-1785356058401823026</id><published>2007-07-26T21:59:00.000-07:00</published><updated>2007-07-27T00:22:10.414-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wss'/><category scheme='http://www.blogger.com/atom/ns#' term='Event Driven'/><category scheme='http://www.blogger.com/atom/ns#' term='wf'/><title type='text'>Event Driven WF &amp; WSS</title><content type='html'>So that technical post is finally here.&lt;br /&gt;&lt;br /&gt;I've seen alot of posts recently about sharepoint and sequintial workflows, but precious little concerning sharepoint and event driven state machine workflows. But my current application requires a state machine workflow, so I'll share some of my experiances.&lt;br /&gt;&lt;br /&gt;Let's use an example to illustrate. I'm developing a leave request application. After someone submits a request for leave, it must be approved by their line manager and by their current project manager and finally by the HR manager.&lt;br /&gt;&lt;br /&gt;Any one of the approvers can refer the leave application back to the orginiator with a request to change the leave application in some way. If the originator resubmits, the workflow process must go throug the approval once again.&lt;br /&gt;At any time before approval, the leave originator may cancel the request for leave.&lt;br /&gt;&lt;br /&gt;Sound complicate? It's not. I'm not going to address the front end needs, you can use either ASPX or infopath and there are plenty of posts out there to show you how to hook up a front end to sharepoint. I'm just going to play around with sharepoint lists to provide a front end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, how do we approach this? Well, firstly, ensure that you've got WSS, VS 2005, WF Extensions for VS 2005 &amp; WSS Extensions for VS 2005 installed on your dev machine (it just runs smoother that way).&lt;br /&gt;Open up VS 2005. Create a new project of type State Machine Workflow Library as found under the sharepoint tab.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_er1dl9eh-8I/RqmKAFKOGYI/AAAAAAAAAB4/84WHHNRxa5I/s1600-h/Choose+a+State+Machine+Workflow.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5091752587708733826" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_er1dl9eh-8I/RqmKAFKOGYI/AAAAAAAAAB4/84WHHNRxa5I/s320/Choose+a+State+Machine+Workflow.JPG" border="0" /&gt;&lt;/a&gt; Call your solution LeaveApplication and your state machine library LeaveStateMachineFlow. Click OK.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You should now have a project with Workflow1.cs, feature.xml, workflow.xml &amp; Install.bat. Rename Workflow1 to LeaveWorkflow.cs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our workflow has 6 states.&lt;br /&gt;&lt;br /&gt;1. Initial State.&lt;br /&gt;2. Applicant Editing.&lt;br /&gt;3. Project Manager Approval.&lt;br /&gt;4. Line Manager Approval.&lt;br /&gt;5. HR Manager Approval.&lt;br /&gt;6. Finalize.&lt;br /&gt;&lt;br /&gt;You don't need the finalize state, but let's complete the workflow. We're going to start by developing only the initial state and the applicant editing state. So, let's get to work (no pun intended :) ).&lt;br /&gt;Open up the LeaveWorkflow.cs file. You'll note that an initial state activity has already been added along with an event driven activity. We'll just change the names rather than adding new one. So change the name of the state activity to InitializeLeaveState. Open up the eventDrivenActivity1 by clicking on it. You should see something like this:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_er1dl9eh-8I/RqmOaFKOGaI/AAAAAAAAACI/5QNZYvo3ALM/s1600-h/InitializeStateWithErrors.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5091757432431843746" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_er1dl9eh-8I/RqmOaFKOGaI/AAAAAAAAACI/5QNZYvo3ALM/s320/InitializeStateWithErrors.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice the red exclamation marks. Those are errors that need be fixed before build will succeed.&lt;br /&gt;&lt;br /&gt;If you click on the upper most exclamation mark, you'll see an error saying that the state is invalid. This is because we have changed the state name. Click on the error and the properites tab will take you to the correct entry to fix the error. Set the InitialStateName of LeaveWorkflow to InitializeLeaveState.&lt;br /&gt;&lt;br /&gt;The exclamation mark has two errors. the correlation token has no valid owner activity and the workflow properties have no valid name. This is because we changed the workflow name. Set the correlation token owner activity to LeaveWorkflow and the workflow properites name to LeaveWorkflow.&lt;br /&gt;The exclamation marks should dissapear and you should be able to build the solution.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our next step is creating the six states. This is really simple. In your toolbox, there should be a state activity. Drag it onto the design canvas. Rename the state activities to ApplicantEditing, PMApproval, LineManagerApproval, HRApproval and LeaveFinalize. Right click on the finalize activity and mark it as the completed state. You should have something like this:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_er1dl9eh-8I/RqmSh1KOGbI/AAAAAAAAACQ/B3aixWyJnms/s1600-h/states+added.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5091761963622341042" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_er1dl9eh-8I/RqmSh1KOGbI/AAAAAAAAACQ/B3aixWyJnms/s320/states+added.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;We'll ignore the other states for now and focus on creating the leave application.  So, open up the eventDrivenActivity1 again.  On your toolbox, check if you have the CreateTask activity.  If you don't, right click on the toolbox, select Choose Items and select the items from the microsoft.sharepoint.WorkflowActions namespace.&lt;/p&gt;&lt;p&gt;Ok, now that the admin is done, drag the CreateTask activity from the toolbox to below your onWorkflowActivated1 event (this event is required by all sharepoint workflows).  Rename CreateTask1 to createApplicantTask.  Set the correlation token to ApplicantTaskToken and the owner activity as the workflow (so that you can have the task spread over mulitple states).  Set the task ID to be a new field named applicantTaskID (Activity=LeaveWorkflow, Path=applicantTaskID) and the task properties to be a new field named  createApplicantTask_TaskProperties1 (Activity=LeaveWorkflow, Path=createApplicantTask_TaskProperties1).  So far so good.  Now we come to the code.  In your LeaveWorkflow.cs file, adding the following methods:&lt;/p&gt;&lt;p&gt;private void createApplicantTask_MethodInvoking(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;     applicantTaskID = Guid.NewGuid();&lt;br /&gt;     createApplicantTask_TaskProperties1.AssignedTo = this.workflowProperties.Originator;&lt;br /&gt;     createApplicantTask_TaskProperties1.Description = "Complete your leave application";&lt;br /&gt;     createApplicantTask_TaskProperties1.Title = "Leave Application";&lt;br /&gt;}&lt;br /&gt;private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)&lt;br /&gt;{&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Link these methods to the handlers of task creation (creatApplicantTask) and the workflow activated (onWorkflowActivated1) respectivly. This will create a task for the leave applicant to complete his leave application after creation.  Let's see it in action shall we?  First we need to edit the workflow.xml and feature.xml files so that the feature for the workflow is correctly installed.  By the same token, you must edit the Install.bat file.    Your files should look something like this:  (remember, your assembly needs a strong name) (Don't forget snippets for the workflow.xml and the feature.xml, they should already be installed):&lt;/p&gt;&lt;p&gt;workflow.xml:&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8" ?&gt;&lt;br /&gt;&lt;!-- _lcid="1033" _version="12.0.3015" _dal="1" --&gt;&lt;br /&gt;&lt;!-- _LocalBinding --&gt;&lt;br /&gt;&lt;!-- Insert Workflow.xml Code Snippet here. To do this:&lt;br /&gt;1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)&lt;br /&gt;2) Select Snippets-&gt;Windows SharePoint Services Workflow-&gt;Workflow.xml Code --&gt;&lt;br /&gt;&lt;elements xmlns="http://schemas.microsoft.com/sharepoint/"&gt;&lt;br /&gt;&lt;Workflow&lt;br /&gt;    Name="LeaveWorkflow"&lt;br /&gt;    Description="This workflow handles leave approval"&lt;br /&gt;    Id="07235F44-DCF1-4a41-BBEC-77907939678D"&lt;br /&gt;    CodeBesideClass="LeaveStateMachineFlow.LeaveWorkflow"&lt;br /&gt;    CodeBesideAssembly="LeaveStateMachineFlow, Version=1.0.0.0, Culture=neutral,       PublicKeyToken=1851b6189ce8aae4"&gt;&lt;br /&gt;    &lt;categories/&gt;&lt;br /&gt;    &lt;metadata&gt;&lt;br /&gt;&lt;/workflow&gt;&lt;br /&gt;&lt;/elements&gt;&lt;/p&gt;&lt;p&gt;feature.xml:&lt;br /&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;br /&gt;&lt;!-- _lcid="1033" _version="12.0.3111" _dal="1" --&gt;&lt;br /&gt;&lt;!-- _LocalBinding --&gt;&lt;br /&gt;&lt;!-- Insert Feature.xml Code Snippet here. To do this:&lt;br /&gt;1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)&lt;br /&gt;2) Select Snippets-&gt;Windows SharePoint Services Workflow-&gt;Feature.xml Code --&gt;&lt;br /&gt;&lt;Feature Id="512C248D-BF5A-4c54-B3F8-5D0B0A85BA8A"&lt;br /&gt;    Title="LeaveStateMachineFlow"&lt;br /&gt;    Description="This feature is a workflow that approves leave"&lt;br /&gt;    Version="12.0.0.0"&lt;br /&gt;    Scope="Site"&lt;br /&gt;    xmlns="http://schemas.microsoft.com/sharepoint/"&gt;&lt;br /&gt;&lt;elementmanifests&gt;&lt;br /&gt;    &lt;elementmanifest location="workflow.xml"&gt;&lt;br /&gt;&lt;/elementmanifests&gt;&lt;br /&gt;&lt;properties&gt;&lt;br /&gt;    &lt;property key="GloballyAvailable" value="true"&gt;&lt;br /&gt;&lt;/properties&gt;&lt;br /&gt;&lt;/feature&gt;&lt;/p&gt;&lt;p&gt;Install.bat:&lt;br /&gt;&lt;br /&gt;:: Before running this file, sign the assembly in Project properties&lt;br /&gt;::&lt;br /&gt;:: To customize this file, find and replace&lt;br /&gt;:: a) "MyFeature" with your own feature names&lt;br /&gt;:: b) "feature.xml" with the name of your feature.xml file&lt;br /&gt;:: c) "workflow.xml" with the name of your workflow.xml file&lt;br /&gt;:: d) "http://localhost" with the name of the site you wish to publish to&lt;br /&gt;echo Copying the feature...&lt;br /&gt;rd /s /q "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\LeaveStateMachineFlow"&lt;br /&gt;mkdir "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\LeaveStateMachineFlow"&lt;br /&gt;copy /Y feature.xml "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\LeaveStateMachineFlow\"&lt;br /&gt;copy /Y workflow.xml "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\LeaveStateMachineFlow\"&lt;br /&gt;xcopy /s /Y *.aspx "%programfiles%\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS"&lt;br /&gt;echo Adding assemblies to the GAC...&lt;br /&gt;"%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -uf LeaveStateMachineFlow&lt;br /&gt;"%programfiles%\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -if bin\Debug\LeaveStateMachineFlow.dll&lt;br /&gt;:: Note: 64-bit alternative to lines above; uncomment these to install on a 64-bit machine&lt;br /&gt;::"%programfiles% (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -uf LeaveStateMachineFlow&lt;br /&gt;::"%programfiles% (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\gacutil.exe" -if bin\Debug\LeaveStateMachineFlow.dll&lt;br /&gt;&lt;br /&gt;echo Activating the feature...&lt;br /&gt;pushd %programfiles%\common files\microsoft shared\web server extensions\12\bin&lt;br /&gt;::Note: Uncomment these lines if you've modified your deployment xml files or IP forms&lt;br /&gt;::stsadm -o deactivatefeature -filename LeaveStateMachineFlow\feature.xml -url http://localhost&lt;br /&gt;::stsadm -o uninstallfeature -filename LeaveStateMachineFlow\feature.xml&lt;br /&gt;stsadm -o installfeature -filename LeaveStateMachineFlow\feature.xml -force&lt;br /&gt;stsadm -o activatefeature -filename LeaveStateMachineFlow\feature.xml -url http://localhost&lt;br /&gt;&lt;br /&gt;echo Doing an iisreset...&lt;br /&gt;popd&lt;br /&gt;iisreset&lt;/p&gt;&lt;p&gt;Build the project and run the install.bat file.&lt;/p&gt;&lt;p&gt;Now open up your sharepoint site (the same one you installed the feature to).  Create a list with a title, from date and to date (we'll add more stuff later).  Go to the list settings, go to workflows, add the leave workflow and set it to start when a new item is added.  Add a new item to the list and voila a task is added to the initiator's task list.  (It's a good idea to create a new task list for the workflow, just to keep things neat).&lt;/p&gt;&lt;p&gt;To see your tasks and so forth, click on the down arrow of the item, click on workflows, click on your workflow and the task is displayed.&lt;/p&gt;&lt;p&gt;Next post:  How to move from one state to the next (or how to go to the approvers and back).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-1785356058401823026?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/1785356058401823026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=1785356058401823026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1785356058401823026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/1785356058401823026'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/07/event-driven-wf-wss.html' title='Event Driven WF &amp; WSS'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_er1dl9eh-8I/RqmKAFKOGYI/AAAAAAAAAB4/84WHHNRxa5I/s72-c/Choose+a+State+Machine+Workflow.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-3371695179922786049</id><published>2007-06-22T04:02:00.000-07:00</published><updated>2007-06-22T04:05:51.182-07:00</updated><title type='text'>Cape Town First Week</title><content type='html'>Well, the first week in Cape Town has come and gone and I haven't drowned under meetings, so all is well.&lt;br /&gt;&lt;br /&gt;Yeah, I know, technical post.  Not going to happen today, still snowed under for all that most of my anaylis is done.  Now comes writing the functional spec.  Blah.&lt;br /&gt;&lt;br /&gt;On the other hand, the client is great :).  And it's a 15 minute drive to work...ah the luxury of the Cape...15 minutes at 7:45 I might add.  I'm actually working 8 to 5, who'd've thunk it?&lt;br /&gt;&lt;br /&gt;Flying back to Guateng today, back on monday in time for a 9:15 meeting, pretty much rush off the plane and into the meeting.  Boy next week is but PACKED.&lt;br /&gt;&lt;br /&gt;And somewhere I still have to finish my module for ICON (Unwilling Heroes).  Playtest is next weekend!!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-3371695179922786049?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/3371695179922786049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=3371695179922786049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/3371695179922786049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/3371695179922786049'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/06/cape-town-first-week.html' title='Cape Town First Week'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-6602432742822367235</id><published>2007-06-08T01:00:00.000-07:00</published><updated>2007-06-08T01:11:43.934-07:00</updated><title type='text'>TTT touchdown!!!!!!!!!!</title><content type='html'>And it's official, I'm not a business!!!  Hehe.&lt;br /&gt;&lt;br /&gt;My TTT stuff was good for me, got honour in death play set and Kharma in Death playset (after some trading with JP).&lt;br /&gt;&lt;br /&gt;Hoping to get my third assign blame this saturday.  Hmmm, assign blame...kill a courtier and it's YOUR fault, hehehehehe&lt;br /&gt;&lt;br /&gt;On the work front, matters have gotten better.  We're finally semi integrated and just about ready for End to End testing.  Just as well, because my cape town jaunt starts 18 June.  Yep, I'll be commuting 3000 km each week *snickers*&lt;br /&gt;&lt;br /&gt;Kushiel's Justice release date is almost upon us...I can hardly wait.&lt;br /&gt;&lt;br /&gt;I'll post a workflow post soon, almost done with Programming Windows Workflow Foundation  by K. Scott Allen, which is a great book if anyone is interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-6602432742822367235?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/6602432742822367235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=6602432742822367235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/6602432742822367235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/6602432742822367235'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/06/ttt-touchdown.html' title='TTT touchdown!!!!!!!!!!'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3293958249891822491.post-5181923179344838127</id><published>2007-06-01T05:43:00.000-07:00</published><updated>2007-06-01T06:19:36.903-07:00</updated><title type='text'>So still waiting for my stupid TTT order</title><content type='html'>Soooo, still waiting for TNT to get their finger out of their *** and actually clear my order.  My TTT cards have been sitting in Customs for the past week.  Nice eh?&lt;br /&gt;&lt;br /&gt;In the mean time, My Market have been jerking me around and as a due consequence, my current project has just missed UAT deadline.  Charming.&lt;br /&gt;&lt;br /&gt;I've only had 4 hours of sleep because yesterday was a 16 hour work day (yeah, that does include travel 1 hour each way) so I'm feeling grumpier than usual. &lt;br /&gt;&lt;br /&gt;On the upside, tomorrow is roleplaying, I've got an L5R game that's looking to be all kinds of kick ass and Sunday we're having a Drums of War Suicide tourney, YAY!&lt;br /&gt;&lt;br /&gt;I'm finally Level 9 in Kingdom of Loathing, trying to get to the Mysterious Island to get an abridged dictionary to get a bridge to cross to the Orc territory for my level 9 council quest.&lt;br /&gt;&lt;br /&gt;Well, that's all I have time for now, maybe more later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3293958249891822491-5181923179344838127?l=l5randmore.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://l5randmore.blogspot.com/feeds/5181923179344838127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3293958249891822491&amp;postID=5181923179344838127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5181923179344838127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3293958249891822491/posts/default/5181923179344838127'/><link rel='alternate' type='text/html' href='http://l5randmore.blogspot.com/2007/06/so-still-waiting-for-my-stupid-ttt.html' title='So still waiting for my stupid TTT order'/><author><name>Marie Wessels</name><uri>http://www.blogger.com/profile/13221435697840563721</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_er1dl9eh-8I/R2ehBP2NCII/AAAAAAAAACs/syE6EtCJPKA/S220/IconJedi1+copy.jpg'/></author><thr:total>0</thr:total></entry></feed>
