MOSS Workflow Examples – Custom Association Form (using InfoPath)


In this post, I will walk through the creation and deployment of a very basic Association form for a MOSS workflow. Note that I am not trying to be realistic and create an association form that you might use in a real workflow – I am simply trying to show the mechanics, with as much noise as possible stripped away.

First, I would like to explain what role the Association form plays in a MOSS workflow. When you design a workflow in Visual Studio, you are creating a workflow template, which gets deployed as a feature to SharePoint. You cannot actually do anything with your workflow template until you link it to a SharePoint List, Library, or Content Type. This link is called an Association. When you create the Association through the MOSS user interface, your custom Association form is displayed after the built in form. This allows you to select default values for various parameters for your workflow.

Ok, that’s the best I can do explaining that. If you want to read Microsoft’s description, have a look at http://msdn.microsoft.com/en-us/library/ms481192.aspx.

So, how do you actually create and use a custom Association form?

Before we start, have a look at my previous post describing my base environment for creating these examples.

1) Create a new site

I used a new web application, and a new site collection created using the Team Site template. I named my site AssociationFormDemo;

2) Create Form Library

On this new site, create a Form Library (which I named Workflow Form Library);

3) Create Task List

Also create a new Task List. I called mine Workflow Tasks. At this point, your site home page should look something like the picture below.

Image 1

4) Create Workflow Project

Launch Visual Studio 2008. Create a new project. Expand the C# project tree, select Workflow, and select the SharePoint 2007 Sequential Workflow. Name the project “MyWorkflow”. The create project dialog should look like the picture below.

Create Workflow Project

5) Set the properties for the project as shown below

Workflow Project Settings 1

Workflow Project Settings 2

Workflow Project Settings 3

6) Finish Creating Workflow Project

Click finish. Normally, we would change the workflow name in the project, add some activities, some code, etc., but this is not necessary for this example. The project should look something like this.

Workflow Project

7) Checkpoint

To make sure everything is ok up to this point, select Build | Build Solution, and then Build | Deploy Solution If both are successful, you can navigate (in IE) to your form library created in Step 2. Select Settings | Form Library Settings, which will display the Customize Form Library page.

Form Library Settings

Select Workflow settings. The display should be as shown below:

image

Click on MyWorkflow to display the default Association form, as shown below. Note that the buttons at the bottom are Ok and Cancel. Click Cancel to close the form.

Default Association Form

8 ) Create Custom Association Form in InfoPath

Now we will create the InfoPath Association Form. Launch InfoPath and select Design a Form Template. Select the settings as shown below (Form Template, Blank, Enable browser-compatible features only).

InfoPath 1

9) Design the Custom Association Form – Create Data Source for Submission

In the InfoPath Designer, select Tools | Data Connections… and click the Add button. Create the new data connection as shown in the following pictures.

InfoPath 2

InfoPath 3

InfoPath 4

Click Finish and Close to get back to the main InfoPath window.

10) Create a Custom Field for the Form

In the Task Pane, under Design Tasks, click on Data Source. Right click on myFields, and select Add to add a new field to the schema. Create a new field as shown below, and click Ok.

InfoPath 5

11) Add the Custom Field to the Form

Drag and drop the My Setting field onto the design surface, to create label and text box for it. Also add a Button control, and change its label to “Submit”. Your form should look something like the picture below.

InfoPath 6

12) Add Logic to the Submit Button

Double click on your Submit button to display the Button Properties dialog. Click on the Rules… button, and click Add and then Add Action. Select options as shown below, and click Ok.

InfoPath 7

Click Add Action again, and set the options as shown below, and click Ok.

InfoPath 8

You should now have two actions, as shown below.

InfoPath 9

13) Set Form Security Level

Finally, we must set the form trust to Domain. Select Tools | Form Options…, and select Security and Trust. Unselect the checkbox Automatically determine security level (recommended), and click the Domain radio button, as shown below, and click Ok.

InfoPath 10

14) Save the Form Template

Save the form to disk (File | Save). You can save it anywhere you want, as long as it is not your Visual Studio project folder. I just save mine to a Forms folder in My Documents. Name the form MyAssociationForm.xsn for this example (in practice you can name it whatever makes sense).

15) Publish the Form Template

Now we want to publish the form. This did not entirely make sense to me, but when you select File | Publish…, on the first page of the publish dialog we will select To a Network Location even though we will actually publish it to our Visual Studio workflow project folder.

Publish 1

Click Next, and then browse to the location where you will publish the form. In this case, we want to publish to your workflow project folder, as shown.

Publish 2

Type a name for your form (I used MyAssociationForm.xsn), click Ok, and Next. On the next form, clear the text box and click Next (this is important, the form will not work if you do not clear that text box!)

Publish 3

When you click Next, a warning will pop up, as shown below. Click Ok to continue.

Publish 4

Click Publish and Close, and then exit InfoPath.

16) Retrieve Form ID to Use in Workflow Project

In Windows Explorer, navigate to your workflow project folder, right click on the InfoPath form you just published there, and select Design. When the form opens in design mode, select File | Properties… to display the properties dialog shown below.

Properties

Select the ID as shown, and copy it to the clipboard. Click Ok and exit InfoPath.

17) Modify Workflow Project to Reference Custom Association Form

Go back to Visual Studio 2008, and open you workflow project if it is not still open. Open the workflow.xml file. The default file looks like this:

<?xml version="1.0" encoding="utf-8" ?>

<!-- Customize the text in square brackets.
     Remove brackets when filling in, e.g.
     Name="[NAME]" ==> Name="MyWorkflow"
-->

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <Workflow Name="MyWorkflow"
             Description="My SharePoint Workflow"
             Id="0d94af3a-45e7-4035-b351-9a10fc41018d"
             CodeBesideClass="MyWorkflow.Workflow1"
             CodeBesideAssembly="MyWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=96c40524715e44e9">
      <Categories/>
      <MetaData>
         <!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->
         <!--
         <Association_FormURN>[URN FOR ASSOCIATION FORM]</Association_FormURN>
         <Instantiation_FormURN>[URN FOR INSTANTIATION FORM]</Instantiation_FormURN>
         <Task0_FormURN>[URN FOR TASK (type 0) FORM]</Task0_FormURN>
         <Task1_FormURN>[URN FOR TASK (type 1) FORM]</Task1_FormURN>
         -->
         <!-- Modification forms: create a unique guid for each modification form -->
         <!--
         <Modification_[UNIQUE GUID]_FormURN>[URN FOR MODIFICATION FORM]</Modification_[UNIQUE GUID]_FormURN>
         <Modification_[UNIQUE GUID]_Name>[NAME OF MODIFICATION TO BE DISPLAYED AS A LINK ON WORKFLOW STATUS PAGE</Modification_[UNIQUE GUID]_Name>
         -->
         <StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>
      </MetaData>
   </Workflow>
</Elements>

Paste the ID from your InfoPath form properties into the <Association_FormURN> element, and uncomment the element (be careful that the other commented out elements stay that way – or delete the ones you are not using as I did):

<Association_FormURN>urn:schemas-microsoft-com:office:infopath:MyAssociationForm:-myXSD-2009-03-18T03-04-06</Association_FormURN>

Of course, your actual URN will be different than mine.

Add the following new attribute to the <Workflow> element:

AssociationUrl="_layouts/CstWrkflIP.aspx">

Your workflow.xml file should now look something like this:

<?xml version="1.0" encoding="utf-8" ?>

<!-- Customize the text in square brackets.
     Remove brackets when filling in, e.g.
     Name="[NAME]" ==> Name="MyWorkflow"
-->

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
   <Workflow Name="MyWorkflow"
             Description="My SharePoint Workflow"
             Id="0d94af3a-45e7-4035-b351-9a10fc41018d"
             CodeBesideClass="MyWorkflow.Workflow1"
             CodeBesideAssembly="MyWorkflow, Version=1.0.0.0, Culture=neutral, PublicKeyToken=96c40524715e44e9"
             AssociationUrl="_layouts/CstWrkflIP.aspx">
      <Categories/>
      <MetaData>
         <!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->
         <Association_FormURN>urn:schemas-microsoft-com:office:infopath:MyAssociationForm:-myXSD-2009-03-18T03-04-06</Association_FormURN>
         <StatusPageUrl>_layouts/WrkStat.aspx</StatusPageUrl>
      </MetaData>
   </Workflow>
</Elements>

Save the file and close it.

18) Make Sure the Custom Association Form will get Copied With the Workflow Feature

Next, open the feature.xml file. It will look something like

<?xml version="1.0" encoding="utf-8" ?>

<Feature  Id="15fdd97f-db32-44c1-96cc-cab49acecd36"
          Title="MyWorkflow feature"
          Description="My SharePoint Workflow Feature"
          Version="12.0.0.0"
          Scope="Site"
          ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
          ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver"
          xmlns="http://schemas.microsoft.com/sharepoint/">
   <ElementManifests>
      <ElementManifest Location="workflow.xml" />
   </ElementManifests>
   <Properties>
      <Property Key="GloballyAvailable" Value="true" />

      <!-- Value for RegisterForms key indicates the path to the forms relative to feature file location -->
      <!-- if you don't have forms, use *.xsn -->
      <Property Key="RegisterForms" Value="*.xsn" />
   </Properties>
</Feature>

Find the <ElementManifests> tag, and under that, add a new <ElementFile> element inside it as shown:

<ElementManifests>
   <ElementManifest Location="workflow.xml" />
   <ElementFile Location="MyAssociationForm.xsn"/>
</ElementManifests>

Save the file and close it.

19) Rebuild your workflow solution, and deploy it.

20) Test it Out

Back in IE, navigate to your form library settings page, click Workflow Settings, and click on your workflow to launch the association page as you did in Step 7. You should see the built in Association form as shown below.

Results 1

Note that where we previously had an Ok button, now there is a Next button. Clicking this button brings us to our custom Association form, as shown.

Results 2

Enter some text, and click Submit. This will bring us back to the Workflow Settings page. Click on your workflow again, and click Next. Note that the text you entered was persisted.

Ok, in this example I have walked through the creation of a custom Association Form for a SharePoint workflow. I know I have gone into a lot of detail. Writing it, I felt like it was too much detail. I think this is a symptom of already knowing how to do it. I know that this much detail would have been useful when I was trying to figure this out the first time – and may be useful in 6 months when I have forgotten it all.

Next time I will show how to create a custom Instantiation form. Much of it is similar, so I may not go into as much detail on those parts. Then there will be new things to worry about, like how to get at the settings from the instantiation form inside you workflow code.

Advertisements
About

I have been working in the world of technology for 25-odd years. I am an entrepreneur and consultant, focused on software solutions, social networking, and innovation processes. Currently, I am a Principal Consultant with T4G Limited, specializing in Portal Technologies (including SharePoint), software/systems development, service oriented architectures, and many other things which I will probably not remember until I need to use them. Prior to that, I was VP of Technology at Whitehill Technologies, Inc., where I spent almost 9 years helping to grow the company from a start-up to one of the most successful private software companies in Canada. Prior to that I worked on internet conferencing using early VoIP, and on large military communications projects. Before even that, I worked in satellite control, and remote sensing. Going way back to university, my focus was on theoretical physics and astrophysics. Currently my interests revolve around most aspects of software development, from technologies to management, and in the area of defining sustainable, repeatable processes for innovation within technology organizations. I also have a particular interest in Tablet PC technologies – I have been using one for several years, and I love it. On the personal side, I still have a strong interest in all aspects of science, especially physical sciences, as well as philosophy and comparative religion. In addition, I am into music, playing guitar (badly, I am sorry to say), and reading almost anything I can lay my hands on. I am also a member of the IEEE/IEEE Computer Society, and of the Association for Computing Machinery.

Tagged with: , , , , , , ,
Posted in MOSS, SharePoint
8 comments on “MOSS Workflow Examples – Custom Association Form (using InfoPath)
  1. Clarence Ricketts says:

    Excelente, muchas gracias.

  2. Girish says:

    Awesome tutorial for beginners

    adding this AssociationUrl=”_layouts/CstWrkflIP.aspx”> solved the issue i spent neary half day thanks a lot

    can you explore what is this AssociationUrl exactly

    Thanks
    Girish

    • Fred says:

      The “AssociationUrl” points to an ASP.NET page which acts as the host for your custom InfoPath association form. The page contains the logic for hosting the InfoPath form, as well as the logic for getting the Association data into and out of the InfoPath form, and into the Sharepoint environment.

      The path “_layouts\CstWrkflIP.aspx” points to the default container provided with MOSS, which is located in the “_layouts” folder.

      In principal, you could write your own ASP.NET page to be the container, but you would have to implement all of the logic yourself. I have never had reason to.

  3. uday says:

    thank u for this ditailed discription

  4. DP says:

    Same question as VaDo.

    • Fred says:

      If you look at my post on Custom Initiation Forms, at the very end, I demonstrate accessing the data entered in the custom initiation form from within your workflow. Accessing the association from data is essentially the same.

      Basically, from any code behind in your workflow project, you can access this.workflowProperties.AssociationData, which is a string containing the XML from your association form. play with this XML to extract the field values you require.

      cheers

  5. VaDo says:

    Ok, many thanks about this post. And one question at the end: How I use this stored setting in my workflow?

    • Fred says:

      If you look at my post on Custom Initiation Forms, at the very end, I demonstrate accessing the data entered in the custom initiation form from within your workflow. Accessing the association from data is essentially the same.

      Basically, from any code behind in your workflow project, you can access this.workflowProperties.AssociationData, which is a string containing the XML from your association form. play with this XML to extract the field values you require.

      Keep in mind that the Association Data is the same for all instances of this workflow. The data that is collected on a per-instance basis is on the Initiation/Instantiation Form.

      cheers

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Obligatory Disclaimer
Please keep in mind that any opinions, points-of-view, comments, or other content which I post to this site are mine and mine alone. They in no way reflect the views of my employer, my country, my dog, my cat, or anyone else you can think of. To paraphrase Monty Python, "That is the theory that I have and which is mine, and what it is, too."

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 623 other followers

%d bloggers like this: