я новичок в этом всем деле, занимаюсь этим всего пару дней. Пытаюсь добавить через кейс и подпроцесс документ на основе сделки. Пытаюсь создать договор, он создал его единожды, я его удалил но он продолжает это выбрасывать. Данные в базе остались? И при создании через подпроцесс он не добавляет новые записи? Ничего не понимаю, подскажите хоть куда копать, буду очень признателен!

Terrasoft.Common.DbOperationException: 23503: insert or update on table "UsrContracts" violates foreign key constraint "FK2P3ugwbN5k9c56HDmFngL4w6uY" ---> Npgsql.PostgresException: 23503: insert or update on table "UsrContracts" violates foreign key constraint "FK2P3ugwbN5k9c56HDmFngL4w6uY"

Нравится

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

Здравствуйте,



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

 

Вы можете использовать этот скрипт в базе данных, чтобы найти, что ссылается на этот внешний ключ:

SELECT * FROM information_schema.constraint_column_usage WHERE constraint_name = 'FK2P3ugwbN5k9c56HDmFngL4w6uY';



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

Пожалуйста, отправьте нам письмо на support@creatio.com с объяснением этой проблемы, и мы будем рады помочь вам.

 

С уважением,

Дарий

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

Нет возможности в запросе (Select, Update и др.) указать математические функции, например: CEILING, FLOOR, ROUND и др.

Через Func.CustomFunction вызвать функцию нельзя, так как генерируется некорректный SQL текст, например для MS SQL:

[dbo].[CEILING](..params..)

а нужно без dbo:

CEILING(..params..)

Нет возможности выполнить элементарный запрос

UPDATE Contact
SET SomeContactColumn = CEILING(OtherContactColumn / 3)
WHERE Id = 'some id'

 

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

Добрый день, Владислав.

Пожелание зарегистрировано и передано аналитикам продукта.

Пока что для реализации Вашего запроса используйте CustomQuery.

Пример: CustomQuery(userConnection, sqlText)

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

Добрый день, всем. Очень долго выполняются запросы связанные с UpdateQuery, SelectQuery, InsertQuery. Кто-нибудь сталкивался с этим? Какие пути использовали, для нахождения проблемы?

Нравится

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

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

Еще может быть, что у вас тормозит обмен по websocket. Надо посмотреть в консоль разработчика в браузере, нет ли там ошибки с подключение к websocket.

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

Еще может быть, что у вас тормозит обмен по websocket. Надо посмотреть в консоль разработчика в браузере, нет ли там ошибки с подключение к websocket.

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

В profiler смотрел, запросы выполняются за доли миллисекунд.

Websocket работает отлично.

Запросы выполняются долго в момент переключения состояния Обращения, вот что заметил. Пока не отлаживал сам процесс перехода состояний, но может уже кто-то сталкивался с этим.

Саид Иманмагомедов,

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

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

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

Пытаюсь сделать так

var update = this.Ext.create("Terrasoft.UpdateQuery", {rootSchemaName: this.entitySchemaName});
update.filters.add("IdFilter", this.Terrasoft.createColumnFilterWithParameter("Id", selectedRows));
update.setParameterValue("B2BClient", Terrasoft.GUID_EMPTY, Terrasoft.DataValueType.GUID);
update.execute(function() {
	this.updateDetail({reloadAll: true});
}, this);

Упорно ничего не работает. 

Даже если писать вместо Terrasoft.GUID_EMPTY null или  Terrasoft.DataValueType.LOOKUP, выдает Uncaught Идентификатор GUID должен содержать 32 цифры и 4 дефиса (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Нравится

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

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

Добрый вечер.

 

Попробуйте написать таким образом:

update.setParameterValue("B2BClient", null, Terrasoft.DataValueType.LOOKUP);

 

Лёш, проблема не там где ищешь.



Ты фильтр добавляешь selectedRows а тип фильтра используешь как для this.get("Id").

Ошибка в том что фильтр ожидает от тебя не array а GUID.



Для массива измени тип фильтра на createColumnInFilterWithParameters.



А в исходниках кстати указано что апдейте надо Null передавать, а не GuidEmpty

В конфигурации встречается и работает нормально null и с Terrasoft.DataValueType.GUID тоже. Например, в FileDetail:

var update = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: this.entitySchema.name
});
update.enablePrimaryColumnFilter(itemId);
update.setParameterValue("LockedOn", currentDateTime, Terrasoft.DataValueType.DATE_TIME);
if (isLocked) {
	update.setParameterValue("LockedBy", Terrasoft.SysValue.CURRENT_USER_CONTACT.value,
		Terrasoft.DataValueType.GUID);
} else {
	update.setParameterValue("LockedBy", null, Terrasoft.DataValueType.GUID);
}
update.execute(function(response) {
...

 

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

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

все происходит в облаке

Нравится

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

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

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

Всем добрый день! Столкнулся с проблемой, в замещенной схеме CtiPanel не работает UpdateQuery.

define("CtiPanel", [],
	function() {
		return {
			entitySchemaName: "Call",
			messages: {
				"WaSendCallDataToContact":{
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.PUBLISH
				},
				"WaSetDataToCall": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			mixins: {},
			attributes: {
				WaRelationEntities: { dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT }
			},
			methods: {
				init: function() {
					this.callParent(arguments);
					this.processMessage();
				},
				onCallSavedEvent: function(call) {
					this.callParent(arguments);
					var relations = this.get("WaRelationEntities");
					if(relations && relations.length > 0) {
						var callId = call.databaseUId;
						this.getUpdateQueryCall(callId, relations);
						this.set("WaRelationEntities", null);
					}
					this.sandbox.publish("WaSendCallDataToContact", call, ["_WaSendCallDataToContact"]);
				},
 
				processMessage: function(){
					this.sandbox.subscribe("WaSetDataToCall", this.onMessageSubscribe.bind(this), this);
				},
 
				onMessageSubscribe: function(args) {
					this.set("WaRelationEntities", args);
					window.console.log("onMessageSubscribe(args): ", args);
				},
 
				getUpdateQueryCall: function (id, relations){
					debugger;
					var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
						rootSchemaName: this.entitySchemaName
					});
					var filters = updateQuery.filters;
					filters.addItem(this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Id", id));
					for(var i = 0; i < relations.length; i++) {
						updateQuery.setParameterValue(relations[i].entitySchemaName, relations[i].value, relations[i].type);
					}
					updateQuery.exequte(this.updateQueryCallBack, this);
				},
				updateQueryCallBack: function(result) {
					if(!result.success) {
						window.console.error(result);
						return;
					}
				}
			},
			diff: []
		};
	}
);

ошибки следующие - http://prntscr.com/nh5uws

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

Нравится

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

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

Алла Савельева,

)) Благодарю, переработал наверное, нужен отдых

странно все равно не сработало даже после изменения, http://prntscr.com/nh7lpa

http://prntscr.com/nh7opx

 

Подключены ли следующие модули "ext-base", "terrasoft", "sandbox" как Ext, Terrasoft, sandbox ?

//те в самом верху должно быть

define("CtiPanel", ["ext-base", "terrasoft", "sandbox"], function(Ext, Terrasoft, sandbox)

 

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

Добрый день!

При сохранении записи в детали средства связи возникают странные ошибки. Метод сохранения вызывает BatchQuery для Update сохраняемой записи. 

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

Однако при исполнении данного скрипта возникает следующая ошибка:

Конфликт инструкции DELETE с ограничением REFERENCE "FK4eIKa4vC33vluosjyKmFjgDPk3o". Конфликт произошел в базе данных "ArdshinBank7102-2", таблица "dbo.AppFormCommunication", column 'ContactCommunicationId'. ↵Выполнение данной инструкции было прервано."

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

 

Посмотрел событийные процессы объекта ContactCommunication, нигде нет удаления.

Подскажите, в какую сторону смотреть для решения ошибки.

 

Нравится

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

вот вам скрипт поиска зависимостей по ключу

 

SELECT
    C.CONSTRAINT_NAME,
    PK.TABLE_NAME,
    CCU.COLUMN_NAME,
    FK.TABLE_NAME,
    CU.COLUMN_NAME,
    C.UPDATE_RULE,
    C.DELETE_RULE
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE
    FK.CONSTRAINT_TYPE = 'FOREIGN KEY' AND c.[CONSTRAINT_NAME] like '%KEY'
ORDER BY
    PK.TABLE_NAME, 
    FK.TABLE_NAME;

Вместо '%Key' -> '%FK4eIKa4vC33vluosjyKmFjgDPk3o' и смотрите какая колонка от какой зависит.

И насколько я понимаю update = delete->insert в sql

Так откуда зависимость, как раз понятно из сообщения: в другой таблице AppFormCommunication есть ссылка ContactCommunicationId. Но почему при изменении ContactCommunication связь сломалось — надо разбираться.

Update — это не Delete с Insert. Ведь при переименовании какого-нибудь контакта система не ругается на связи с ним.

Тут одно из двух: либо скрипт автора темы затирает первичный ключ Id в этих записях новыми значениями (что маловероятно), либо есть какая-то логика на изменении этой таблицы в виде отдельного БП, встроенного БП объекта или триггера в базе.

Понять можно либо изучением всех упоминаний объекта ContactCommunication во всех схемах, либо, если есть доступ к БД, запустить профайлер и смотреть, что за Delete.

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

Добрый час суток!

Немного не могу понять как построить запрос на UPDATE в мобильном приложении.

Например я хочу сделать такой запрос SQL

UPDATE TEST SET IsChecked = 1 WHERE Question = '' and Answer = ''

Я делаю так:

        var filters = Ext.create("Terrasoft.Filter", {

                type: Terrasoft.FilterTypes.Group,

                logicalOperation: Terrasoft.FilterLogicalOperations.And

            });

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Question ",

                value: multiAnswerId // тут Id Question (для фильтра как выше)

        }));

        filters.addFilter(Ext.create("Terrasoft.Filter", {

                property: "Answer ",

                value: answerVariantId // тут Id Answer(для фильтра как выше)

        }));

        var sql = Terrasoft.Sql.UpdateBuilder.build({

                model: "Test", //Таблица в которую хочу сделать запрос

                queryConfig: queryConfig, //что это ?

                record: record, // что это?

                filter: filters,// это у меня есть

                includeOnlyModifiedColumns: true // что это?

        });

        sqls.push(sql);

        

Подскажите пожалуйста,как мне в мой обьект который я бросаю (var sql = ...) добавить по сути SET IsChecked =1 ? Ведь фильтры я уже сделал,а как сформировать немного не пойму.. может мне даже QueryConfig и includeOnlyModifiedColumns вообще ну нужны ? и достаточно как то константами сделать ? Спасибо заранее!

Нравится

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

В мобильной версии используется своя локальная база данных, поэтому, чтобы нормально отработала синхронизация с основной, лучше не напрямую с update-запросами в неё, а получение в цикле записей из отфильтрованного набора данных, изменение в каждой записи значения колонки и сохранение.

Вот пример фильтрации и перебора:

// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

Вот пример изменения и сохранения записи (но новой, а не существующей):

var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

 

А,разобрался,засейвить забыл. Спасибо,но результат тот же что и при обычном выполнении синхронизация с освновной базой  не работает. Вот полный код:

var store = Ext.create('Terrasoft.store.BaseStore', {

            model: 'SuInterviewAnswerChoice'

        });

        var queryConfig = Ext.create('Terrasoft.QueryConfig', {

            columns: ['SuInterviewQuestion', 'SuAnswer', 'SuIsChecked'],

            modelName: 'SuInterviewAnswerChoice'

        });

        

        store.loadPage(1, {

            queryConfig: queryConfig,

            filters: Ext.create('Terrasoft.Filter', {

                property: 'SuInterviewQuestion',

                value: multiAnswerId

            }),

            callback: function(records, operation, success) {

                for(var i =0; i<records.length;i++){

                    if(records[i].data.SuAnswer === answerVariantId){

                        var isChecked = records[i].get('SuIsChecked');

                        if(!isChecked){

                            records[i].set('SuIsChecked',true);

                            records[i].save({

                                success: function() {

                                    console.log('Successfully');

                                },

                                failure: function(exception) {

                                    Terrasoft.MessageBox.showException(exception);

                                },

                                queryConfig: Ext.create('Terrasoft.QueryConfig', {

                                    modelName: records[i].self.modelName,

                                    columns: ['SuIsChecked']

                                })

                            }, this);

                            return;

                        }

                    }

                    

                }

            },

            scope: this

        });

 

 

Вероятно, при синхронизации система не видит, что запись менялась. Проверьте, меняет ли эта логика поле с датой изменения. И что будет, если его менять.

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

да,меняет. Поле ModifiedOn меняется. Подскажите пожалуйста еще,как правильно написать Insert,спасибо!

Зверев Александр, Просто документации по мобилке в плане этого очень мало.обрываю исходники пишу по примерам +- но синхронизация так и не появляется.

Зверев Александр пишет:

Вот пример изменения и сохранения записи (но новой, а не существующей):


 
var record = Ext.create('Contact');
record.phantom = true;
//свойство модели phantom указывает на то, новая ли это запись или существующая
record.set('Name', 'New Contact');
 
record.save({
    success: function() {
        ...
    },
    failure: function(exception) {
        Terrasoft.MessageBox.showException(exception);
    },
    queryConfig: Ext.create('Terrasoft.QueryConfig', {
        modelName: record.self.modelName,
        columns: ['Name']
    }
}, this);

или я так понимаю вот это можно использовать вместо InsertBuilder?

 

Да, лучше вместо InsertBuilder использовать редактирование и сохранение записи.

Зверев Александр,Спасибо

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

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

Зверев Александр пишет:

В мобильной версии используется своя локальная база данных, поэтому, чтобы нормально отработала синхронизация с основной, лучше не напрямую с update-запросами в неё, а получение в цикле записей из отфильтрованного набора данных, изменение в каждой записи значения колонки и сохранение.

Вот пример фильтрации и перебора:


 
// Создание экземпляра хранилища для данных модели Contact.
var store = Ext.create('Terrasoft.store.BaseStore', {
    model: 'Contact'
});
 
// Создание конфигурационного объекта с дополнительными параметрами запроса на выборку данных.
var queryConfig = Ext.create('Terrasoft.QueryConfig', {
    // Определение колонок, которые будут возвращены в запросе.
    columns: ['Name', 'Id', 'Account'],
    // Имя модели, к которой выполняется запрос.
    modelName: 'Contact'
});
 
// Загрузка данных в хранилище. Будет возвращена первая страница данных.
store.loadPage(1, {
    queryConfig: queryConfig,
    // Дополнительно указывается фильтрация возвращаемых данных по колонке Name.
    filters: Ext.create('Terrasoft.Filter', {
        // Имя колонки, по которой выполняется фильтрация.
        property: 'Name',
        // Значение для фильтрации.
        value: 'Test Name'
    }),
    // Функция обработки результатов выполнения запроса.
    callback: function(records, operation, success) {
        // Получение первой записи возвращенного набора.
        var loadedRecord = records[0];
        if (loadedRecord) {
            // Получение значения поля Account.
            var contactAccount = loadedRecord.get('Account');                                                                                                    
            if (contactAccount) {                                                                                                                   
                // Выполнение действий с полученным значением.
            }
        }
    },
    scope: this
});

 

Работайте асинхронно, через callback.

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

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

Основная логика bpm'online реализуется в веб-версии, мобильная имеет вспомогательное применение, её SDK не настолько подробен и не включает всех возможных сценариев. Если у Вас есть необходимость в какой-то логике, которую не реализовать иначе, можете завести идею, описать там подробно своё пожелание и, возможно, в новых версиях такое реализуют.

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

Можно ли каким-то образом построить такой запрос на клиенте:

update KitTrackingInformation

set

    TrackingNumber = @TrackingNumber

from KitTrackingInformation

        join BTSample on BTSample.BTKitIDLookupId = KitTrackingInformation.KitId

            join BTSampInShipment on BTSampInShipment.BTSampleIDId = BTSample.Id

where SampInShipment.BTShipmentId = @ShipmentId

Понятно, что это будет выглядеть приблизительно так:

                    var updateTrackingInfo = Ext.create("Terrasoft.UpdateQuery", {

                        rootSchemaName: "KitTrackingInformation"

                    });

                    updateTrackingInfo.setParameterValue("TrackingNumber", trackingNumber,

                        Terrasoft.DataValueType.SHORT_TEXT);

                                       updateTrackingInfo.filters.addItem(updateTrackingInfo.createColumnFilterWithParameter(

                        this.Terrasoft.ComparisonType.EQUAL,

                        "<путь по связям для фильтрации>", shipmentId));

                    updateTrackingInfo.execute(function(response) {

                        if (response.success) {

                            debugger;

                        }

                    }, this);

Из всего вышеописанного следует 2 вопроса:

1) каким образом построить путь для фильтрации

2) можно ли вообще реализовать UpdateQuery с фильтрацией по полю связанной таблицы

Нравится

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

Алла, скорее всего, такое условие можно получить по обратным связям, когда пишется три поля через двоеточие в квадратных скобках. В этом случае две обратных связи подряд, то есть будет [::].[::].

Вот пример даже тройного join-а:

[SysAdminUnit:Contact:Owner].[SysUserInRole:SysUser:Id].[SysAdminUnit:Id:SysRole].Id

Ещё один:

[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole

Сработает ли для update, нужно тестировать, глядя на получающиеся запросы в SQL-профайлере.

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

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

А какие sql-запросы получаются в итоге по этим примерам?

К сожалению, нет возможности посмотреть в профайлере код запросов.

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

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

Подозреваю что должно выглядеть это как то так, но не получается:

 

$url = 'https://MYSITE.bpmonline.com/0/DataService/json/reply/UpdateQuery';

                $arr = [

                    'RootSchemaName' => "Contact",

                    'OperationType' => "Delete",

                    'ColumnValues' => [

                        'Items' => [

                            'Skype' => [

                                'ExpressionType' => 'Parameter',

                                'Parameter' => [

                                    'DataValueType' => 'Text',

                                    'Value' => 'skype_login_4'

                                ]

                            ]                

                        ]

                    ],

                    'Filters' => [

                        'RootSchemaName' => 'Contact',

                        'FilterType' => 'FilterGroup',

                        'Items' => [

                                'FilterByUsrMainMail' => [

                                    'FilterType' => 'CompareFilter',

                                    'ComparisonType' => 'Equal',

                                    'LeftExpression' => [

                                        'ExpressionType' => 'SchemaColumn',

                                        'ColumnPath' => 'UsrMainMail'

                                    ],

                                    'RightExpression' => [

                                        'ExpressionType' => 'Parameter',

                                        'Parameter' => [

                                            'DataValueType' => 'Text',

                                            'Value' => contactemail@example.com

                                        ]

                                    ]

                                ]

                        ]

                    ]

                ];

$this->crm_curl($url, $arr, 10);

Нравится

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

Добрый день.

Рекомендую сначала попробовать отправлять запросы через Fiffler. Например, запрос с телом 

{
   "QueryType":2,
   "Filters":{
      "FilterType":6,
      "ComparisonType":0,
      "Items":{
         "FilterByName":{
            "FilterType":1,
            "ComparisonType":3,
            "LogicalOperation":0,
            "LeftExpression":{
               "ExpressionType":0,
               "ColumnPath":"Number",
            },
            "RightExpression":{
               "ExpressionType":2,
               "Parameter":{
                  "DataValueType":1,
                  "Value":"Skup4",
               },
            },
         }
      },
   },
   "RootSchemaName":"ContactCommunication",
   "OperationType":0
}

удалит скайп "Skup4". И не забывайте про куки, и заголовки, более подробно на академии (запрос изменится для DataService) https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

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