Как запустить рабочий процесс SharePoint 2010 из кода Infopath 2010? - PullRequest
1 голос
/ 03 февраля 2011

У меня есть шаблон Infopath 2010 с 2 кнопками: отправить и отменить. При нажатии кнопки «Отправить» форма сохраняется в библиотеке документов в SharePoint 2010, и соответствующий рабочий процесс отключается. Затем пользователь может открыть форму и отменить запрос, нажав кнопку «Отмена». Я хотел бы начать другой рабочий процесс при нажатии кнопки отмены. Есть идеи, как это можно сделать?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Я не нашел способа запустить рабочий процесс специально из формы Infopath.Однако я нашел обходной путь;вот как я это настроил:

  1. Добавлен столбец в мой список / библиотеку, который будет установлен в значение true, когда выбрана кнопка отмены.
  2. В моей форме инфопата добавьте мойкнопка "отмена".
  3. Откройте свойства элемента управления для кнопки и выберите действие «Правила».Закройте диалоговое окно свойств.
  4. Я добавил правило форматирования для кнопки отмены, чтобы оно отображалось только при запуске первого рабочего процесса.Я также отключил все остальные элементы управления редактированием, поскольку хотел, чтобы была доступна только опция отмены.
  5. На контекстной вкладке «Инструменты управления» в группе «Кнопки» выберите «Управление правилами».
  6. Добавление нового действияКак правило, следует выполнить два действия: сначала установить значение столбца, созданного на первом шаге, равным true;во-вторых, отправьте данные, используя соединение с основными данными.
  7. Рабочий процесс, который вы хотите запустить при отмене, должен быть настроен на запуск при изменении.В качестве первого шага оцените столбец, созданный выше, и, если оно истинно, продолжите работу.Убедитесь, что вы установили значение обратно в false, чтобы рабочий процесс не запускался непреднамеренно.

Надеюсь, это поможет.

0 голосов
/ 07 апреля 2011

Это не плохой обходной путь Nostromo, но мы фактически использовали встроенные веб-сервисы SharePoint, чтобы запустить рабочий процесс из кода 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);


        }
...