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