crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> просмотр таблицы с меняющимися данными, запоминание и выделение тек строки
Steklova Olga
  опции профиля:
сообщение 3.2.2012, 21:20
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Всем привет! ;)
Есть у меня две таблицы БД: T1 и T2, в каждой есть поля ID INTEGER (PK, автоинкрементное) и PARAM FLOAT. Для работы с таблицами использую QSqlTableModel и QTableView.

Во время работы программы в таблицу T1 записи только добавляются.
Организую заполнение и просмотр следующим образом:
- при поступлении первой записи добавляю ее в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей, запоминаю соотв. значение ID,
- при поступлении следующей записи добавляю ее в таблицу БД, выполняю select для модели, строку с запомненным ID делаю текущей, делаю скроллинг отображения для обеспечения видимости текущей строки,
- при изменении текущей строки оператором запоминаю значение ID. Тут все OK.

А вот с таблицей T2 посложнее...
Во время работы программы, периодически (вероятно, не чаще, чем 1 раз в 5 сек), для занесения в таблицу T2 приходит сразу целый массив записей (размер массива - от одной до 200 записей). Мне надо хранить в БД данные только последнего массива.
Данные разных массивов:
- могут полностью совпадать,
- могут отличаться всеми значениями,
- могут отличаться несколькими значениями,
- могут отличаться количеством значений.
Организую заполнение и просмотр следующим образом:
- при поступлении первого массива добавляю поступившие записи в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей,
- при поступлении следующего массива удаляю все записи из таблицы БД, добавляю поступившие записи в таблицу БД, выполняю select для модели, первую строку таблицы делаю текущей (пока так).

Как здесь просматривать таблицу с запоминанием и выделением текущей строки?
1) Запоминать ID текущей строки? Здесь это не поможет, так как поле автоинкрементное.
2) Сделать поле ID не автоинкрементным, не удалять предыдущий массив и добавлять новый, а обновлять массив? Этот вариант мне совсем не нравится, по-моему, он очень сложный.
3) Запоминать PARAM текущей строки, а при поступлении следующего массива искать в нем запись с запомненным PARAM и делать ее текущей? А если такая не найдется, то делать текущей первую. Но для этого придется сравнивать значения типа FLOAT, видимо используя какую-то точность сравнения. Или так и надо? :huh:
Других вариантов не придумала. У кого какие мысли есть по этому поводу? Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 10.2.2012, 10:14
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


09.02.2012 часть 3
5)
Цитата(Tonal @ 9.2.2012, 9:45) *
Кстати, что делается в случае если param == null_double для записи с новым ID?
Если для записи в Т3 поступит структура
с id, которого еще не было в таблице, и с param == null_double, то в Т3 будет добавлена запись.
В INSERT я укажу поле ID, равное id, и не укажу поле PARAM.
Неуказанное поле, насколько я понимаю, по умолчанию окажется == NULL.

6)
Цитата(Tonal @ 9.2.2012, 9:45) *
Про способы использования:
1. Я имел в виду, что ты всё оставляешь как сейчас, но при генерации текста запроса вместо данных подставляешь заполнители (например символы "?").
После этого биндишь переменные (как в справке по QSqlQuery)
В этом случае данные в сервер попадают минуя преображение в строку у тебя в коде и обратно на сервере.
Меньше преобразований - меньше накапливается ошибок.
Причём объект QSqlQuery после prepare можно не удалять, а сохранить где-то, и для следующего запроса только подставить (забиндить) новые параметры.
Это ясно (для Т1).

7)
уточняющий вопрос про prepare и addBindValue

Поля таблицы T2:
ID INTEGER NOT NULL (PK, автоинкрементное поле), N записи,
TO_OBJ_ID INTEGER NOT NULL (FK), N устройства,
PARAM DOUBLE PRECISION NOT NULL, значение параметра.
Таблица Т2 может содержать [0..200] значений PARAM для каждого TO_OBJ_ID.

А для обработки поступившего массива со значениями PARAM для одного конкретного TO_OBJ_ID
вариант а) лучше, чем б) и в)? (TO_OBJ_ID здесь одно и то же, PARAM - разные)
typedef struct {
    int obj_id;
    QVector<double> param;
} tobj;
tobj* obj;
...
int param_size = obj->param.size();
if (param_size > 200)
    param_size = 200;

а)
query.prepare("INSERT INTO T2 (TO_OBJ_ID, PARAM) VALUES (?, ?)");
for (int i = 0; i < param_size; i++) {
    query.addBindValue(obj->obj_id);
    query.addBindValue(obj->param[i]);
    query.exec();
}
б)
query.prepare(QString("INSERT INTO T2 (TO_OBJ_ID, PARAM) VALUES (%1, ?)").arg(obj->obj_id));
for (int i = 0; i < param_size; i++) {
    query.addBindValue(obj->param[i]);
    query.exec();
}
в)
query.prepare("INSERT INTO T2 (TO_OBJ_ID, PARAM) VALUES (" + QString::number(obj->obj_id) + ", ?)");
for (int i = 0; i < param_size; i++) {
    query.addBindValue(obj->param[i]);
    query.exec();
}

8 )
Цитата(Tonal @ 9.2.2012, 9:45) *
В случае Т3 можно сделать кеширование.
Например QMap где ключом будет состав изменяемых полей а значением - препарированный запрос.
Вы предлагаете использовать QMap<K, T>, структуру данных, которая содержит пары ключ-значение,
упрядоченные по возрастанию ключей?
Я понимаю так, что это будет
QMap<QString, QVariant> map;
где QString - наименование поля таблицы, QVariant - значения поля таблицы.
Вставляем в map только поступившие в Rec значения полей и их наименования,
для чего для каждого поля проверяем, равно ли его значение константе null_... для соотв. типа поля.
Из полученного списка keys получаем часть строки запроса с названиями полей,
дополняем строку соотв. кол-вом символов '?',
потом в цикле делаем addBindValue, занося в запрос значения полей из полученного списка values.

9) То, что Вы написали нужно проверять в триггере, понятно. Только я пока не создавала таких триггеров в базе, а делала проверки в тексте Qt.

10) С хранимками еще совсем не разбиралась. :unknw:

11)
Цитата(Tonal @ 9.2.2012, 9:45) *
Ну и я бы стал делать вариант 2 (с триггерами) и 3 (с хранимками) только в том случае,
если данные в базу могут поступать из разных приложений.
В противном случае это дополнительное усложнение схемы данных.
Уф, успокоили, что это необязательно для моего случая.
Мне еще не доводилось писать базы, данные в которые прямо записываются из разных приложений.
Сама из Qt-программы пишу данные в БД, выдаю результаты запросов к БД другим людям, модули которых
вместе с моими находятся в одном приложении.

Уважаю за терпение дочитавших до конца! Простите студента за многословие. :)

Сообщение отредактировал Steklova Olga - 10.2.2012, 10:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Steklova Olga   просмотр таблицы с меняющимися данными, запоминание и выделение тек строки   3.2.2012, 21:20
- - ilyabvt   Цитата3) Запоминать PARAM текущей строки, а при по...   3.2.2012, 23:51
- - Steklova Olga   ЦитатаСравнивайте также как вы бы сравнивали целоч...   4.2.2012, 21:22
|- - ilyabvt   Цитата(Steklova Olga @ 5.2.2012, 0:22) Ци...   4.2.2012, 22:46
- - Steklova Olga   ЦитатаЯ не имел ввиду что нужно конвертировать в ц...   5.2.2012, 17:34
- - Steklova Olga   Однако не все так тривиально... 1) Зачем-то же на...   6.2.2012, 20:04
|- - Tonal   Цитата(Steklova Olga @ 7.2.2012, 0:04) Де...   7.2.2012, 8:11
- - Steklova Olga   1) ЦитатаИспользуйте биндинг переменныхПонятно, ка...   7.2.2012, 14:40
- - Tonal   1) Ты же вроде бы писала, что T2 ты очищаешь и вст...   8.2.2012, 8:51
- - Steklova Olga   Таблицы Т1 и Т2 - это один пример, таблица БД с п...   8.2.2012, 12:14
- - Tonal   Про Т2 и прзиционирование: Что-то я не очень понял...   9.2.2012, 9:45
- - Steklova Olga   Привет! Пишу на этот раз сразу несколько сооб...   9.2.2012, 21:04
- - Steklova Olga   09.02.2012 часть 3 5) Цитата(Tonal @ 9.2.2012...   10.2.2012, 10:14
- - Tonal   Т. е. с позиционированием ты разобралась. Могу то...   10.2.2012, 12:00
- - Steklova Olga   Привет! 6. Цитатасохраняется ли препарированн...   10.2.2012, 17:01


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 9:25