Вопрос

Доброго дня,

столкнулся с проблемой, прошу вашей помощи.

при попытке обновлении guid("UsrRegistrationStatusId") с помощью odata используя json формат полезной нагрузки получаю ошибку 

"message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details."
"message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

 привожу пример

http метод put,

передаваемый json  

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06",
"UsrTitle":"myvalue",
"UsrFirstName":"myvalue",
"UsrLastName":"myvalue",
"UsrPreferredEmail":"myvalue@mm.mm",
"UsrDateOfBirth":"2019-04-18T11:14:26.697Z",
"UsrOccupation":"myvalue",
"UsrJobTitle":"myvalue",
"UsrCompanyPersonal":"myvalue",
"UsrComment":"myvalue",
"UsrModifiedOn":"2019-04-18T11:14:26.697Z",
"UsrPassportNumber":"myvalue",
"UsrContactNumber":"myvalue",
"UsrDateOfExpiry":"2019-04-18T11:14:26.697Z",
"UsrNationality":"myvalue",
"UsrGuestTypeId":"myvalue",
"UsrMainGuestId":"myvalue",
"UsrIsAccompanyingPerson":"myvalue",
"UsrFlightsModifiedOn":"2019-04-18T11:14:26.697Z"
}

Возможно ли сформировать поля в json  с определенным типом например Edm.Guid ? Было бы круто если покажите пример с описанием типа данных.

Спасибо за внимание!

 

 

У меня такой же вопрос

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

Представьте Id  Guid в вашем Json как

guid'9d44061-de29-4578-9df6-d2f226573a06'

Спасибо за ответ!

но не помогло  ошибка таже,

urn запроса 0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')
json

{
"UsrRegistrationStatusId":"guid'a9d44061-de29-4578-9df6-d2f226573a06'"
}
полный ответ 

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "An error occurred while processing this request."
    },
    "innererror": {
      "message": "An error occurred while processing this request.",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.Deserializer.HandlePutRequest()\r\n   at System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details.",
        "type": "Microsoft.Data.OData.ODataException",
        "stacktrace": "   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadPrimitiveValueImplementation(IEdmPrimitiveTypeReference expectedValueTypeReference, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadNonEntityValueImplementation(IEdmTypeReference expectedTypeReference, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, CollectionWithoutExpectedTypeValidator collectionValidator, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)\r\n   at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)\r\n   at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)",
        "internalexception": {
          "message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).",
          "type": "System.FormatException",
          "stacktrace": "   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)\r\n   at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)\r\n   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)\r\n   at System.Guid..ctor(String g)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertStringValue(String stringValue, Type targetType)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)"
        }
      }
    }
  }
}

Так же обратите внимание, на формирование строка запроса, в примере изменения имени контакта с идентификатором 00000000-0000-0000-0000-000000000000 из коллекции контактов ContactCollection.

// Строка запроса:
// PUT <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')
// или
// MERGE <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')

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

Сейчас выполняется запрос вида 

 PUT <Адрес приложения BPMonline>0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

А если без двойных кавычек

Json

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

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

Без двойных кавычек сработает ошибка парсинга json 

{
"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'
}

 "message": "Invalid JSON. A token was not recognized in the JSON content."

 

В принципе должно быть

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

А если попробовать поменять простое текстовое поле например Name (если оно есть в вашем объекте) запрос корректно отработает?

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

Да если менять обычное текстовое поле всё проходит успешно.

Были проблемы с типами данных - числами и датой, та же ошибка с преобразованием типов, на дату решилось преобразованием строки к виду "2019-04-18T11:14:26.697Z" , с числом не получается воспроизвести.

{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}

На такой формат выводит ошибку приведенную во  2 коментарии 

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Прошу прощёния, данном формате запрос работает корректно.
{
"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"
}
Извините что ввёл в заблуждение.
Проявилось не сразу.. запросы выполнял в rest api клиенте после перезапуска клиента данный формат успешно обновил запись.

Премного вам благодарен! Огромное спасибо за ваше время!

Есть и более сложный способ, там не просто голый Guid надо, а с упоминанием названия коллекции, как тут с полом:

{
    Name: 'John',
    BirthDate: new Date(123321123321),
    Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
}

И в таком случае справочное поле пишется без Id в конце.

Больше примеров в этом обсуждении.

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

Добрый день, уважаемое сообщество!

Возникла необходимость передать во внешний сервис список проектов, привязанных к контакту текущего пользователя (под которым была выполнена аутентификация через AuthService.svc). При вызове процесса через  ProcessEngineService.svc я могу получить контакт текущего пользователя и выполнить нужный запрос, но не могу вернуть его результат (или могу?).

А при обращения через OData я могу получить результат запроса, но не представляю, как в него добавить фильтр по текущему контакту.

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

У меня такой же вопрос

2 комментария

Посмотрите в академии ПРИМЕРЫ ЗАПРОСОВ НА ВЫБОРКУ С ФИЛЬТРАЦИЕЙ

На вскидку вам надо получить id текущего пользователя в переменую ContactCurrentUserId и вызвать чтото типа

В примере ниже e71dceda-9b0f-4509-aa10-f479aa69a9eb - Id контакта текущего пользователя а фильтрация идет по значению Guid в поле Contact объекта Project

Url сайта>/0/ServiceModel/EntityDataService.svc/ProjectCollection?$filter=Contact/Id eq guid'e71dceda-9b0f-4509-aa10-f479aa69a9eb'

 

Через OData можно считать SysAdminUnit с фильтрацией по логину пользователя, тем самым получить contactId. А дальше делать уже запрос на выборку и фильтрацию проектов.

Через ProcessEngineService можно получить значение пвраметра (указав название параметра в ResultParameterName), но с интерпретируемыми процессами это работает плохо

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

Добрый день!

Подскажите, где (в каком месте) заполняется параметр БП [#Id созданного счета#] в БП CreateInvoice?

В этот параметр попадает Id вновь созданного счета, на каком этапе, не могу понять, помогите разобраться

У меня такой же вопрос

2 комментария

Заполняется в методе CreateInvoice БП CreateInvoiceFromOrder

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get<OrderInvoiceHelper>(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary<string, string> {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary<string, object> { { "Order", CurrentOrder } });
}

 

Вот я слепошарый! Спасибо!

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

Всем доброго дня. Версия 7.12.

Существует ли способ отписки от сообщения? Обычно в init идёт подписка на sandbox примерно в таком виде:

init: function(callback, scope) {
	this.callParent(arguments);
 
	this.sandbox.subscribe("startMessageEvent", function(arg) {
		console.log(arg)
	}, this, ["messageId"]);
},

Можно ли отписаться от sandbox? Конкретная задача - изменить обработчик, т.е. то, что внутри функции function(arg){}. Предполагаю, что для этого нужно сначала отписаться от сообщения, после чего подписаться на него заново.

У меня такой же вопрос

2 комментария

Попробуйте полностью переопределить метод init.

Проще использовать базовый функционал а именно unsubscribePtp примерно так:

this.sandbox.unsubscribePtp("startMessageEvent");
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Подскажите, как можно в аналитике (тип график), в "показать данные" таблице показать количество активнотей у ответственного, и отфильтровать за указаный период без привязки к разделу?

таблице со столбцами

Ответственный | Количество активностей

У меня такой же вопрос

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

Если Вам нужна возможность фильтрации для разных периодов, тогда придется разработать собственный виджет.

За основу можете взять пример воронки продаж в дешбордах - там тоже реализована возможность фильтрации периода.

Также посмотрите статью на Академии по добавлению пользовательского виджета итогов.

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

Всем доброго дня. Версия 7.12.

При открытии дизайнера страницы возникает ошибка.

Попытка генерации исходного кода и компиляции всей сборки не помогла. В чём может быть причина ошибки? 

У меня такой же вопрос

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

При открытии любой страницы или только страницы (страниц) какогото конкретного раздела? Если это какой то конкретный раздел какие изменения в него вносились?

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

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

Всем добрый день. Версия 7.12.

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

 

У меня такой же вопрос

3 комментария

Фильтры групп хранятся в поле SearchData таблиц XXXFolder.

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

Добрый день, нужна помощь, есть трудности с построением такого фильтра:
 

Select * from "Contact"
LEFT JOIN "SysAdminUnit" ON "Contact"."Id" = "SysAdminUnit"."ContactId"
where "SysAdminUnit"."Id" IN 
	(Select "SysUserId" from "SysUserInRole" where "SysRoleId" IN 
		(Select FuncRoleId from SysFuncRoleInOrgRole))

Для filterGroup, должно получится что-то вроде такого: (мой вариант не верный).
 

filterGroup.add("ContactList", Terrasoft.createExistsFilter("[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.[SysFuncRoleInOrgRole:FuncRole]"));

 

У меня такой же вопрос

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

Можно сначала вычитать все FuncRoleId из SysFuncRoleInOrgRole удовлетворяющие вашим условиям, а потом построить фильтр createColumnInFilterWithParameters, пример привел ниже (existsDocumentsCollection - массив с коллекциями которые нужно включить в запрос)

var filtersGroup = Terrasoft.createFilterGroup();
filtersGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
	existsDocumentsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.EQUAL;
existsFilter.Name = "existsFilter";
filtersGroup.addItem(existsFilter);
filtersGroup.addItem(discontListFilter);

 

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

Добрый день. Версия 7.12.

Возникла проблема с отправкой сообщения из БП на клиентскую часть. Используем стандартный механизм:

Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, MessageName ,MessageText );

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

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

У меня такой же вопрос

3 комментария

Добрый день
Работа 2-х пользователей в системе под одним аккаунтом - не совсем корректная работа с системой.
Скорее всего будет приходить сообщение только одному пользователю.

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

ясно, спасибо, попробую с PostMessageToAll 

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

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

Добрый день. Подскажите периодически слетают настроенные для всех пользователем настройки отображения колонок реестра.

Сегодня настроили, на следующий день - слетели.

В чем может быть проблема.

Что можно сделать.

У меня такой же вопрос

3 комментария

Как именно слетает может ктото корректирует и сохраняет для всех?

Или у вас кто-то профиль пользователя очищает

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

 

Настройки колонок записываются в таблицу SysProfileData, подробнее см. тут. Также есть дополнение, которое позволяет настроить колонки руководителю и перенести своим подчинённым.

Войдите или зарегистрируйтесь, чтобы комментировать