Id созданной записи после InsertQuery

Всем доброго времени суток.
Версия 7.10.

Есть insertQuery - создание записи в таблице. Примерно такой:

var bq = $this.Ext.create("Terrasoft.BatchQuery");
                                                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                                rootSchemaName: "UsrObject"
                                                            });
                                                           
                                                            insert.setParameterValue("UsrId", "id", $this.Terrasoft.DataValueType.TEXT); //id
                                                       
                                                        bq.add(insert);
                                               
                                                        bq.execute(function(response){
                                                                console.log(response);
                                                        }, this);

В респонсе вываливается что-то примерно такого вида:

{queryResults: Array(0), success: true}

Запись же при этом создаётся.
Вопрос как узнать именно Id созданной записи в рамках базы. Имеется в виду не пользовательский, а тот, который присваивается каждой записи вида "9bed938d-9e06-4176-8ff5-8ec6ab49ca9a"?

Нужно чтобы потом сделать в ту же запись Update.

Нравится

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

Добрый день, Денис!

К сожалению, сразу получить guid на клиент с помощью InsertQuery не получится, так как идентификатор формируется на уровне базы (newid()). В принципе, можно взять последний объект по дате создания, в большинстве случаев это он и будет. Средствами системы это можно сделать в БП, элемент Добавить данные - а потом элемент Изменить данные, и отфильтровать по Id = Id созданной записи элемента Добавить данные.

Илья, а если допустим создать сервис, или БП, и создавать внутри него (т.е. на бекенде прямо в базе), то можно ли будет его вернуть в качестве response от сервиса?

Денис, пожалуйста, все-таки можно. Execute возвращает только количество добавленных строк, поменять сигнатуру ядровых методов не получится. Но ведь мы можем сами сгенерировать Id в C#-
Guid.NewGuid(), и передать его в InsertQuery. После чего данный guid можно будет успешно использовать в других запросах.

double post

Илья, спасибо, ещё один вопрос, чтобы прояснить все варианты.

Есть такая функция: Terrasoft.generateGUID();

Если я сделаю вот так:

var myGuid = Terrasoft.generateGUID();
var bq = this.Ext.create("Terrasoft.BatchQuery");
                                                                        var insert = Ext.create("Terrasoft.InsertQuery", {
                                                                rootSchemaName: "UsrObject"
                                                            });
 
insert.setParameterValue("Id", myGuid, this.Terrasoft.DataValueType.GUID); //id
                                                            insert.setParameterValue("UsrId", "id", this.Terrasoft.DataValueType.TEXT); //id
 
                                                        bq.add(insert);
 
                                                        bq.execute(function(response){
                                                                console.log(response);
                                                        }, this);

Сохранится ли запись под myGuid, вообще, возможно ли его таким образом сгенерировать?

UPD. По моему, работает.

Если делать на сервере C#-кодом, то Id можно вставить как и любое другое поле.

				using (var dbExecutor = UserConnection.EnsureDBConnection()) {
					var insert = new Insert(UserConnection)
					.Into("CampaignPurchaseQtyCount")
					.Set("Id", Column.Parameter(x.Id))
					.Set("CreatedOn", Column.Parameter(DateTime.UtcNow))
					.Set("CreatedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
					.Set("ModifiedOn", Column.Parameter(DateTime.UtcNow))
					.Set("ModifiedById", Column.Parameter(UserConnection.CurrentUser.ContactId))
					.Set("ProcessListeners", Column.Parameter(0))
					.Set("PurchaseDate", Column.Parameter(PurchaseDate.Date))
					.Set("CampaignId", Column.Parameter(x.CampaignId))
					.Set("CardId", Column.Parameter(x.CardId))
					.Set("IsRewarded", Column.Parameter(x.IsRewarded));
					insert.Execute(dbExecutor);
				}

Уникальный GUID на C# генерится:

var UId = Guid.NewGuid();

Александр прав, id - это просто поле. Необязательное для Insert'a

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