다음을 통해 공유


Training Site Template - Part 2: Workflows

Sean Hey there,

 It's Sean again with another installment of the template development walkthrough. Last time we covered the list schema for the Employee Training Scheduling and Materials template, one of the new Application Templates for Windows SharePoint Services 3.0. In this series I'm showing you how we built one of these templates from the ground up, and today we're going to author all of the training site's workflows using SharePoint Designer. With that done, you'll have built the whole back-end of the template, so in a future installment we'll get our hands dirty with SharePoint's views and forms.

Folder List (Training Site)Open up a fresh installation of the training site in SPD and you'll see the folder list pictured on the right - with the three workflows you'll be creating today in the Workflow Designer. They'll provide some of the rich behavior that you wouldn't see in a static web app, and you won't need to write any code to get it done. Let's get started!

Automatic Reminders

People are forgetful. Computers aren't. So when an instructor comes to your training site to create a course, why should they have to remember when it is? That's where you can come in with this workflow, which we'll set on the Courses list:

  1. In SPD, go to File > New > Workflow...
  2. Name it "Instructor reminder" and attach it to the SharePoint list "Courses"
  3. Check the box to Automatically start this workflow when a new item is created
  4. Click Next > to continue

From here you'll want to create 3 steps which will logically separate our workflow into sets of related actions. Click Add workflow step to move on to the next step, and in each case if you don't see the specific action listed, click the Actions button > More Actions... to see the full list. Additionally I'm using [brackets] to refer to what you need to do in each placeholder.

Also, fx just means the data binding button. You get the same dialog whenever you push Add Lookup to Body in the e-mail builder.

So before you start, first create two variables (click Variables... > Add... to make them), one called "Reminder Time" (Date/Time) and one called "Subject" (String). You'll need them once you get to the individual steps:

  1. First step: name it "Set reminder time"
    1. No conditions
    2. Actions > Add Time to Date - Add -24 hours to [fx :: Current Item, Start Time] (Output to Variable: Reminder Time)
    3. Actions > Build Dynamic String -  Store "RE: [fx :: Current Item, Course Title]" in Variable: Subject
  2. Second step: name it "Send confirmation"
    1. No conditions
    2. Actions > Send an Email - Email [...]
      1. To: Workflow Lookup... :: Current Item, Instructor
      2. Subject: fx :: Current Item, Course Title
      3. Body: This is a confirmation that you are scheduled to teach [Add Lookup to Body :: Current Item, Course Title] on [Add Lookup to Body :: Current Item, Start Time] at [Add Lookup to Body :: Current Item, Location]. For more information, please visit the training site.
  3. Third step: name it "Send reminder about course"
    1. Conditions > Compare Courses field - If Created is less than [fx :: Workflow Data, Variable: Reminder Time]
    2. Actions > Pause Until Date - Pause until [fx :: Workflow Data, Variable: Reminder Time]
    3. Actions > Send an Email - Email [...]
      1. To: same as above
      2. Subject: fx :: Workflow Data, Variable: Subject
      3. Body: This is a reminder that you are scheduled to teach [Add Lookup to Body :: Current Item, Course Title] on [Add Lookup to Body :: Current Item, Start Time] at [Add Lookup to Body :: Current Item, Location] in 24 hours. For more information, please visit the training site.
  4. Click Finish

Make sense? We're sending two reminders to anyone who adds a new item to the Courses list (i.e. an instructor creating a course) - one right when they make it as a confirmation, and another 24 hours before the course is scheduled. And the first step was just to keep the variable assignment separate, there's nothing wrong with doing it in the other steps right before they are used.

We'll want to do a similar reminder for students, but we can do it at the same time that we enforce seating policy (each item in Courses has an Available Seats and Total Seats) since it only really makes sense to send reminders if you actually make it into a course.

Processing Student Registrations

If you try to add a new course by browsing to Courses > New..., you'll see this line in the new form:

And you'll also notice that there's no line for Available Seats or Filled Seats, even though we added those fields to the Courses schema in part one. I'll teach you the trick to hide form items next time, what's important here now is that 0 will be our sentinel value in the workflow to come.

Let's go through this one a bit faster by using some shorthand.

  • ... means I'm referring to a string (probably for those long auto-generated e-mails) that you can find the full text for by opening Attendee registration.xoml in SPD.
  • Courses* means you need to perform a lookup back into the Courses list. To do this, start by pushing fx and pick Source: Courses, at which point you'll see the "Find the List Item" section appear. In that section, match Field: Courses:ID to Value: Registrations:Course ID (use the nearby fx :: Current Item, Course ID).
  • Variable: = anything with a leading Variable: in front of it is a workflow variable that can be found in fx :: Workflow Data.

Start with a new workflow called "Attendee registration," attached to Registrations and triggered when an item is created. Create 7 variables before you begin, 4 of type String (Subject, Confirmation Body, Reminder Body, Reminder Body 2), 2 Date/Time (Reminder Time, Reminder Time 2), and 1 Number (New Filled Seats). From there build out the steps:

  1. "Cache all variables"
    1. No conditions
    2. Actions > Build Dynamic String (x4)
      1. Store ... in Variable: Confirmation Body
      2. Store ... in Variable: Reminder Body
      3. Store ... in Variable: Reminder Body 2
      4. Store ... in Variable: Subject
  2. "Enforce seating policy"
    1. Conditions > Compare any data source (x2)
      1. If [fx :: Courses*, Total Seats] equals 0
      2. or [fx :: Courses*, Filled Seats] is less than [fx :: Courses*, Total Seats]
    2. Actions > Set Workflow Variable (x2)
      1. Set Variable: Reminder Time to [fx :: Courses*, Start Time]
      2. Set Variable: Reminder Time 2 to [fx :: Courses*, End Time]
    3. Actions > Do Calculation - Calculate [fx :: Courses*, Filled Seats] plus 1 (Output to Variable: New Filled Seats)
    4. Actions > Update List Item
      1. List: Courses*
      2. Add... :: Set Filled Seats to Variable: New Filled Seats
    5. Click Add 'Else If' Conditional Branch
    6. No conditions
    7. Actions > Delete Item - Delete item in Registrations (Current Item)
    8. Actions > Stop Workflow - Stop the workflow and log "Course is already full."
  3. "Set reminder time"
    1. No conditions
    2. Actions > Add Time to Date - Add -24 hours to Variable: Reminder Time (Output to Variable: Reminder Time)
  4. "Send confirmation"
    1. No conditions
    2. Actions > Send an Email - Email ...
  5. "Send reminder about course"
    1. Conditions > Compare Registrations field - If Created is less than Variable: Reminder Time
    2. Actions > Pause Until Date - Pause until Variable: Reminder Time
    3. Actions > Send an Email - Email ...
  6. "Send reminder for feedback"
    1. Conditions > Compare Registrations field - If Created is less than Variable: Reminder Time 2
    2. Actions > Pause Until Date - Pause until Variable: Reminder Time 2
    3. Actions > Send an Email - Email ...
  7. "Move to Past Registrations"
    1. No conditions
    2. Actions > Copy List Item - Copy item in Registrations (Current Item) to Past Registrations
    3. Actions > Delete Item - Delete item in Registrations (Current Item)

Yikes, I know. But thankfully that's about as bad as it gets. Here's a brief explanation - a student will register for a course, but they won't get in right away (technically, they get in but they may be kicked out immediately if the seating logic fails). After setting all the variables we check if Total Seats is 0 (unlimited) or greater than Filled Seats (i.e. is there room in the course?). If not, we abort prematurely (delete/stop step two), otherwise we do the math and add 1 to the Filled Seats, send reminders, etc. The last step is the archival in the mirror list Past Registrations, something that will become more evident in part three when we build up the front end.

A Dirty Workflow Secret

That's all well and good, but what happens when someone wants to unregister from the course? We need to subtract 1 from the number of Filled Seats, then delete their registration from Registrations, but here's a problem - workflow cannot be triggered to run before an item is deleted. So here's how we'll fake it - since workflow can run when an item is changed, we'll set up another sentinel value for our workflow to be interested in. DELETE seems pretty self explanatory, right?

(Note that this workaround has some serious implications - we'll need to hide item deletion in Registrations and block all edits to our field so the user never trips the sentinel. Don't worry, I'll explain in due time...)

Our last workflow, "Attendee unregistration" (for lack of a better word), attached to Registrations, triggered when an item is changed. One variable before you start: a String called Log Message. Not even really necessary, just for posterity:

  1. "Unregister from course"
    1. Conditions > Compare Registrations field - If Title equals "DELETE"
    2. Actions > Delete Item - Delete item in Registrations (Current Item)
    3. Actions > Build Dynamic String - Store ... in Variable: Log Message
    4. Actions > Stop Workflow - Stop the workflow and log Variable: Log Message

And there you have it, dynamic behavior that takes a long time to spell out in a blog post, but goes a long way towards the richness and robustness of your SharePoint app. It's taken us a few key design decisions to get here, and so in part three we'll learn what consequences that holds for the front end system, which is driven by SharePoint views and forms. I'll see you then!

Cheers,
Sean

Comments

  • Anonymous
    March 26, 2007
    In the first workflow, Instructor Reminder, you set a variable for the subject and then never use it. However, looking at the template, it appears you actually use that variable in the third step, Send reminder about course. Just thought I'd point that out... Another great tutorial... looking forward to the next one!

  • Anonymous
    March 26, 2007
    Also, in the second workflow you never set the value for the variable Reminder Date 2. Shouldn't this be set to the course start time + 24 hours?

  • Anonymous
    March 26, 2007
    Great tutorial Sean!!! One complaint I've had on the applications released in the past, is the lack of documentation on what all they do.  Without your explanation I would've never even downloaded the application, but now that I know all that I can do with it I see the enormous value of the application, thanks for creating it and thanks for sharing with us how you did it. One question, do you have any suggestions on how to add on-demand courses to the Courses Schedule? Thanks in advance, Gus

  • Anonymous
    March 26, 2007
    Well, the workflow designing seems to be nice and easy, but in my first attempts to realize some new ones to train myself on Sharepoint Designer and WSS 3.0 I suddenly came to a stop. It happens on two points on Calendar events creation on which i'd like to get some help:

  1. I'm trying to set the lasting of an event after i created it to a precise amount of time (e.g. 3 days). After making "Actions > Add Time to Date - Add 72 hours to [fx :: Current Item, Start Time] (Output to Variable: Reminder Time)" and "Actions > Set Field to Value - Set [fx :: Current Item, End Time] to [fx :: Workflow Data, Variable: Reminder Time]" i get an error from the WSS 3.0 installation.
  2. I'd like to automatically create a Workspace related to a Calendar event the moment a certain user creates such event. How should i do? Thanks for your help Paolo Nugnes
  • Anonymous
    March 26, 2007
    CQuick: thanks for the catch in the "Instructor reminder" workflow, I'll add the correction (meant to use the "RE:" string in the second e-mail). As for "Attendee registration" Reminder Time 2 gets set to the related course's End Time in step 2.2.2. We use it later in e-mail for step 6. Gus: appreciate the feedback! You could try setting a Start Time far into the past, and End Time far into the future - you'd then see the course span every calendar cell, so it would seem "dateless." Admittedly this is going to be clunky... the real problem is that Start and End Time are both required with the Calendar content type so you can't alter that at the app level. You may just want to make a separate list (i.e. On-Demand Courses) for those special cases, and adapt the dashboard views to include it (we'll get to the dashboard in a future installment). Paolo: with your workflow, it sounds like what you're doing is correct but if you're still getting errors, try setting the End Time separately (similarly to the template, do all the date math in one step and then actually set the list item's fields in another step). As for Meeting Workspaces, I'll cover view customizations in the next article - the one you'll be interested in is Courses/NewForm.aspx, and setting a default value on the checkbox that we've hidden away. Stay tuned... Thanks, Sean

  • Anonymous
    March 28, 2007
    Thanks for this tutorial Sean, its given me the kick start I have been looking for (and has saved me buying webparts that I thought I required). I think that only were scratching on the surface of a very powerful tool. Keep at it, looking forward to the next tutorial. Questions (hope theyre not too stupid): What happens to the workflows that are "paused" (e.g. the reminder) if I have to re-boot the server? The Action "Calculate ..." allows for very simple formulas (plus, minus etc.) Is there a way to perform more complex calculations using, for example, the formuals available on the WSS site. A simple example would be to calculate the working days between two dates. Thanks in advance Tubs  

  • Anonymous
    March 29, 2007
    Tubs: definitely good questions to ask. When a workflow is paused, it gets pushed down into the database (in this sleeping state, we often call the workflow "dehydrated") so a server reboot will not cause the workflow to lose its state. If the wake-up time passes while the server is still in the process of rebooting, the engine will kick start the workflow once the machine goes up again. You're right in that our support for date math within workflow today is limited. You'd be best served by expressing the calculation you want in WSS (e.g. create a new column in your list, a calculated field type that does End Time - Start Time) and then using that column wherever you need the calculated value within your workflow. Thanks, Sean

  • Anonymous
    March 29, 2007
    Hello, First: I really like this template and I've implemented it at our College for employee training purposes.  We have a department dedicated to Faculty & Staff training and they have many events "Courses" running every day.  This used to cause a massive administrative burden for their secretary -- and with your magic I was able to reduce their workload immensely AND provide a central place for course documents an awesome archive for them.  Many thanks! Second: I'm POSITIVE that I have permission settings wrong and this is causing workflows (triggered by registrations and UNregistrations) to fail.  I see this message: "Failed on start (retrying)" for all registrations (except for users who have "Design" permission throughout the app).  The description of the error is "Error updated a list item"; the outcome "Access Denied"; and the User ID is "System Account".  (But this seems misleading...how can the system account be denied access, right?) I've posted two messages in the Sharepoint newsgroups about this problem but haven't seen any responses: http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?&query=employee+training&lang=en&cr=US&guid=&sloc=en-us&dg=microsoft.public.sharepoint.setup_and_administration&p=1&tid=256515ef-c363-4cc5-b0e8-b4b7df60b3ed&mid=256515ef-c363-4cc5-b0e8-b4b7df60b3ed AND http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?&query=employee+training&lang=en&cr=US&guid=&sloc=en-us&dg=microsoft.public.sharepoint.design_and_customization&p=1&tid=303bef12-21e1-4a01-b13a-f956cdfcf728&mid=303bef12-21e1-4a01-b13a-f956cdfcf728 My permissions break down like this:

  • The "Employee Training Scheduling and Materials" template was created as a subsite and all our Active Directory users have "Read" permission throughout that subsite.  (These registrations fail.)
  • A small group of people who manage the training have "Design" permission. (These registrations succeed.)
  • All site content inherits those permission settings except: -- "Course Surveys" allows all users to "Contribute" in addition to "Read". -- For "Registrations" and "Past Registrations" and "Tasks" I've given all users "Design" permission in addition to "Read" -- (I did this hoping that the workflows wouldn't fail, but they still fail.) It would appear that the "Courses" list also requires 'more than Read' permission for all users, but how then can I prevent 'just any employee' adding an event to this calendar? I realize this isn't a "forum" for questions, but perhaps in your next article you might address the matter of "Permissions" and how to configure the tools in this template to ensure that the workflow works properly. Again...thanks for a great app -- and I'm totally enjoying WSS.3
  • Anonymous
    April 02, 2007
    It seems it doesn't want to work... :( Even if i separate in different steps the "+3 days" calculation from the variable to field assignment it keeps giving me errors. I tried it on different installations but the problems keeps happening. I even tried to set the value to a string field. Then i found the value in "dd/mm/yyyy hh.mm.ss" format instead of "dd/mm/yyyy hh.mm" but i don't think this should be a problem. Or is it? Thanks again for your help Paolo Nugnes

  • Anonymous
    April 02, 2007
    The comment has been removed

  • Anonymous
    April 02, 2007
    Is it possible to have an action copy an item from one list to another located in a sub-site? If this is not a native capability, has anyone seen any extensions that might allow it?

  • Anonymous
    April 02, 2007
    The comment has been removed

  • Anonymous
    April 02, 2007
    Rcrouch: currently, SPD workflows can only operate within the context of your current site. To do something cross-web you'll need to develop your workflow in Visual Studio. Troyson: the Add Time to Date action accepts negative values (like step 1.1 of "Instructor reminder" in the walkthrough). If you need additional assistance, try soliciting the SharePoint newsgroups on microsoft.com for advice specific to your scenario. The Design and Customization forum would be a good place to start. Thanks, Sean

  • Anonymous
    April 03, 2007
    Solved by updating (or setting) the [fx :: Current Item, Start Time] to itself after setting [fx :: Current Item, End Time] to the variable. This has no explanation to me, but it worked, in some ways... ;) Thanks again Paolo Nugnes

  • Anonymous
    April 12, 2007
    When is the next installment? I'm really interested in how you changed the associated forms for each list since they all render XSLT transform errors and it is difficult to understand how these things are being handled.

  • Anonymous
    April 16, 2007
    Thanks for the interest CQuick, I'm looking to get out the next installment by this week. It's probably the most in-depth article of the series, so it's been taking a while to write... Thanks, Sean

  • Anonymous
    April 24, 2007
    Great work with the articles Sean.  It really helps us see the power of the applications and how to design our own for clients and internal use. One thought, I know writing doc can take a long time, have you thought about producing screencasts instead of doc?  This might help in speeding up the time it takes to produce how-to's on application template designs. Great work, Ben McMann

  • Anonymous
    April 25, 2007
    Great Examples. I used this example to create a Workflow with a Reminder and an OverDue on a Project List. The only question I have is when the Workflow is paused waiting for a reminder date what if I want to stop the workflow if someone changes the status of an Item to "Completed" it doesn't seem to be able to unPause to stop the workflow.

  • Anonymous
    April 26, 2007
    Great example to get started!  I took your examples and be experimenting creating a shopping cart like application.  The problem I’m having is getting input in a dataview.  I understand how to put a label in a table and see it in workflow but, how a textbox?  When I put a textbox in the table, I do not see it as a form variable to assign in workflow.  Any thoughts? Thanks, Bill

  • Anonymous
    April 26, 2007
    Hi all, I want to build a new web part but I don't know how SP store this information in database. I know that there're some tables like AllLists, AllWebParts...store information 'b lists, webparts... But I don't know where SP stored all items in these lists? Please help me!

  • Anonymous
    May 02, 2007
    Its possible insert in the email a link to new item created in lists? how? (sorry for my english)

  • Anonymous
    May 07, 2007
    Hi all, I created a subsite using WSS 3.0 template “Employee Training Scheduling and Materials”. I gave some users Read permission and others Contribute permission. Users with Read permission cannot do their registration for any course. (Registration Fails) Users with Contribute permission can register fine, however they have more permissions that they should. For example, with Contribute permission they can add, edit or delete items, which they shouldn’t. I found that this is a permission related issue. My workaround was to give specific permissions for the courses list. I.e.: -I created a new permission level from a copy of the Contribute permission level. I uncheck the “Add Items” and “Delete Items” permission and leaved only the “Edit Items” permission. -Then on Courses permissions, I created a Group (named Training Users) and gave this group the permission level created. With this I was able to give users the ability to register to courses and at the same time deny them the ability to add new items and to delete existing items. Unfortunately this doesn’t answer to all my requirements because users can still edit items, i.e., they can change the name, time and available seats of any course. Note: The “edit items” permission in the courses list is needed because each time a user registers for a course the “Attendee registration” workflow starts using the credentials of the user that initiated the workflow, and if this user only has Read Permission the workflow fails. The user needs to have the ability to “edit items” in the courses list because one of the steps of the “Attendee registration” workflow is the “enforce seating policy” which updates an item in the courses list. In the registration list I gave the users the Contribute permission level because they need to add and delete items depending if they are registering or unregistering from a course. Resuming, I want users to be able to register to courses but at the same time I don’t want them to add, delete or edit items in the courses list. Can I run the workflows with elevated privileges independently of the users permission? I don’t know if I made myself clear. Any question please feel free to contact-me. Thanks in advance.

  • Anonymous
    May 15, 2007
    hey ...i used a workflow in my system.. but everytime the condition is true...it triggers the action more than once(around 10 times..) please share your views on this..

  • Anonymous
    May 30, 2007
    Part 3? I know you're busy, but it would be great to see Part 3!

  • Anonymous
    May 30, 2007
    Need some help.  I'm really interested in learning this but SPD gives me this ugly error: Errors were found when compiling the workflow.The workflow files were saved but cannot be run. Unexpected error on server associating the workflow Everything out there on this error points to VS.NET developed workflows, not SPD.  Help!?!

  • Anonymous
    May 31, 2007
    Well, I had the same error as David and my issue with SPD 2007.  Going through the logs (%systemdrive%Program FilesCommon FilesMicrosoft Sharedweb server extensions12LOGS) I found that the "temp" directory of the default NetworkService wasn't letting the SHAREPOINTsystem user to compile the workflow.  Once I modified the directory permissions to let SHAREPOINTsystem compile in that location, the errors David and I see went away and SPD would also compile and associate a custom workflow.

  • Anonymous
    May 31, 2007
    The comment has been removed

  • Anonymous
    June 01, 2007
    The comment has been removed

  • Anonymous
    June 03, 2007
    Sean, one request.  Can you tell me if the following even possible within the context of SPD (I know I can do it in VS... just didn't want to have to)? I added another list populated by an InfoPath form.  The "forced attendance" list allows HR and the supervisors in certain departments designate training as 'mandatory', 'highly suggested', and 'suggested'.  The difference being that the first is required, the other two are courses that directly apply to goals & objectives or identified on the job training needs.  The "forced attendance" list uses lookups from the "courses" list as defined in this example. My conundrum is how I can insert registrations using a workflow in SPD.  One of the fields in the "forced attendance" list is an attendees field populated with people picker and allows multiple entries.  Is there a way I can do a "do while" or "for each" using SPD without creating custom workflow features or resorting to VS?

  • Anonymous
    June 14, 2007
    Hi Sean, I surely adore the piece of work you are putting up here. This has definitely served me as the starting point and now to run forward with the SPD flag. 3 Cheers to you!! Keeping my fingers crossed till you get us the next installment :-). Also, a small query... I am using the "Do Calculation" Action in my workflow in SPD. I am trying to use something like this: Calculate FileNumber:OldFileNo plus 1 (Output to Variable:NewNo) then use this variable "NewNo" to Update a column in myList which initially has a value "1". When this workflow runs, I see that the status is completed and also that the required list column is updated. But only problem is the updated value is incorrect. Instead of incrementing the "1" to "2", I find a value "11" in that column. This is wierd !! The calculation can't be a concatenation. I need it to add 1 to the older value. Am I missing on somethig. Thanks for any kinda help. zullu.

  • Anonymous
    June 20, 2007
    Hey I figured that out !! Was really silly though..... :-) Sorry guys if anybody out there got disturbed due to this. It was the variable data type which should be "Number" instead of "String". Thanx Sean, I again appreciate your works. zullu.

  • Anonymous
    June 21, 2007
    Hi Sean,    Thanks very much for your example.  I am trying to send a reminder before a Task Due Eate.  But I have a problem with a "Pause Until .. " activity.  After the pause I want to check a condition by adding a new Workflow step.  But after the pause is completed, the workflow is marked as Completed and never executed the next Workflow step.  I think there is a bug in the WF.  I also updated the patch according to the KB932394.  http://www.microsoft.com/downloads/details.aspx?FamilyID=6096ce0f-d21e-47ac-afe2-d4e1c2fce670&displaylang=en   But it still doesn't work. Thanks in advance for your help. Nick

  • Anonymous
    June 26, 2007
    Hi Sean, Is there to assign courses to specific person rather that ask the person to sign for a course. We have training courses for new employees, so what I am wondering is if there is a way to allow HR people to assign those courses direct to the new employees. Thanks Sergio

  • Anonymous
    June 28, 2007
    Any news on the next installment? Both training site templates tutorials have been extremely useful. Thank you for putting them together as it reaaly helps in the understanding of how sharepoint works.

  • Anonymous
    July 05, 2007
    The comment has been removed

  • Anonymous
    July 06, 2007
    Okay... I'm now officially frustrated because this article is taking so long to publish. I need some good examples in SPD, and this was a good start. Now that we're looking to the actual functinality -- I find myself in the middle of a desert with no water... please please please!

  • Anonymous
    July 15, 2007
    I'm unable to get a recurrance event at the new form to appear. After re-enabling the contents managment types , it still did not appear. Thanks In Advance for the assistance. FAUZI

  • Anonymous
    July 26, 2007
    Hi Sean, i just read your examples. great idea do show this piece of work in detail. do you have any ideas when you can finish part 3 ? i'm really looking foward  to it !!! greets marco

  • Anonymous
    August 02, 2007
    Really when can we expect part 3?  This walk through has been very helpful up to this point.  Thanks for the help in getting started with Designer because before I was just basically using it as an editing tool.   Now I can see where I can build an actual application.

  • Anonymous
    August 14, 2007
    Hi Sean, Thank you for writing this Training Site Template part I and II, I found the articles very helpful.  I am desperateley looking for the same material concerning the Server Admin Application Template HelpDesk.wsp in order to understand how this helpdesk template is built.  I need to make some customization on the Helpdesk template, in particular, I need to modify the Service Request Form to add new fields.  I cannot find any guidance in a step-by-step manner as your "Training Site Template part I and II".  Could you please give me some hints to customize the Helpdesk.wsp and ProjectTracking.wsp? Thank you in advance.

  • Anonymous
    August 16, 2007
    Thanks for an excellent tutorial.  Now all we need is part 3 to glue it all together.  We know you are busy, but you should always finish what you start, right???  ;)

  • Anonymous
    August 21, 2007
    Thanks for part I and II Sean. We are looking forward to part III. We find however that we are having issues with the workflow correctly managing the seat enforcement. We have tried this several times but the workflow never seems to increment/decrement even though the students are registered. Any ideas?

  • Anonymous
    August 22, 2007
    Trying to do this ... either in the string or variable set ... Set a variable (e.g. YEAR([%customlist:DATEFIELD%]) to get a string of the year so I can later use it in a Dynamic string ... Why can't I do this ???

  • Anonymous
    August 24, 2007
    Odd problem here... Regardless of how I try this...whether following your steps to create everything, or using the default template that includes all these workflows...I run into the following problem: A user registers for a course (with no problems) and the workflow subtracts 1 from the total seats available. If the user then unregisters, the workflow seems to fire off and actually remove them from the registrants listing, but the total number of available seats does not increment back up. For example, I have a course with 5 seats available.  User1 registers for the course and the count decrements by one (now shows 4 seats available).  User2 registers for the course and the same process occurs (as it should) which decrements the count again by one (count now shows 3 seats available).  If User1 wants to unregister, they follow through the steps to confirm they want to unregister and it removes them...but the count will stay at 3 for the available seats, even though now only one person is showing as registered. No mattter what I try, each time the count will never go back up.  The only way I've been able to get things to work is to go back in and manually add one more seat in the edit item screen...which in effect make the count of available seats accurate again, but in reality is actually off by one (I'd have to do this for each user that unregisters). Has anyone ran into this...and if so, how did you get around it?  Seems like a pretty simple thing to me...register and the count goes down by one, unregister and it goes up by one. I've also monitored the workflows and none of them appear to be hanging or throwing any errors. Any ideas?

  • Anonymous
    September 06, 2007
    The comment has been removed

  • Anonymous
    September 07, 2007
    I used the original template to design the course registration website. And I am having problems while deleting "My Registrations". On the home page, where "Courses I am attending" is displayed, when I click "Remove", it doesn't delete that particular registration. Instead it deletes the very first registration in the list. What I also observe is that the "Remove" link has the same parameter value (for the parameter ID) for all the registrations. Can someone please confirm if this is the case with them? And how to resolve this? I have recreated this site several times and I see the same issue all over. Thanks, MG

  • Anonymous
    September 10, 2007
    The comment has been removed

  • Anonymous
    September 10, 2007
    Hello. I've changed the locale in the Regional settings of the site from English (US) to Dutch (Belgium). This causes an error when editing a course without changing the Start & End Time. Does anyone know how I can solve this? Thanks in advance.

  • Anonymous
    September 12, 2007
    Yannis: SUPER! That worked out just perfectly. Many thanks for your solution. MG

  • Anonymous
    September 19, 2007
    The comment has been removed

  • Anonymous
    October 07, 2007
    Using Assign Form To Group Activity in SPD I have the workflow working where it creates a task for each user.  The problem is, how do I check what EACH user responded to and either approve or reject the workflow item? Thanks and fantastic job!

  • Anonymous
    October 09, 2007
    I have been working with this template and am ready for nearly for final user testing.  My last issue is identical to one posted earlier by Goncalo Feijao: "I want users to be able to register to courses but at the same time I don’t want them to add, delete or edit items in the courses list" Sean,   You posted a response to this: "SPD's workflows always impersonate the person who initiated them, so no there isn't a way to elevate without developing your own non-declarative workflow." I saw no additional follow-up on this and am not sure how to interpret.  Can you elaborate a bit on this? Thanks, CD

  • Anonymous
    October 10, 2007
    The comment has been removed

  • Anonymous
    October 11, 2007
    Anybody out there !! My "Copy List Item" action in the workflow has stopped working for no reasons I can think of. WIERD !!!! It was initially working but has started throwing an error "Error while copying...." kind of. Has anyone faced this problem. Need quick help!!! zullu

  • Anonymous
    October 15, 2007
    Hello Sean,   This is a very intesresting blog that i have read. I really appreciate your work and the patience that you had in explaining all the steps in creating the necessary lists and workflows.   but, out there right now, I am waiting for your 3rd blog. I would be thankful if you could post the 3rd most wanted blog which as you said will explain the important steps to create a site template on our own.   Could you please post the blog for all of us ? zillion thanks, -Kiran M

  • Anonymous
    November 28, 2007
    All there How can I customize this template so that it displays a message to user if he tries to create a course with duration longer than 2 hours and does not add that item. I created a workflow,  it deletes the item if duration > 7200, but the user has no clue of what has happened. Can I make it interactive and ask the user to change the timings ? ... Rocky

  • Anonymous
    December 03, 2007
    Rocky,   You can do customization to your work by doing some Event Handling code work. There is lot of good stuff explained on how to handle events at: http://www.tedpattison.com/screencasts.aspx. Check out the article for WSS -> Creating and Using Event Handlers in Windows SharePoint Services 3.0.   Hope that helps. regards, -Kiran M

  • Anonymous
    December 10, 2007
    Kiran, Thanks for the response. but i dont want to write managed code. I handled that with javascript code and that worked great. All, I have another problem. How can i determine if the user belongs to a particular sharepoint group, say MyCutsomGroup. Again, i want to do it without .Net code. Can this be done by editing some XSL/XML or writing Javascript ? ...Rocky

  • Anonymous
    December 23, 2007
    Hi all, I need ur help , i need to create workflow start automatically without add, edit or delete any item to my list bcz i need it work daily @8:00 am to send e-mail to end users. is it possible , plz tell me how i can do that????/ Regards,

  • Anonymous
    January 27, 2008
    When the course is scheduled, the workflow is paused and waits for the reminder time. I'm doing a similar thing, but what happens if the date of the course is changed. The workflow doesn't updated itself and the old one is still in progress, which would send the reminder at the wrong time. ideas?

  • Anonymous
    February 08, 2008
    I have some users that can't unregister from any of the courses they registered too during testing when, as it turns out, I had restricted perms too much causing the workflows to fail.  That's corrected now, and they can register/unregister new courses as desired, but how can I delete all the old registrations and failed workflows in the registration list? Thanks Mark

  • Anonymous
    February 14, 2008
    Regarding security on the Courses list, an alternative that will help is to remove the standard control bar from the list form in courses/dispform.aspx.  Oddly though, I tried this and it has no affect.  I'm guessing the properties are being assigned somewhere else, particularly since the list form web part appears greyed out in dispform.aspx. Any thoughts on how to disable that control bar?  The admins could create a copy of the page with control bar enabled for their use, but this keeps the users from getting click-happy. Mark

  • Anonymous
    March 04, 2008
    Great ! Thanks But a question: My workflow remains in "Pausing" state !! Simo

  • Anonymous
    March 12, 2008
    Thanks!! This works perfectly. Had the same issue as Yannis opn the remove button on the MY Registrations.  Your fix did the trick. Nice job on the details!

  • Anonymous
    March 25, 2008
    How to set Workflow variable  (or field value) to some calculated value? I want: NewBudget (int) = NewBudget + 1 So i need to do some math, not just reference to other Fields or: Field3 = Field1 + Field2 Thank you.

  • Anonymous
    March 26, 2008
    I realize it's been a year since this post, but are there any plans for Part 3?  I'm currently working with this template and need to slightly modify the dispform.aspx page for the Courses list.  Unfortunately, SharePoint Designer cannot render the XSLT in the Data View that is being used to display the course information, and I don't have XSLT experience, so I'm somewhat stuck.  It looks like what I need to know would have been included in Part 3 so I'm hoping that someone can help me there.  Thanks!

  • Anonymous
    April 15, 2008
    The comment has been removed

  • Anonymous
    May 08, 2008
    The post here has been very helpful. In the Emploeye Training  Scheduling templates installed from Microsoft, I see this message: "In progress" for all registrations, what could be responsible. Can anyone help.

  • Anonymous
    June 01, 2008
    hi everyone, I would also Like to Know the Logic behind the MyRegistration button in CourseList.It passess the URL with parameters to the registrration page but i am not able to do so.Can any body give me steps to rectify this problem..or make me walkthrough the courseregistration part.this would be very helpful in creating other similiar applications as well. Thanks in Advance

  • Anonymous
    June 02, 2008
    Chandan - This is exactly why we need part 3!!! I could use this type of functionality all over SharePoint at my company and I am sure that many others could as well. It's great that I have the template to download, but it doesn't really help me because I do not understand the setup.

  • Anonymous
    June 03, 2008
    This tutorial was really great, it helped a lot with getting my mind around workflows. But sadly it doesn't look like the third installment is going to come. Does anyone know of an equivalent tutorial that deals with forms and views. Specifically, I'm looking to automatically hide certain fields based on prior answers. I'd also like to change the default based on what was previously answered. In essence i need to dynamically add and remove content based on conditions in the other fields.

  • Anonymous
    June 07, 2008
    Can anyone tell me which sets of permission work well on The Training template?

  • Anonymous
    June 08, 2008
    Hi, I realized that the calendar displayed in course list is displaying the previous day! Today is 9/06/2008 and the day in "Today is..." displays Sunday, June 8, 2008. Others calendars in the site are working well. Has anyone any idea what is wrong? I have to add the functionality to get the manager's approval for a course registration. How can I add it? Thanks in advance.

  • Anonymous
    June 25, 2008
    The comment has been removed

  • Anonymous
    July 01, 2008
    when i clicked on share point  templates (file->new->wesite->sharepoint templates) in share point designer 2007 the following message get displayed " microsoft windows share point services required at the website location" i installed wss 3 with sp1. please help me.

  • Anonymous
    July 06, 2008
    Hi everyone, This is Sean (I know, finally!), blogging to you with the next part of the training site

  • Anonymous
    July 07, 2008
    The comment has been removed

  • Anonymous
    July 10, 2008
    I've just dropped onto this after trawling the net for assistance in setting up reminders from a Sharepoint calendar. This works fantastically well but my only question is, how can you accommodate recurring events using this system?

  • Anonymous
    July 21, 2008
    If the event was deleted how would you clear the variables?  After some testing I’m finding that the reminder still fires even though the event was deleted prior to the start time.

  • Anonymous
    July 24, 2008
    Took me long enough to get this post up, but it's finally done (hopefully - please let me know if

  • Anonymous
    July 30, 2008
    Hi, If you are interested in instructor-led SharePoint training, consider Aivea - http://www.aivea.com/sharepoint-training.htm

  • Anonymous
    August 12, 2008
    Hello, I have been trying to find an answer for this for week now But No luck at all. I recreated everything again and now I am stuck again. Basically I have to give Edit permissions to the user so the Available seats increment/decrement. If I give user to the course list the Read only permission - When they register or unregister the available seats does not change. Did anyone find out a solution for this? Why is this such a problem with security? I have searched and searched... and the suggestions I have found didnt seem to be working for me. Because user would like to have the toolbar on the top which shows Export Event link so they can export the event to their outlook calendar and not see edit/add/delete links. Please help! I really would appreciate it!

  • Anonymous
    August 14, 2008
    Hello, I'm trying to accomplish something, but need a little help in understanding.  I have a task update list that every friday needs to be "reset" to blank, meaning the items in the list are copied to another list and then deleted from the original list.  I'm still not understanding how to trigger the workflow step based on a particular day, vs. relative to a column date.  Can you help? Thank you,

  • Nes
  • Anonymous
    October 02, 2008
    The comment has been removed

  • Anonymous
    October 23, 2008
    You can find the answer at http://sriwantha.blogspot.com/2008/10/sharepoint-site-template-wont-display.html

  • Anonymous
    October 26, 2008
    I have a task, and the requirement is to send a notification email to the requestor after 6 months of request created. how this work using workflow?

  • Anonymous
    November 05, 2008
    I'm having the same error that YokoGaijin had, Errors were found when compiling the workflow.The workflow files were saved but cannot be run. Unexpected error on server associating the workflow Can someone tell me where the "temp" dir is that the NetworkService uses so that I can check the permisions?  I've been looking all day for a solution to this problem with no success. Thanks Chris

  • Anonymous
    November 07, 2008
    frist44 said: When the course is scheduled, the workflow is paused and waits for the reminder time. I'm doing a similar thing, but what happens if the date of the course is changed. The workflow doesn't updated itself and the old one is still in progress, which would send the reminder at the wrong time. I am interested too. Any solutions.

  • Anonymous
    January 30, 2009
    Hi, I did all the steps in the blog, and fixed the seat increase/decrease. I am getting a problem with the Registrations list. I seems it just deletes the first row in the list regardless of whos logged in. DELETE item in Registartions (current item) might be the problem?

  • Anonymous
    May 07, 2009
    The comment has been removed

  • Anonymous
    May 08, 2009
    The comment has been removed

  • Anonymous
    June 03, 2009
    The comment has been removed

  • Anonymous
    August 04, 2009
    Is there a way to integrate this with MySites?  The idea is that after a learner completes X number of courses and tests, that he would be "certified".  Or is there a better way to track certification? Thanks, Deepak

  • Anonymous
    August 30, 2009
    I find that this does not work: "Unregister from course" Conditions > Compare Registrations field - If Title equals "DELETE" Actions > Delete Item - Delete item in Registrations (Current Item) Actions > Build Dynamic String - Store ... in Variable: Log Message Actions > Stop Workflow - Stop the workflow and log Variable: Log Message Appears to be a need to minus 1 from the available seats

  • Anonymous
    November 25, 2009
    When attempting to complete step 2 and 3 of the instructor reminder workflow: (Second step: name it "Send confirmation" No conditions Actions > Send an Email - Email [...] To: Workflow Lookup... :: Current Item, Instructor) "Instructor" is not an option from the drop down once I select "Current Item".  (However, Created by and Modified by ARE options). Not sure how to fix this-- I've deleted and recreated the column a couple of times....

  • Anonymous
    March 02, 2010
    I need to send out a reminder 5 days in advance, so I set my reminder time variable to start time - 5 days. I know this is working because I had the system email me the variable values and I received the email with the values. When I do the compare statement create date < reminder time variable, pause until reminder time variable then send email, the date and time comes and goes and the email is never sent. What would cause this to happen?  Something is not triggering.

  • Anonymous
    June 22, 2010
    I would like to ask you whether is possible to send an outlook invitation, not e-mail with text?

  • Anonymous
    June 24, 2010
    Unfortunately no, not with the pre-installed actions. You'll need to write some custom code to achieve that.

  • Anonymous
    June 25, 2010
    Could you write such code, I need this to our internall WSS site... I would be grateful!

  • Anonymous
    August 26, 2010
    How do I create a unregistration confirmation email?