Лучший отвечающий
Создание элемента списка на основании имеющегося элемента списка.

Вопрос
-
Добрый день.
Sharepoint 2013.Имеется список. Для удобства пользователей необходимо сделать создание нового элемента списка на основании ранее созданного элемента, при этом в новый элемент необходимо перенести часть полей.
Новый элемент должен сразу открыться на редактирование для заполнения оставшихся полей.
В списке имеется рабочий процесс, который будет запускаться по сохранению (созданию) нового элемента списка.
Подскажите как это реализовать.
- Изменено Demon_P 6 ноября 2019 г. 6:48
6 ноября 2019 г. 6:47
Ответы
-
Задача решена.
Использовал тот сценарий, который описал выше.
Скопировал NewForm.aspx в NewFormCopy.aspx. Сделал меню с переходом на URL ...\NewFormCopy.aspx?ID={ItemId}
В NewFormCopy.aspx добавляем следующий код. Т.к. в IE 11 не работает new URL, то нашел замену в виде функции.function getQueryString() { var key = false, res = {}, itm = null; // get the query string without the ? var qs = location.search.substring(1); // check for the key as an argument if (arguments.length > 0 && arguments[0].length > 1) key = arguments[0]; // make a regex pattern to grab key/value var pattern = /([^&=]+)=([^&]*)/g; // loop the items in the query string, either // find a match to the argument, or build an object // with key/value pairs while (itm = pattern.exec(qs)) { if (key !== false && decodeURIComponent(itm[1]) === key) return decodeURIComponent(itm[2]); else if (key === false) res[decodeURIComponent(itm[1])] = decodeURIComponent(itm[2]); } return key === false ? res : null; } $( document ).ready(function() { // var url_string = window.location.href; // var url = new URL(url_string); не работает в IE 11 // var id = url.searchParams.get("ID"); var id = getQueryString('ID'); var siteurl = _spPageContextInfo.webAbsoluteUrl; //получаем адрес корня сайта $.ajax ({ url: siteurl + "/_api/web/lists/getbytitle('List1')/items("+id+")", method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: function (data) { if (data.d.Created.length) { //Записываем значения в поля $('input[title="Поле 1"]').val(data.d.field1); //filed1 - изначальное название поля в SP $('input[title="Поле 2"]').val(data.d.field2); //filed2 - изначальное название поля в SP ... } }, error: function (error) {alert("Error: "+ JSON.stringify(error));} }); });
На этом все.
Пользователь заполняет оставшиеся поля и сохраняет элемент. После сохранения запускается РП.
- Изменено Demon_P 13 ноября 2019 г. 7:55
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 18 ноября 2019 г. 6:51
13 ноября 2019 г. 7:54
Все ответы
-
Добрый день.
нужно писать свое решение. я делал подобную задачу на js.
добавлял кнопку на элемент с которого нужно скопировать данные.
при нажатии на которую получаются значения из определенных полей и потом через REST оправляем запрос на создание нового элемента при этом передаем имеющиеся значения полей.
нам возвращается id созданного элемента и можно через диалоговое окно или в новой вкладке открыть форму редактирования для нового элемента.
это если кратко.
сделать через РП не получиться, т.к. процессы асинхронные и ничего не возвращают. и открыть созданный элемент не получится
мой блог не много о SharePoint
6 ноября 2019 г. 13:59Модератор -
Добрый день.
Я так и планировал, но меня смущает, что в списке рабочий процесс настроен на запуск при создании элемента. Не будет ли он запущен до открытия элемента?
При создании элемента списка из другого списка запуска не будет, а в этом случае?
P.S. А можно пример js :)
7 ноября 2019 г. 7:52 -
РП отработает до закрытия элемента, и как следствие - конфликт версий.
что касается кода, то постараюсь показать пример. нужно его оформить, оно состоит из нескольких файлов.
мой блог не много о SharePoint
7 ноября 2019 г. 8:34Модератор -
Добрый день.
Я так и планировал, но меня смущает, что в списке рабочий процесс настроен на запуск при создании элемента. Не будет ли он запущен до открытия элемента?
При создании элемента списка из другого списка запуска не будет, а в этом случае?
P.S. А можно пример js :)
РП начет работу после сохранения эл-та. а вот когда он завершится) это уже зависит от того что у вас там написано) + еще некоторые факторы.
Так что если выражаться условно кейс при котором что то пойдет не так будет следующим
1)вы создали элемент через js и получили его ИД
2) запустился рабочий процесс(допустим там куча операций и в конце еще есть добавление какого то текста к полю(назовем его Title) ). Допустим раб процесс выполняется 3-4 сек
3) открытие сохраненного эл-та в новом окне...title не обновлен
4) рабочий процесс завершился
7 ноября 2019 г. 15:17 -
Как работают РП мне понятно.
Вопрос был в том, запустится ли РП при создании элемента через REST.
Так как в SP существует предотвращение рекурсии РП и если Вы создаете элемент в списке из РП другого списка, то РП в текущем списке не запустится.
По моему вопросу пока вижу такой сценарий:
1. Добавляем в меню элемента ссылку на новый NewForm и передаем ему ID
2. В новом NewForm, зная ID через REST читаем необходимые поля.
3. JS`ом заполняем их в NewForm
4. Пользователь заполняет оставшиеся поля и сохраняет элемент.
5. После сохранения запускается РП.
Я не силён в JS поэтому прошу подсказать как это сделать.
8 ноября 2019 г. 6:43 -
Задача решена.
Использовал тот сценарий, который описал выше.
Скопировал NewForm.aspx в NewFormCopy.aspx. Сделал меню с переходом на URL ...\NewFormCopy.aspx?ID={ItemId}
В NewFormCopy.aspx добавляем следующий код. Т.к. в IE 11 не работает new URL, то нашел замену в виде функции.function getQueryString() { var key = false, res = {}, itm = null; // get the query string without the ? var qs = location.search.substring(1); // check for the key as an argument if (arguments.length > 0 && arguments[0].length > 1) key = arguments[0]; // make a regex pattern to grab key/value var pattern = /([^&=]+)=([^&]*)/g; // loop the items in the query string, either // find a match to the argument, or build an object // with key/value pairs while (itm = pattern.exec(qs)) { if (key !== false && decodeURIComponent(itm[1]) === key) return decodeURIComponent(itm[2]); else if (key === false) res[decodeURIComponent(itm[1])] = decodeURIComponent(itm[2]); } return key === false ? res : null; } $( document ).ready(function() { // var url_string = window.location.href; // var url = new URL(url_string); не работает в IE 11 // var id = url.searchParams.get("ID"); var id = getQueryString('ID'); var siteurl = _spPageContextInfo.webAbsoluteUrl; //получаем адрес корня сайта $.ajax ({ url: siteurl + "/_api/web/lists/getbytitle('List1')/items("+id+")", method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: function (data) { if (data.d.Created.length) { //Записываем значения в поля $('input[title="Поле 1"]').val(data.d.field1); //filed1 - изначальное название поля в SP $('input[title="Поле 2"]').val(data.d.field2); //filed2 - изначальное название поля в SP ... } }, error: function (error) {alert("Error: "+ JSON.stringify(error));} }); });
На этом все.
Пользователь заполняет оставшиеся поля и сохраняет элемент. После сохранения запускается РП.
- Изменено Demon_P 13 ноября 2019 г. 7:55
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 18 ноября 2019 г. 6:51
13 ноября 2019 г. 7:54