Добрый день! При формировании такой структуры получаю NotSupportedException(внутри None):
{ "QueryType": 1, "IsForceUpdate": false, "IsUpsert": false, "Filters": { "RootSchemaName": null, "FilterType": 0, "ComparisonType": 0, "LogicalOperation": 0, "IsNull": true, "IsEnabled": true, "IsNot": false, "SubFilters": null, "Items": { "primaryColumnFilter": { "FilterType": 1, "ComparisonType": 3, "LogicalOperation": 0, "IsNull": true, "IsEnabled": true, "IsNot": false, "SubFilters": null, "Items": null, "LeftExpression": { "ExpressionType": 1, "ColumnPath": null, "Parameter": null, "FunctionType": 1, "MacrosType": 34, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "RightExpression": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 0, "Value": "310ef086-1e11-4290-9c4e-90e78df4d69a", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "RightExpressions": null, "RightLessExpression": null, "RightGreaterExpression": null, "TrimDateTimeParameterToDate": false, "Key": null, "IsAggregative": false, "LeftExpressionCaption": null, "ReferenceSchemaName": null } }, "LeftExpression": null, "RightExpression": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 0, "Value": "310ef086-1e11-4290-9c4e-90e78df4d69a", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "RightExpressions": null, "RightLessExpression": null, "RightGreaterExpression": null, "TrimDateTimeParameterToDate": false, "Key": null, "IsAggregative": false, "LeftExpressionCaption": null, "ReferenceSchemaName": null }, "QueryId": null, "QueryKind": 0, "ColumnValues": { "Items": { "UsrName": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 1, "Value": "name96ae3de9-f90f-46a9-8b57-afeebedd6499", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "UsrSalesFunnelStage": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 10, "Value": "d136a6533-ee2b-4b4b-9366-ffe375568691", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "UsrPartnerType": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 10, "Value": "4397d6d7-0b95-43e6-9261-d01df863724f", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null }, "Id": { "ExpressionType": 2, "ColumnPath": null, "Parameter": { "DataValueType": 0, "Value": "310ef086-1e11-4290-9c4e-90e78df4d69a", "ArrayValue": null, "ShouldSkipConvertion": false }, "FunctionType": 0, "MacrosType": 0, "FunctionArgument": null, "DatePartType": 0, "AggregationType": 0, "AggregationEvalType": 0, "SubFilters": null } } }, "RootSchemaName": "UsrPartnersTest", "IncludeProcessExecutionData": true }
все происходит в облаке
Нравится
Евгений, а что это за запрос был? Его формировали программно в коде или сгенерировался при работе с клиентской ESQ?
Смущает пустой RootSchemaName сверху, дважды переданный RightExpression с Guid (и третий раз он же как колонка). Я для пробы поменял значение в какой-то карточке, сохранил, у меня запрос к сервису совсем не такой вышел.
Зверев Александр,
это BaseQuery сериализованный
Terrasoft.Nui.ServiceModel.DataContract.BaseQuery, я заполнил структуру так (т к в документации нет примера):
var query = new UpdateQuery { IncludeProcessExecutionData = true, RootSchemaName = schemaName, ColumnValues = new ColumnValues { Items = new Dictionary<string, ColumnExpression>() } }; query.Filters = new Filters { RightExpression = new BaseExpression { ExpressionType = EntitySchemaQueryExpressionType.Parameter, Parameter = new Terrasoft.Nui.ServiceModel.DataContract.Parameter { DataValueType = DataValueType.Guid, Value = id } }, Items = new Dictionary<string, Filter> { { "primaryColumnFilter", new Filter() { FilterType = FilterType.CompareFilter, ComparisonType = FilterComparisonType.Equal, IsEnabled = true, LeftExpression = new BaseExpression { FunctionType = FunctionType.Macros, ExpressionType = EntitySchemaQueryExpressionType.Function, MacrosType = (EntitySchemaQueryMacrosType) 34, }, RightExpression = new ColumnExpression { ExpressionType = EntitySchemaQueryExpressionType.Parameter, Parameter = new Terrasoft.Nui.ServiceModel.DataContract.Parameter { DataValueType = DataValueType.Guid, Value = id } } } } } }; foreach (var parameterPair in operation.Parameters) { var columnExpression = new ColumnExpression { ExpressionType = EntitySchemaQueryExpressionType.Parameter, Parameter = new Terrasoft.Nui.ServiceModel.DataContract.Parameter { Value = parameterPair.Value.Value, DataValueType = parameterPair.Value.Type, } }; query.ColumnValues.Items.Add(parameterPair.Value.Name, columnExpression); }
Всё равно не совсем понятно, почему сделали именно так.
Вы делаете внешний софт на C#, работающий с сервисами системы?
Документация по запросам обновления и фильтрам есть в академии.
Если же делаете внутри скриптов БП, то можно просто использовать класс Update.
Посмотреть структуру правильного запроса можно, проделав в интерфейсе аналогичное и записав, что ушло на сервер.
Зверев Александр,
дело в том что я ориентировался как раз на запросы внутри самой crm. да, я реализую интеграцию с другими сервисами. Документация есть, но именно в обновлении примеров нет. И мне все-таки каким-то образом нужно понять что именно не так с запросом
В самой системе при обновлении записи получается совсем не такой запрос, как у Вас. Например, меняю индекс в адресе контакта:
{ "rootSchemaName":"ContactAddress", "operationType":2, "includeProcessExecutionData":true, "filters":{ "items":{ "primaryColumnFilter":{ "filterType":1, "comparisonType":3, "isEnabled":true, "trimDateTimeParameterToDate":false, "leftExpression":{ "expressionType":1, "functionType":1, "macrosType":34 }, "rightExpression":{ "expressionType":2, "parameter":{ "dataValueType":0, "value":"9ce6c7ce-5ae4-df11-971b-001d60e938c6" } } } }, "logicalOperation":0, "isEnabled":true, "filterType":6 }, "columnValues":{ "items":{ "Zip":{ "expressionType":2, "parameter":{ "dataValueType":1, "value":"105122" } } } }, "isForceUpdate":false }
Зверев Александр,
остальные поля просто выходят в результате стерилизации BaseQuery от Terrasoft. Если его нужно использовать как-то иначе - дайте знать. Не хочется делать свой класс, учитывая что в библиотеке уже есть готовый
Горянин Евгений Юрьевич пишет:
остальные поля просто выходят в результате стерилизации BaseQuery от Terrasoft.
Но Вы же сами написали, что заполняете так. Зачем там два раза RightExpression и подобное?
Может, лучше интеграцию по OData, как тут:
ИЗМЕНЕНИЕ СУЩЕСТВУЮЩЕГО ОБЪЕКТА
public static void UpdateCreatioEntityByOdatetWcfExample() { // Создание контекста приложения Creatio. var context = new Creatio(serverUri); // Определение метода, который добавляет аутентификационные cookie при создании нового запроса. context.SendingRequest += new EventHandler<SendingRequestEventArgs>(OnSendingRequestCookie); // Из коллекции контактов выбирается тот, по которому будет изменяться информация. var updateContact = context.ContactCollection.Where(c => c.Name.Contains("Test")).First(); // Изменение свойств выбранного контакта. updateContact.Notes = "New updated description for this contact."; updateContact.Phone = "123456789"; // Сохранение изменений в модели данных сервиса. context.UpdateObject(updateContact); // Сохранение изменений данных в Creatio одним запросом. var responces = context.SaveChanges(SaveChangesOptions.Batch); }
Зверев Александр,
ну переделывать общий процесс под OData теперь уже нет возможности. с Select и Insert проблем не возникло, нужен какой-то пример на c# с использованием Update
На C# с запросами к данным работают либо через OData (во внешнем софте) либо внутри конфигурации системы через классы EntitySchemaQuery или Select/Insert/Update/Delete.
В Вашем случае это какой-то ещё один вариант. Если разобрались с Select и Insert, наверное и Update можно, чтобы в итоге к сервису уходил JSON, аналогичный отправляемому из браузера.