Вопрос

Всем добрый день! Столкнулся с проблемой, в замещенной схеме 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…

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

Столкнулся со странной ошибкой во время выполнения UpdateQuery:

{
    "success":false,
    "responseStatus": {
        "ErrorCode":"FormatException",
        "Message": "Expected hex 0x in '{0}'.",
        "Errors":[]
    },
    "rowsAffected":-1,
    "nextPrcElReady":false
}

Кто-нибудь знает, в чем может быть причина? Буду благодарен за подсказки

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

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

"Франчук Виталий" написал:Кто-нибудь знает, в чем может быть причина?

В типе колонки. Дебаггером пройдите по update.setParameterValue(поле, значение, тип) и посмотрите соответствие между указаным типом и тем, какое значение задаётся.

"Варфоломеев Данила" написал:
Франчук Виталий пишет:

Кто-нибудь знает, в чем может быть причина?

В типе колонки. Дебаггером пройдите по update.setParameterValue(поле, значение, тип) и посмотрите соответствие между указаным типом и тем, какое значение задаётся.


Вот функция, которая вызывает UpdateQuery:

updateGame: function(id, newTitle) {
    if (id && newTitle) {
  	window.console.log("New title:", newTitle);
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
		rootSchemaName: "clrsGamesAvailable"
	});
	updateQuery.filters.addItem(this.createIdColumnFilter(id));
	updateQuery.setParameterValue("clrsGameTitle", newTitle, Terrasoft.DataValueType.TEXT);
 
	updateQuery.execute(function() {
		window.console.log("Game", id, "was updated.");
	});
    }
}

Там в значении параметра - строка (проверил). Есть аналогичная функция, которая создает объекты с еще двумя параметрами. Конкретно этот параметр задан также. Но с InsertQuery все работает, а с UpdateQuery - нет(

"Франчук Виталий" написал:Но с InsertQuery все работает, а с UpdateQuery - нет(

значит проверить фильтр. что this.createIdColumnFilter(id) формирует (надеюсь id - это guid).
плюс скорее всего после execute будет ошибка. id в коллбеке пропадёт

"Варфоломеев Данила" написал:
Франчук Виталий пишет:

Но с InsertQuery все работает, а с UpdateQuery - нет(

значит проверить фильтр. что this.createIdColumnFilter(id) формирует (надеюсь id - это guid).
плюс скорее всего после execute будет ошибка. id в коллбеке пропадёт

createIdColumnFilter: function(id) {
	return Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", id);
}

Фильтр вроде как надо создаеться. Смотрел в теле запроса, который получился - там guid

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

Как известно, для удаления записей из таблицы, правильней всего создавать
специальный DeleteQuery, но как показала практика - делать это всем лень :)
для таких случаев была написана следующая функция.

function DeleteRecords(Dataset, Dictionary) {
   if (!Assigned(Dataset)) {
      if (!IsEmptyValue(Dataset) &&
         Assigned(Services.InformationsByUSI(Dataset))) {
         Dataset = GetSingleItemByCode(Dataset, 'DeleteRecords');
      } else {
         return;
      }
   }
   if ('DBDataset' == Dataset.ServiceTypeCode) {
      var Table = Dataset.SelectQuery.Items(0).FromTable;
   } else
   if ('Table' == Dataset.ServiceTypeCode) {
      var Table = Dataset;
   } else {
      return;
   }
   var dq = Services.CreateItem('DeleteQuery');
   dq.Table = Table;
   var TableFields = Table.Fields;
   var Filters = dq.Filters;
   var Parameters = dq.Parameters;

   var TableField;
   var FilterFieldType;
   var CompareOperatorType = cotEqual;
   var Parameter;
       
   var Keys = new VBArray(Dictionary.Keys()).toArray();
   var KeysLength = Keys.length;
   for (var i = 0; i KeysLength; i++) {
      TableField = TableFields.ItemsByName(Keys[i]);
      FilterFieldType =
         GetParameterTypeBySQLDataType(TableField.SQLDataType);
      Parameter = AddQueryParameter(Parameters, Keys[i],
         FilterFieldType, Dictionary(Keys[i]));
      AddQueryCompareFilter(Filters, Keys[i], TableField,
         Parameter, CompareOperatorType);
   }
   return dq.Execute();
}

первый параметр - может быть как именем сервиса так и самим объектом Таблица или Датасет;
второй параметр - это набор полей и их значений в виде Словаря.

Функция апдейта:

function UpdateRecord(Dataset, RecordID, Dictionary) {
   if (!Assigned(Dataset)) {
      if (!IsEmptyValue(Dataset) &&
         Assigned(Services.InformationsByUSI(Dataset))) {
         Dataset = GetSingleItemByCode(Dataset, 'UpdateRecord');
      } else {
         return;
      }
   }
   if ('DBDataset' == Dataset.ServiceTypeCode) {
      var Table = Dataset.SelectQuery.Items(0).FromTable;
   } else
   if ('Table' == Dataset.ServiceTypeCode) {
      var Table = Dataset;
   } else {
      return;
   }
   var uq = Services.CreateItem('UpdateQuery');
   uq.Table = Table;
   var TableFields = Table.Fields;
   var Filters = uq.Filters;
   var Parameters = uq.Parameters;
   var Columns = uq.ColumnsValues;

   var TableField;
   var FieldType;
   var CompareOperatorType = cotEqual;
   var Parameter;
   var Column;
       
   TableField = TableFields.ItemsByName('ID');
   Parameter = AddQueryParameter(Parameters, 'ID', sdtGUID, RecordID);
   AddQueryCompareFilter(Filters, 'ID', TableField,
      Parameter, CompareOperatorType);
       
   var Keys = new VBArray(Dictionary.Keys()).toArray();
   var KeysLength = Keys.length;
   for (var i = 0; i KeysLength; i++) {
      TableField = TableFields.ItemsByName(Keys[i]);   
      if (!Assigned(TableField)) {
         continue;
      }
      FieldType = GetParameterTypeBySQLDataType(TableField.SQLDataType);
      AddQueryParameter(Parameters, Keys[i], FieldType,
         Dictionary(Keys[i]));
      Column = Columns.CreateItem();
      Column.ParameterName = Column.KeyValue = Column.Name = Keys[i];
      Column.DataType = FieldType;
      Columns.Add(Column);
   }
   var Result = uq.Execute();
   return Result;
}

первый параметр - может быть как именем сервиса так и самим объектом Таблица или Датасет;
второй параметр - это ID записи в таблице, которую нужно обновить;
третий параметр - это набор полей и их значений в виде Словаря.

Также нужно подключить scr_DB

Пример использования:

var Dictionary = GetNewDictionary();
Dictionary('AccountID') = RecordID;
Dictionary('TypeID') = tOne;
DeleteRecords('tbl_AccountAddress', Dictionary);

var Dictionary = GetNewDictionary();
Dictionary('Name') = 'NewValue';
Dictionary('Name2') = 'NewValue2';
Dictionary('Name3') = 'NewValue3';
UpdateRecord('tbl_Account', RecordID, Dictionary);

Поделиться

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

С некоторых пор функция UpdateRecord уже есть "в коробке", в скрипте scr_JobManagerUtils, но с небольшой доработкой, чтобы не пытались обновить значение ID.
После

      TableField = TableFields.ItemsByName(Keys[i]); 

добавлено:

      if (TableField.SQLName == 'ID') {
          continue;		
	  }
Войдите или зарегистрируйтесь, чтобы комментировать