How to start a workflow programmatically in the InfoPath code using Workflow web service
How to start an Approval workflow programmatically in the InfoPath form code?
- Create a web reference that points to https://yourSiteUrl/_vti_bin/workflow.asmx .
- Configure an Approval workflow in your form library and capture the template id.
From form library settings->workflow settings, click the workflow name, right click in the page to View Source. Search for “templateid”. The TemplateID looks like the following:
TemplateID=%7b5C65AB69-11BC-430D-B730-71050250F576%7d
(“%7b” is encoded for “{“ and “%7d” is encoded for “}”)
GUID for the template id is : 5C65AB69-11BC-430D-B730-71050250F576
- Write the InfoPath code. The highlighted parts in the sample code below needs to be replaced.
**TIP: If you can't get the workflowParamers XML string right, you can write a simple console app in server using OM. SPWorkflowAssociation.AssociationData will return the init form data that you already configured in the list/library workflow settings.
public void submit_OnClick(DocActionEvent e)
{
// Write your code here.
WorkflowService.Workflow workflowService = new WorkflowService.Workflow();
workflowService.Url = "https://siteURL/_vti_bin/workflow.asmx";
workflowService.Credentials = System.Net.CredentialCache.DefaultCredentials;
workflowService.PreAuthenticate = true;
try
{
XmlDocument workflowParameters = new XmlDocument();
string strXml = "<my:myFields xml:lang='en-us' xmlns:xsi='https://www.w3.org/2001/XMLSchema-instance' xmlns:my='https://schemas.microsoft.com/office/infopath/2003/myXSD'><my:Reviewers><my:Person><my:DisplayName>Approver’s display name</my:DisplayName><my:AccountId>domain\\account</my:AccountId><my:AccountType>User</my:AccountType></my:Person></my:Reviewers><my:CC></my:CC><my:DueDate xsi:nil='true'></my:DueDate><my:Description></my:Description><my:Title></my:Title><my:DefaultTaskType>1</my:DefaultTaskType><my:CreateTasksInSerial xsi:nil='true'></my:CreateTasksInSerial><my:AllowDelegation>true</my:AllowDelegation><my:AllowChangeRequests>true</my:AllowChangeRequests><my:StopOnAnyReject xsi:nil='true'></my:StopOnAnyReject><my:WantedTasks xsi:nil='true'></my:WantedTasks><my:SetMetadataOnSuccess xsi:nil='true'></my:SetMetadataOnSuccess><my:MetadataSuccessField></my:MetadataSuccessField><my:MetadataSuccessValue></my:MetadataSuccessValue><my:ApproveWhenComplete xsi:nil='false'></my:ApproveWhenComplete><my:TimePerTaskVal xsi:nil='true'></my:TimePerTaskVal><my:TimePerTaskType xsi:nil='true'></my:TimePerTaskType><my:Voting>false</my:Voting><my:MetadataTriggerField></my:MetadataTriggerField><my:MetadataTriggerValue></my:MetadataTriggerValue><my:InitLock xsi:nil='false'></my:InitLock><my:MetadataStop xsi:nil='true'></my:MetadataStop><my:ItemChangeStop xsi:nil='true'></my:ItemChangeStop><my:GroupTasks>false</my:GroupTasks></my:myFields>";
workflowParameters.LoadXml(strXml);
//Guid for the workflow templateId
Guid guid = new Guid("{5C65AB69-11BC-430D-B730-71050250F576}");
//form URL needs to be replaced
XmlNode result = workflowService.StartWorkflow("https://siteURL/formlibrary/test.xml", guid, workflowParameters);
if (result != null)
thisXDocument.UI.Alert("Result: " + result.Value);
}
catch (SoapException ex)
{
thisXDocument.UI.Alert("SoapException: " + ex.Message + " " + ex.Detail.Value);
}
catch (Exception ex0)
{
thisXDocument.UI.Alert("Exception: " + ex0.Message);
}
}
Comments
Anonymous
January 17, 2008
PingBack from http://stevepietrekweblog.wordpress.com/2008/01/17/links-1172008/Anonymous
January 29, 2008
Hi Jingmei, I've been indeed trying to exactly do what the title of this post says but without much success so far. This seems like a reasonable solution but I haven't managed to get it done because of a couple of issues:
- I can't find an equivalent of your "http://yourSiteUrl/_vti_bin/workflow.asmx" path, as a matter of fact there is not even a "_vti_bin" folder in my current MOSS installation. Should I somehow create a virtual url that points to the workflow itself?
- Where is the "WorkflowService.Workflow" class coming from? How can I add it to my VSTO dev. environment? Any help and/or ideas would be much appreciated, cheers Jaume
Anonymous
January 29, 2008
Hi Jaume: Refer to http://msdn2.microsoft.com/en-us/library/websvcworkflow.aspx on the Workflow web service. In your Visual Studio project, you can add a web reference and point to the http://yourSiteUrl/_vti_bin/workflow.asmx" path. If you have MOSS installed properly you should be able to browse to it. JingmeiAnonymous
February 05, 2008
Indeed the http://yourSiteUrl/_vti_bin/workflow.asmx resolves and the webservice can be accessed and added to VS as a web reference. However, VS still does not validate the WorkflowService class and fails to compile. I have added some references to some apparently related libraries like System.WorkflowServices, but without much luck. Could you please post your "using" directives? Any further suggestions? thanks againAnonymous
February 05, 2008
I've just noticed that WorkflowService is the actual reference to the http://yourSiteUrl/_vti_bin/workflow.asmx web service. Anyway I would say that this makes my last question pretty redundant. It's all compiled and sorted out, thanks!