Добрый день! 

Появилась необходимость изменить базовое поле поиска, при выборе в окне справочного поля, и подставить туда своё значение.

Как это выглядит на примере:

Изображение удалено.

 

При открытии данного модального окна, должно быть своё предустановленное значение

Вопрос в том, как это реализовать. 



Поиски не увенчались успехом, застопорился на схеме LookupPage.js

var primaryDisplayColumn = entitySchema.primaryDisplayColumn;
if (primaryDisplayColumn) {
	this.lookupInfo.searchColumn = {
		value: primaryDisplayColumn.name,
		displayValue: primaryDisplayColumn.caption
	};
}

Значение для данной колонки берётся отсюда, но как его подменять для определённого поля - не сообразил

Нравится

19 комментариев
Лучший ответ

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

В lookupListConfig просто укажи searchValue, пример:

columns: ["Id", "Name"],
searchValue: "Вериф",
columnName: "Name",
orders: [{
   columnPath: "Name",
   direction: Terrasoft.OrderDirection.ASC
}],

 

Григорий Чех, columnName упорно изменяться не хочет. А именно значение в списке слева на первом скрине

Покажите свой код

Григорий Чех,

"Gun": {
   "dataValueType": Terrasoft.DataValueType.LOOKUP,
   "lookupListConfig": {
      columns: ["LkpGauges", "UsrConfigProduct"],
      searchValue: "Вериф", // Вот это работает, в инпуте value заполняется
      columnName: "UsrConfigProduct",
      orders: [{
          columnPath: "UsrConfigProduct"
          direction: Terrasoft.OrderDirection.ASC
      }],
      "filters": [ //Фильтры ]
   }
}

 

Григорий Чех,

Это справочное поле, не уверен, что сыграет роль. Но на всякий случай скажу. 

И еще, поле над которым производится действие, является полем в детали с редактируемым реестром

Это интересно. Т.е. теоретически можно прокинуть searchColumn в lookupInfo, но если у объекта есть колонка для отображения - всё перетрется.

варианта 2:

- Доделывать Lookup-модуль

- Оставить как есть, убрать в схеме детали отображаемое поле.

 

Попробуйте так

"Gun": {
   "lookupListConfig": {
      searchValue: "Вериф",
      searchColumn: "UsrConfigProduct"
   }
}

 

Варфоломеев Данила,

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



Самое интересное в том, что у меня получалось прокинуть значения. Но при обращении к lookupinfo он забирает все равно свои значения, которые получил из схемы ConfItem.js (куда ссылается справочное поле). И там прописано поле для отображения

(PrimaryDisplayColumnName)

 

Варфоломеев Данила,

пробовал и так - не работает... 

Попробуй переопределить loadVocabulary как то так\:

loadVocabulary: function(args, tag) {
    var column = this.getColumnByName(tag);
    args.schemaName = column.referenceSchemaName; //подставь свой
     this.callParent(arguments);
 }

Если не получится отпишись, вечером смогу проєксперементировать.

Григорий Чех,

не совсем понял, что менять. Однако там все равно схема (ConfItem) по которой открытие справочника производится, я думаю, что её подменить можно, но это не то, что мы ищем



Прокинуть как-то туда primaryDisplayColumnName, у меня не увенчалось успехом

VadimCh пишет:

Однако там все равно схема (ConfItem) по которой открытие справочника производится

 Я немного неправильно описал.

Схема ConfItem генерится на основании объекта в конфигурации. На ConfItem ссылается справочное поле, которое вы пытаетесь открыть. Соответственно и берется PrimaryDisplayColumnName из ConfItem. Те 2 варианта так и остаются: либо менять PrimaryDisplayColumnName в null в каждом объекте на которое ссылается нужное вам справочное поле, либо переделать логику LookupPage.

Варфоломеев Данила,

В рамках реализации задачи, заместил LookupPage, и переработал тот кусок кода, который скидывал в посте, и присоединил новую схему

"lookupListConfig": {
  lookupPageName: "KmFiltrationBaseLookup",
}

Как по мне, про два варианта вы правы, но первый не подходит - если этот объект используется по всей системе не единожды. И везде требуется разная колонка, либо существует множество старых записей на основе колонки для отображения. При изменении колонки - старые записи будут отображаться не корректно

VadimCh,

А не могли бы Вы посоветовать что и где переработать, чтобы решить эту проблему?

Alex Zaslavsky,

Да, конечно



Чтобы решить именно эту проблему, требуется создать модуль, 

// Полный листинг схемы, создаем свой модуль, и пихаем туда эту схему, дав ей своё название
 
define("KmFiltrationBaseLookup", ["LookupPage", "LookupPageViewGenerator", "LookupPageViewModelGenerator",
"ProcessModuleUtilities", "LookupUtilities", "css!LookupPageCSS"],
	function(LookupPage, LookupPageViewGenerator, LookupPageViewModelGenerator, ProcessModuleUtilities) {
		return Ext.define("Terrasoft.configuration.KmFiltrationBaseLookup", {
			alternateClassName: "Terrasoft.KmKLSHLookupPage",
			extend: "Terrasoft.LookupPage",
			gridWrapClasses: ["custom-lookup-control"],
 
			init: function(callback, scope) {
				callback = callback || Terrasoft.emptyFn;
				if (this.viewModel) {
					callback.call(scope);
					return;
				}
				var lookupInfo = this.getLookupInfo();
				if (this.Ext.isArray(lookupInfo)) {
					var configIndex = 0;
					var parameters = this.parameters;
					if (!this.Ext.isEmpty(parameters)) {
						configIndex = parameters.index;
					}
					this.lookupInfo = lookupInfo[configIndex];
					this.lookupsInfo = lookupInfo;
				} else {
					this.lookupInfo = lookupInfo;
				}
				this.processModuleFlag = this.sandbox.publish("CardProccessModuleInfo", null, [this.sandbox.id]);
				this.initHistoryState();
				this.getSchemaAndProfile(this.lookupInfo.lookupPostfix, function(entitySchema, profile) {
					if (this.isDestroyed) {
						return;
					}
                    // Здесь сам объект, и сюда мы прокидываем свои свойства
                    // Свойства для каждой колонки находятся в схеме объекта (ConfItem.js Пример!)
					entitySchema.primaryDisplayColumn = {
						caption: "Модель",
						columnPath: "UsrConfigProduct.UsrName",
						dataValueType: 1,
						isInherited: false,
						isRequired: true,
						isValueCloneable: false,
						name: "UsrConfigProduct.UsrName",
						size: 250,
						uId: "c4f28c00-8c5d-46cd-98de-f38d2e52a2dc",
						usageType: 0
					};
 
					var primaryDisplayColumn = entitySchema.primaryDisplayColumn;
 
					if (primaryDisplayColumn) {
						this.lookupInfo.searchColumn = {
							value: primaryDisplayColumn.name,
							displayValue: primaryDisplayColumn.caption
						};
					}
					this.lookupInfo.entitySchema = entitySchema;
					this.lookupInfo.gridProfile = profile;
					var viewModel = this.viewModel = this.generateViewModel();
					viewModel.lookupInfo = this.lookupInfo;
					viewModel.load(profile, callback, scope);
				});
			}
		});
	}
);

 

Alex Zaslavsky,

 
			//в атрибутах её подключаем
			"Gun": {
				"dataValueType": Terrasoft.DataValueType.LOOKUP,
				"lookupListConfig": {
					lookupPageName: "KmFiltrationBaseLookup",
				}
			}

 

VadimCh,

Благодарю, попытаемся разобраться :)

Колонку для поиска можно изменить базовыми средствами.

Для этого нужно добавить атрибут в карточку редактирования: 

"AprCustomer": {

                "dataValueType": this.Terrasoft.DataValueType.LOOKUP,

                "lookupListConfig": {

                    "searchColumn": {

                        "value": "AprINN",

                        "displayValue": "ИНН"

                    }

                }

            },

Ilyas Ablitarov,

а где берется названия атрибута AprCustomer?

VadimCh, Этот способ помог мне закрыть мою задачу, работает, спасибо!

Показать все комментарии

Здравствуйте. *bpm'sales

Есть ли возможность реализовать на практике следующее:

1. В форме фильтрации отчета, раздела аналитика, сделать поле выбора значений из справочника который выглядит следующим образом - 

Изображение удалено.

Но при открытии окна выбора открывалось окно Множественного выбора, например как тут

2. Передавать Id выбранных записей в отчет.

Есть идеи?

Нравится

5 комментариев
Лучший ответ

Доброе утро. На сколько мне известно в базовой логике данная задача не реализована. Вам надо посмотреть в сторону замещения и расширения модуля ReportFilterModule. На данный момент реализована передача фильтра с помощью фильтрации записей в разделе.

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

Доброе утро. На сколько мне известно в базовой логике данная задача не реализована. Вам надо посмотреть в сторону замещения и расширения модуля ReportFilterModule. На данный момент реализована передача фильтра с помощью фильтрации записей в разделе.

var config = [

          {

                name: 'FormingMethod',

                dataValueType: 'FormingMethod'

            }

]

Солонко Олег Иванович,

Можете детальней описать что нужно менять? Схему карточки выбора записи из справочника?

Фильтрация по множественному выбору записей в разделе — это то, что есть сейчас. Подробнее описывал в соседней теме.

Зверев Александр,

 

создание раздела под 1 отчет, это не подходит. Было бы неплохо схему фильтров подредактировать, но мало знаний что бы туда тянуть руки.

Как вариант, можно смотреть на создание карточки параметров отчёта в интерфейсе 5.Х. Там включение множественного выбора включатся одной галочкой. Но тогда нужно будет разбираться, как данные из 5.Х-карточки передаются в отчёт.

Показать все комментарии

Здравствуйте. Как реализовать в форме отчета, поле выбора несколько значений из справочника и корректно передать/обработать выбранные Id в сам отчет?

При поиске наткнулся на примеры с Ответственным, но там выбор только 1 записи.

Нравится

5 комментариев

Можно сделать как в стандартных отчётах в разделе, которые вызываются из режима итогов, например, «Data entry compliance» в разделе контрагентов. Для построения отчёта в реестре фильтруют или помечают галочками нужные записи, переключаются в итоги, выбирают этот отчёт, а потом строят по выделенным, по отфильтрованным или по всем:

Схема этого отчёта AccountDataCompletenessReport, привязка таких отчётов к разделам задаётся в таблице SysModuleAnalyticsReport. Для выбора вариантов формирования используется страница BaseReportParameterInModulePageFilter.

Зверев Александр,

это должен быть фильтр по lookup, а не самим записям в реестре.

Можно добавить отчёт именно в тот раздел, записи из которого нужно Вам фильтровать.

Зверев Александр,

суть в том что такого раздела не существует это справочник. Ладно давайте конкретнее. У меня есть раздел Складские документы где ведется учет прихода/ухода Продуктов по складам(справочник) и мне нужно что бы в каком-то  отчете раздела Складские документы было окно выбора несколько складов на каких будет проверяться количество конкретного продукта. Это без проблем можно реализовать в тройке (TS 3) через MultiSelectWindow.

Можно и склады завести разделом. Либо смотреть аналогичные карточки свойств отчётов, где могут быть такие поля множественного выбора. В стандартных отчётах Sales встречаются только обычные справочные.

Показать все комментарии

Здравствуйте. Интересует способ использования "Group By"  в entitySchemaQuery (сервер). При поиске наткнулся на топик - https://community.terrasoft.ru/questions/gruppirovka-v-entityschemaquery , но увы, ссылка с ответом битая. 

Нравится

5 комментариев
Лучший ответ

Пример использования на C#, документацию нашел только для клиентских запросов, но по аналогии все понятно

var query = new EntitySchemaQuery(_userConnection.EntitySchemaManager, schemaName);
var columnCount = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count, query.PrimaryQueryColumn.Name));
var countEntity = query.GetEntityCollection(UserConnection)[0];
var count = countEntity.GetTypedColumnValue<int>(comnCount.Name);
return count;

На всякий случай разясню, после добавления агрегатной функции если добавить обычные столбцы по ним будет выполнена группировка те 

var esq = new Order(UserConnection);
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Customer.Name").All());
	esq.AddColumn("Description");
	esq.AddColumn("Name");
	esq.AddColumn("Customer");

Добавит в запрос 

GROUP BY Order.Description, Document.Name, Order.CustomerId, Customer.Name;

 

 

 

 

 

Пример использования на C#, документацию нашел только для клиентских запросов, но по аналогии все понятно

var query = new EntitySchemaQuery(_userConnection.EntitySchemaManager, schemaName);
var columnCount = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count, query.PrimaryQueryColumn.Name));
var countEntity = query.GetEntityCollection(UserConnection)[0];
var count = countEntity.GetTypedColumnValue<int>(comnCount.Name);
return count;

На всякий случай разясню, после добавления агрегатной функции если добавить обычные столбцы по ним будет выполнена группировка те 

var esq = new Order(UserConnection);
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Customer.Name").All());
	esq.AddColumn("Description");
	esq.AddColumn("Name");
	esq.AddColumn("Customer");

Добавит в запрос 

GROUP BY Order.Description, Document.Name, Order.CustomerId, Customer.Name;

 

 

 

 

 

Григорий Чех,

Спасибо большое!

Вот, на всякий случай, и пример серверного кода:

EntitySchema entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName("SysProcessElement");
var query = new EntitySchemaQuery(entitySchema);
EntitySchemaQueryColumn elementUIdColumn = query.AddColumn("SchemaElementUId");
EntitySchemaQueryColumn executeCountColumn = query.AddColumn(query.CreateAggregationFunction(AggregationTypeStrict.Count,
	entitySchema.PrimaryColumn.Name));
 
EntityCollection entities = query.GetEntityCollection(UserConnection);

 

Зверев Александр,

Я для серверного кода пример и приводил :) От клиентского только документация :)

Вот документация по серверной. Ещё в этом документе есть информация.

Показать все комментарии

У меня запускается некоторый БП, в котором почти на старте открывается страница на редактирование, соответственно там создается задача с заголовком, который я прописываю.

Необходимо отлавливать момент, когда пользователь, не сохранив страницу пытается еще раз запустить этот же БП.

Я пытался сделать это по задаче, но она никак не ссылается на страницу/объект редактирования. 

Как быть?

Нравится

5 комментариев
Лучший ответ

БП запускается как по сигналу по какому то действию оператора?

Самое простое решение перед открытием окна менять статус задачи (как вариант добавить в объект какой то признак Передан в работу) И не запускать (или завершать) БП у которых этот признак установлен.

Те

старовый сигнал

проверка что признак не установен

и либо выход

либо установка признака и затем открытие  странички редактирования!

БП запускается как по сигналу по какому то действию оператора?

Самое простое решение перед открытием окна менять статус задачи (как вариант добавить в объект какой то признак Передан в работу) И не запускать (или завершать) БП у которых этот признак установлен.

Те

старовый сигнал

проверка что признак не установен

и либо выход

либо установка признака и затем открытие  странички редактирования!

Григорий Чех,

по меню Действия. Хотелось как проще, ведь система как-то видит какая задача связана с этой страницей и завершает ее после сохранения? Почему мы не можем это увидеть?

Можно, но очень не советую вам на них завязыватся. Они активно изменяются от версии к версии.

Добрый день, как отметил Григорий лучше иметь признак запуска процесса, но вы можете просматривать текущие задачи по процессам они отображаются у клиента из таблицы  SysProcessElementToDo или через js найти и распарсить элемент(если он есть) такого типа там вшит id записи к которой относится страница редактирования id="ProcessDashboardSchemaNotificationContainer-cce9076d-fa47-49a3-bec5-e53450fc421b-ViewModule_RightSideBarModule_ProcessDashboardModule"

В начале БП свяжите процесс с записью. И затем можно искать такие связи

Показать все комментарии

Добрый день. 

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

Далее идет элемент Задание-сценарий(точно выполнился без ошибок на основе логирования), в котором устанавливается параметр процесса, и от него развилка на основе данного параметра либо на выход либо на отправку сигнала

Причем элемент Задание-сценарий выполен в Журнале процессов, а новый элемент не создается, процесс остался в статусе Выполняется.

Данный процесс выполняется до конца и без ошибок, если пользователь вручную, например, нажмет переслать email.

Нравится

8 комментариев

Посмотрите все ветвления возвращают true

(Те в конце стоит return true)

да, в конце задание-сценария стоит логирование и потом return true

Евгений В.,

А выходов раньше нет? Логирование срабатывает?  Может на нем сваливается. 

Какой статус экземпляра БП если завершен то у вас не идет на генерацию сигнала а идет на выход! Смотрите в сторону с определением условия и его проверке в условном потоке.

Григорий Чех,

элементы выполнены, но процесс завис на скринею

В условии [#EmailRequestItsalive#]==true, EmailRequestItsalive тоже булевый. 

Не видя логики скрипта, сложно сказать. Можно попробовать добавить ещё один блок скрипта после первого, пустой (только return true;). И посмотреть, застревает на нём или на предыдущем.

Если дело не в скрипте, то что-то не то в условиях. Может, не нужно «[#EmailRequestItsalive#]==true»? Например, в стандартном процессе «Поиск данных в соц. сетях» проверка параметра  делается просто как «GotoMessage» и «!GotoMessage».

Зверев Александр,

Добавил после Задание-сценария элемент Читать данные (Активности) по Id из сигнала. 

В результате БП завис на элементе отправить сигнал. (сигнал произвольный).

Также в Журнале процессов есть тот же процесс в статусе Завершен, причем сигнал отправил спустя 6 часов после чтения данных. 

 

Нужно отлаживаться или дальше экспериментировать со структурой процесса. Свои предположения оставил в комментарии выше.

Показать все комментарии

Добрый день. Прошу проконсультировать.

У некоторых контактов системы bpm'online может быть одна почта на несколько человек, то есть при написании пользователем на почту bpm создается обращение, пользователь сервиса выбирается наугад, какие пути решения можно найти, чтобы bpm правильно выбирал контакт? Сделать проверку какую то? Знаю что ящики должны быть персонализированы, но этот факт нельзя сменить.

Нравится

1 комментарий
Лучший ответ

Написать БП  настроенный на создание активности с типом email и направлением входящая. В нем анализировать поля (от кого и тд) и менять поле ответственного и/или привязывать почту к нужной задаче клиенту и тд.

Те как вариант по полю от кого поискать в деталях средство связи контакта (контрагента), найти о какого контакта пришло письмо. И подвязать письмо в историю к контакту.

Или найти последний открытый заказ (проблему, обращение) и тд и привязать туда.

Или найти ответственное лицо контакта и к нему.

Определить (лиц группу лиц) на которых отправлять письма отправителя которых неудалось установить.

Написать БП  настроенный на создание активности с типом email и направлением входящая. В нем анализировать поля (от кого и тд) и менять поле ответственного и/или привязывать почту к нужной задаче клиенту и тд.

Те как вариант по полю от кого поискать в деталях средство связи контакта (контрагента), найти о какого контакта пришло письмо. И подвязать письмо в историю к контакту.

Или найти последний открытый заказ (проблему, обращение) и тд и привязать туда.

Или найти ответственное лицо контакта и к нему.

Определить (лиц группу лиц) на которых отправлять письма отправителя которых неудалось установить.

Показать все комментарии

Здравствуйте! Чего-то я не понимаю, но как отсортировать записи справочника в модальном окне по номеру месяца, а не как по умолчанию - названию. т.е. открываем справочник, а там уже отсортировано по номеру месяца.

Изображение удалено.

 

Нравится

8 комментариев
Лучший ответ

Дульский Александр,

В схеме модального окна, замещаете и пробуете с условиями либо делаете собственное модальное окно.

А вообще, самый быстрый вариант, если варианты выше не отработали по какой-то причине и нету принципиальной разницы.

Вы можете изменить сами названия в справочнике чтобы сортировалось правильно и будет так: 01.Январь, 02.Февраль ..12.Декабрь и в вашем окне сразу все правильно отобразится

Попробуйте что-то вроде такого: 

initQuerySorting: function(esq) {
  if (!esq.columns.contains("CreatedOn")) {
    var createdOnColumn = esq.addColumn("CreatedOn");
    createdOnColumn.orderPosition = 1;
    createdOnColumn.orderDirection = this.Terrasoft.OrderDirection.ASC; //DESC
  }
 }

 

Как вариант, можете попробовать через Конфигурацию установить колонку сортировки http://prntscr.com/kx2u2z для вашего объекта Справочник.

На сколько я помню - должно сработать.

Литвинко Павел,

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

Сидоров Александр Валерьевич,

Я пробовал ранее, но к сожалению не работает

Добавить атрибут по полю справочника в страничку, в которой используется справочник. Примерно так:

attributes: {
	"Status": {
		"lookupListConfig": {
			columns: ["Name","UsrMonthNumber"]
			orders: [{columnPath: "UsrMonthNumber"}]
			}
		}
},

 

Григорий Чех,

Данный способ действует только на справочники с выпадающим списком, но не для модального окна.

Тогда уточните как вы открываете модальное окно?

Дульский Александр,

В схеме модального окна, замещаете и пробуете с условиями либо делаете собственное модальное окно.

А вообще, самый быстрый вариант, если варианты выше не отработали по какой-то причине и нету принципиальной разницы.

Вы можете изменить сами названия в справочнике чтобы сортировалось правильно и будет так: 01.Январь, 02.Февраль ..12.Декабрь и в вашем окне сразу все правильно отобразится

Показать все комментарии

Добрый день.

Есть ли возможность массово поменять значения, например, объединив использование $filter и MERGE? Или единственный вариант по идентификатору?

Цели 2:

1. Действительно массово заменить общее значение на другое

2. Использовать кастомный идентификатор, известный внешней системе, без необходимости каждый раз разрешать его в guid.

Подход "в лоб" вернул ошибку

Query options $select, $expand, $filter, $orderby, $inlinecount, $skip, $skiptoken and $top are not supported by this request method or cannot be applied to the requested resource.

Может, просто синтаксис чуть неверен?

Отправленный запрос (по сути тоже по Id)

curl -X MERGE -H 'Content-Type: application/json;odata=verbose' -H 'Accept: application/atom+xml' -i 'http://terapp-t.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou? eq '\''648dbb58-2aea-578d-e053-2413a8c01794'\' --data '{Name: '\''Other name'\''}'

Нравится

11 комментариев

Вы уверенны что правильно передали название объекта те что в системе есть объект Accou очень похоже что вы имели ввиду Account (Контрагент) но недокопипастили!

Если хотите получать помощь по ошибке приводите полностью описание ошибки.

В фильтре можно строить условия поиска по любым полям, но быстро и надежно работать именно с Id!

 

Григорий Чех,

 

Спасибо за ответ, но я пока не уверен, что хорошо объяснил свою задачу. Мне бы хотелось получить аналог update Account set Name='New name' where Name='Old Name'; я представляю, как сделать аналог select, но модифицировать могу только по первичному ключу

update Account set Name='New name' where Id='{61402C80-BB18-45FC-89A2-5BBFAC1A53F2}' через AccountCollection(guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2')

 

Мой запрос выглядит так:

curl -X PUT -H 'Accept: application/atom+xml' -H 'Content-Type: application/json;odata=verbose' -i 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'\''61402c80-bb18-45fc-89a2-5bbfac1a53f2'\' --data '{Name: "Other name3"}'

Ответ:

 

    Status Code: 405 Method Not Allowed

    Cache-Control: private

    Content-Length: 1197

    Content-Type: application/xml;charset=utf-8

    DataServiceVersion: 1.0;

    Date: Fri, 21 Sep 2018 10:03:14 GMT

    Server: Microsoft-IIS/8.5

    X-AspNet-Version: 4.0.30319

    X-Content-Type-Options: nosniff

    X-Frame-Options: SAMEORIGIN

    X-Powered-By: ASP.NET

 

<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>4</code><message xml:lang="">The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><innererror><message>The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><type>System.Data.Services.DataServiceException</type><stacktrace>   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;

   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;

   в System.Data.Services.DataService`1.HandleRequest()</stacktrace></innererror></error>

По поводу Accou - это валидатор сайта укоротил url, он был перенесен через клипборд прямо из браузера

The URI must point to a single resource for PUT operations!!!

Делайте в два прохода вызовите фильтр и получите коллекцию id пробежитесь по ним и проапдєйтите записи. Или используйте другие механизмы. (БП или кодом вариантов много)

Можно не использовать OData, а сделать свой БП с текстовыми входными параметрами, который делает нужное обновление записей. А потом для запуска дёргать его через веб-сервис.

Зверев Александр,

Это не вариант, ищется generic решение, как заткнуть каждую конкретную дыру, мы и так знаем, но их ожидается неопределенное количество :)

 

Это вариант. Если считаете, что это «дыра» и такое требуется массово, делайте свой универсальный конфигурационный веб-сервис, заточенный под потребности.

Например, в bpm'online loyalty были специальные веб-сервисы и их методы для чтения, добавления, изменения контактов, карт, покупок и прочих сущностей. В любом случае специализированная логика будет работать быстрее стандартной, которая будет гонять тысячу Id туда и обратно, а потом тысячу раз обновлять по одной записи.

Итого ответ на 21.09.2018 такой:

указанная функциональность включена в OData V4.01, поэтому ожидать ее в bpm'online в ближайшее время бессмысленно; нужно искать обходные решения.

Начать искать можно с комментариев выше этого ^.

Зверев Александр,

 спасибо, но как я уже написал, это не подходящий нам вариант по причине ограниченности типов входных параметров и, как следствие, необходимости либо выполнения серьезных трансформаций на уровне сервреа bpm'online, либо разработки многочисленных частных решений.

В текстовом параметре можно сериализировать какие угодно значения тем же JSON. Или передавать команды с любой разметкой, хоть прямо слать SQL-запросы (но это очень небезопасно, лучше так не делать).

Ваш пример с передачей старого и нового имени почти не отличается от примера из моей ссылки. Только вместо создания записи с именем и телефоном у Вас будет изменение записей по условию.

Показать все комментарии

Добрый день



наблюдаем ошибку загрузки файлов в ActivityFile. в связи с чем она может возникать?

почему файлы не загружаются?

Изображение удалено.

Нравится

1 комментарий

Причина написана в поле ErrorOnUpload: «А referenced period is missing.» А что именно это значит, нужно смотреть, какая логика пишет в это поле (стандартная детали файлов, БП, какая-то интеграция) и в каких случаях оставляет такое примечание.

Показать все комментарии