Добрый день! При формировании такой структуры получаю 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, аналогичный отправляемому из браузера.