[送信]と[キャンセル]の2つのボタンがあるInfopath2010テンプレートがあります。[送信]ボタンをクリックすると、フォームがSharePoint 2010のドキュメントライブラリに保存され、対応するワークフローがクリックされます。その後、ユーザーはフォームを開き、[キャンセル]をクリックしてリクエストをキャンセルできます。キャンセルをクリックしたときに別のワークフローを開始したいのですが。それをどのように行うことができるかについてのアイデアはありますか?
ありがとう
[送信]と[キャンセル]の2つのボタンがあるInfopath2010テンプレートがあります。[送信]ボタンをクリックすると、フォームがSharePoint 2010のドキュメントライブラリに保存され、対応するワークフローがクリックされます。その後、ユーザーはフォームを開き、[キャンセル]をクリックしてリクエストをキャンセルできます。キャンセルをクリックしたときに別のワークフローを開始したいのですが。それをどのように行うことができるかについてのアイデアはありますか?
ありがとう
特にInfopathフォームからワークフローを開始する方法が見つかりません。ただし、回避策を見つけました。これが私がそれを設定する方法です:
お役に立てば幸いです。
これは悪い回避策ではありませんが、実際には、すぐに使用できるSharePoint Webサービスを使用して、InfoPathコードビハインドからワークフローを開始することになりました。これを行うために開発した方法は次のとおりです。
public static void StartWorkflow(string siteUrl, string docUrl,string workflowName, List<string> approvers,string description)
{
var workflow = new Workflow();
workflow.Url = siteUrl+ "/_vti_bin/workflow.asmx";
workflow.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlNode assocNode = workflow.GetTemplatesForItem(docUrl);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(assocNode.OwnerDocument.NameTable);
nsmgr.AddNamespace("wf", "http://schemas.microsoft.com/sharepoint/soap/workflow/");
XmlDocument doc = new XmlDocument();
Guid templateID = new Guid();
bool workflowFound = false;
XPathNodeIterator rows = assocNode.CreateNavigator().Select("//wf:WorkflowTemplate", nsmgr);
while (rows.MoveNext())
{
if (rows.Current.GetAttribute("Name", "").ToLower() == workflowName.ToLower())
{
doc.LoadXml(rows.Current.SelectSingleNode("wf:AssociationData/wf:string", nsmgr).Value);
XPathNavigator idNode = rows.Current.SelectSingleNode("wf:WorkflowTemplateIdSet", nsmgr);
templateID = new Guid(idNode.GetAttribute("TemplateId", ""));
workflowFound = true;
break;
}
}
if(!workflowFound)
throw new Exception("System couldn't location the workflow with name: " +workflowName);
XmlElement xmlRoot = doc.DocumentElement;
nsmgr = new XmlNamespaceManager(assocNode.OwnerDocument.NameTable);
nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD");
xmlRoot.SelectSingleNode("/my:myFields/my:Description", nsmgr).InnerText = description;
XmlNode reviewersNode = xmlRoot.SelectSingleNode("/my:myFields/my:Reviewers", nsmgr);
reviewersNode.InnerXml = "";
foreach (var user in approvers)
{
XmlNode personNode = reviewersNode.AppendChild(doc.CreateElement("my:Person"));
XmlNode accountIdNode = personNode.AppendChild(doc.CreateElement("my:AccountId"));
accountIdNode.InnerText = user;
XmlNode accountTypeNode = accountIdNode.AppendChild(doc.CreateElement("my:AccountType"));
accountTypeNode.InnerText = "User";
}
XmlNode workflowNode = workflow.StartWorkflow(docUrl, templateID, doc.DocumentElement);
}