1

[送信]と[キャンセル]の2つのボタンがあるInfopath2010テンプレートがあります。[送信]ボタンをクリックすると、フォームがSharePoint 2010のドキュメントライブラリに保存され、対応するワークフローがクリックされます。その後、ユーザーはフォームを開き、[キャンセル]をクリックしてリクエストをキャンセルできます。キャンセルをクリックしたときに別のワークフローを開始したいのですが。それをどのように行うことができるかについてのアイデアはありますか?

ありがとう

4

2 に答える 2

1

特にInfopathフォームからワークフローを開始する方法が見つかりません。ただし、回避策を見つけました。これが私がそれを設定する方法です:

  1. キャンセルボタンが選択されたときにtrueに設定される列をリスト/ライブラリに追加しました。
  2. InfoPathフォームに、[キャンセル]ボタンを追加します。
  3. ボタンのコントロールプロパティを開き、[ルール]アクションを選択します。プロパティダイアログを閉じます。
  4. キャンセルボタンにフォマッティングルールを追加して、最初のワークフローが開始された場合にのみ表示されるようにしました。キャンセルオプションのみを使用できるようにしたかったので、他のすべての編集コントロールも無効にしました。
  5. [コントロールツール]コンテキストタブの[ボタン]グループで、[ルールの管理]をクリックします。
  6. 新しいアクションルールを追加します。2つのアクションを実行する必要があります。最初に、最初のステップで作成した列の値をtrueに設定します。2番目にメインデータ接続を使用してデータを送信します。
  7. キャンセル時に実行するワークフローは、変更時に実行するように設定する必要があります。最初のステップとして、上記で作成した列を評価し、trueの場合は、ワーフローを続行します。ワークフローが意図せずに実行されないように、値をfalseに戻してください。

お役に立てば幸いです。

于 2011-04-06T17:39:00.340 に答える
0

これは悪い回避策ではありませんが、実際には、すぐに使用できる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 に答える