Добрый час суток!
Немного не могу понять как построить запрос на 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 вообще ну нужны ? и достаточно как то константами сделать ? Спасибо заранее!
Нравится
В мобильной версии используется своя локальная база данных, поэтому, чтобы нормально отработала синхронизация с основной, лучше не напрямую с 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 });
Зверев Александр,
так не выйдет,потому что должен сформироваться конфиг с елементами.которые нужно отрендерить, и выходит что конфиг формируется не тот,который нужен,потому что нету данных из бд,а когда они приходят в кол бек,то онфиг уже сформирован(неправильный).
Основная логика bpm'online реализуется в веб-версии, мобильная имеет вспомогательное применение, её SDK не настолько подробен и не включает всех возможных сценариев. Если у Вас есть необходимость в какой-то логике, которую не реализовать иначе, можете завести идею, описать там подробно своё пожелание и, возможно, в новых версиях такое реализуют.