Отправка повторяющейся таблицы InfoPath в список Sharepoint в форме с поддержкой браузера - PullRequest
0 голосов
/ 30 сентября 2011

Надеюсь, вы можете помочь. Я работаю над формой InfoPath 2010 с поддержкой браузера, которая находится в библиотеке документов на сайте SharePoint (2007 и 2010). В этой форме есть повторяющаяся таблица с данными, которые необходимо собирать для целей отчетности. Решение, которое я выбрал, состоит в том, чтобы использовать встроенную веб-службу списков SharePoint.asmx для записи строк в повторяющейся таблице в отдельный список на нормальном сайте SharePoint в том же семействе сайтов. Я использовал шаги здесь, http://msdn.microsoft.com/en-us/library/cc162745(v=office.12).aspx, в качестве моей базовой линии.

У меня все настроено и работает при запуске прямо с сайта клиента формы InfoPath. Форма открывается, и при отправке строки в повторяющейся таблице без проблем записываются в список SharePoint. Однако после развертывания формы через Central Admin и проверки ни одна из строк в повторяющейся таблице не записывается в список. Нет ошибок или чего-либо еще, что указывает на проблему с кодом, а логическое поле, используемое для указания того, была ли загружена строка, установлено в значение true.

Первая мысль: где-то проблема с разрешениями. Возможно, когда служба вызывается со стороны клиента, она передает мои учетные данные, но при запуске с сервера через библиотеку документов она использует что-то другое? Разве он не должен использовать учетные данные, которые используются для получения доступа к SharePoint (которые также являются моими учетными данными AD)? Есть ли способ указать использование учетных данных AD текущих пользователей при вызове веб-службы lists.asmx в коде?

Во всяком случае, не совсем уверен, куда еще пойти с этим. Любой поиск, который я выполняю, сводится к тому же, что и две документации по отправке в список SharePoint в целом. Любая помощь будет принята с благодарностью. Ниже приведен код, который я использую для этого.

if (MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value != "")
            {
                // If Ship Date is not blank, upload items in Material used to SP List where ForQuote is False
                // Quote Number, RMA Number, Ship Date, Unit S/N,

                // Create a WebServiceConnection object for submitting 
                // to the Lists Web service data connection.
                WebServiceConnection wsSubmit =
                   (WebServiceConnection)this.DataConnections["Material Web Service Submit"];

                //Create XPathNodeIterator object for the new Material Lines
                XPathNodeIterator MaterialLines = this.MainDataSource.CreateNavigator().Select("/my:myFields/my:RepairQuote/my:QuoteLines/my:QuoteLine", NamespaceManager);
                int lineCount = 0;

                foreach (XPathNavigator NewLines in MaterialLines)
                {
                    lineCount += 1;
                    if (NewLines.SelectSingleNode(".//my:ForQuote", NamespaceManager).Value == "false" && NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).Value == "false")
                    {
                        // Set the values in the Add List Item Template 
                        // XML file using the values in the new row.
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='Title']", NamespaceManager).SetValue(NewLines.SelectSingleNode(".//my:lineItem", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='RMANumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:RMANumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='UnitSerialNumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:serialNumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='ShipDate']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='OrderType']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:orderType", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='QuoteNumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:quoteNumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='LineQuantity']", NamespaceManager).SetValue(NewLines.SelectSingleNode(".//my:lineQuantity", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='LineNumber']", NamespaceManager).SetValue(lineCount.ToString());

                        // Set the value of Cmd attribute to "New".
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/@Cmd", NamespaceManager).SetValue("New");

                        // Submit the new row.
                        wsSubmit.Execute();
                        NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).SetValue("true");
                    }

                }
            }

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Ну, я не уверен, что это ответ сам по себе, но я считаю, что проблема была связана с безопасностью на сайте.Я справился с этим, используя объектную модель SharePoint вместо веб-службы для создания элементов списка (см. http://www.bizsupportonline.net/browserforms/how-to-use-sharepoint-object-model-submit-data-infopath-browser-form-sharepoint-list.htm).. С помощью объектной модели SharePoint я могу использовать AllowUnsafeUpdates. Кроме того, где мне потребовалось немаловремя для настройки веб-службы, включая подключения к данным, файл CAML и т. д. Однако этот способ занял всего несколько минут. Извлеченный урок, используйте объектную модель SharePoint, если это возможно.

foreach (XPathNavigator NewLines in MaterialLines)
                {
                    lineCount += 1;
                    if (NewLines.SelectSingleNode(".//my:ForQuote", NamespaceManager).Value == "false" && NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).Value == "false")
                    {

                        using (SPSite site = SPContext.Current.Site)
                        {
                            if (site != null)
                            {
                                using (SPWeb web = site.OpenWeb())
                                {
                                    // Turn on AllowUnsafeUpdates on the site
                                    web.AllowUnsafeUpdates = true;

                                    // Update the SharePoint list based on the values
                                    // from the InfoPath form
                                    SPList list = web.GetList("/Lists/InfoPathRtpItems");

                                    if (list != null)
                                    {
                                        SPListItem item = list.Items.Add();
                                        item["Title"] = NewLines.SelectSingleNode(".//my:lineItem", NamespaceManager).Value;
                                        item["RMANumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:RMANumber", NamespaceManager).Value;
                                        item["UnitSerialNumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:serialNumber", NamespaceManager).Value;
                                        item["ShipDate"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value;
                                        item["OrderType"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:orderType", NamespaceManager).Value;
                                        item["QuoteNumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:quoteNumber", NamespaceManager).Value;
                                        item["LineQuantity"] = NewLines.SelectSingleNode(".//my:lineQuantity", NamespaceManager).Value;
                                        item["LineNumber"] = lineCount.ToString();
                                        item.Update();
                                    }

                                    // Turn off AllowUnsafeUpdates on the site
                                    web.AllowUnsafeUpdates = false;

                                    // Close the connection to the site
                                    web.Close();
                                }

                                // Close the connection to the site collection
                                site.Close();
                            }
                        }
                    }
0 голосов
/ 01 октября 2011

Я не уверен, почему код не работает при развертывании и вызове веб-службы списков в коде.Однако я бы посоветовал вам попробовать отладить его, чтобы найти причину проблемы:

Шаг за шагом - отладка форм InfoPath 2010, развернутых в SharePoint 2010 с использованием Visual Studio 2010

Пожалуйста, попробуйте это и пройдитесь по нему, чтобы увидеть, проходит ли код, как ожидалось.

...