1

我有一个带有 2 个按钮的 Infopath 2010 模板:提交和取消。单击提交按钮时,表单将保存到 SharePoint 2010 中的文档库,并单击关闭相应的工作流。然后,用户可以打开表单并通过单击取消来取消请求。单击取消时,我想启动不同的工作流程。关于如何做到这一点的任何想法?

谢谢

4

2 回答 2

1

我还没有找到专门从 Infopath 表单启动工作流的方法。但是,我确实找到了解决方法;这是我的设置方式:

  1. 在选择“取消”按钮时将列添加到我的列表/库中。
  2. 在我的信息路径表单中,添加我的“取消”按钮。
  3. 打开按钮的控件属性,然后选择“规则”操作。关闭属性对话框。
  4. 我为取消按钮添加了一个格式化规则,因此它只会在第一个工作流程开始时显示。我还禁用了所有其他编辑控件,因为我只希望取消选项可用。
  5. 在“控制工具”上下文选项卡的“按钮”组中,单击“管理规则”。
  6. 添加一个新的Action规则,它应该运行两个动作:首先将我们在第一步中创建的列的值设置为true;第二次使用主数据连接提交数据。
  7. 您要在取消时运行的工作流应设置为在更改时运行。作为第一步,评估上面创建的列,如果为真,则继续工作流程。确保将值设置回 false,这样工作流就不会意外运行。

希望有帮助。

于 2011-04-06T17:39:00.340 回答
0

这不是一个糟糕的解决方法 Nostromo,但我们实际上最终使用开箱即用的 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);


        }
于 2011-04-07T17:25:18.703 回答