просмотр таблицы с меняющимися данными, запоминание и выделение тек строки |
Здравствуйте, гость ( Вход | Регистрация )
просмотр таблицы с меняющимися данными, запоминание и выделение тек строки |
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, видимо используя какую-то точность сравнения. Или так и надо? Других вариантов не придумала. У кого какие мысли есть по этому поводу? Спасибо. |
|
|
Steklova Olga |
7.2.2012, 14:40
Сообщение
#2
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
1)
Цитата Используйте биндинг переменных Понятно, как использовать биндинг, если надо добавить или обновить запись, а в запросе указать значения всех полей записи (конечно, кроме генератора).А вот другой случай... И как Вы здесь прикрутите биндинг? Например, есть таблица БД с полями ID (INTEGER, PK), PARAM (DOUBLE, необяз), FINT1 (INTEGER, необяз), FINT2 (INTEGER, необяз), FSTR (VARCHAR(20), необяз). Для записи или обновления данных таблицы поступает структура, содержащая значения полей записи.
Если поступает запись с новым id, то добавляем ее в таблицу. Если поступает запись со старым id, то обновляем соотв. запись в таблице. При формировании запросов из числа необязательных полей указываем только те, значения которых поступили в структуре, остальные значения полей должны остаться без изменения. Используем следующие признаки того, что необязательные поля не поступили: - для поля PARAM: param = null_double, - для поля FINT1: fint1 = null_qint32, - для поля FINT2: fint2 = null_qint32, - для поля FSTR: str.isEmpty(). Сейчас я использую функцию, формирующую часть строки запроса для записи или обновления данных любой таблицы БД. Эта часть строки запроса имеет вид: "(<список наименований полей записи, поступивших в структуре>) VALUES (<список соотв. значений полей>)". Входным параметром функции является вектор. Элемент вектора - структура, содержащая информацию о поле таблицы, в том числе
2) Цитата По поводу стартового вопроса было бы неплохо уточнить, зачем нужна вообще выделенная строка в таблице T2, если данные там постоянно меняются. Дело в том, что - таблица предназначена для просмотра текущего массива оператором, - для отображения таблицы на экране отведено не так много места, чтобы видеть сразу все записи, тем более, если их 200, - не каждые 5 сек все значения массива меняются, - Если оператор начнет скроллинг таблицы, а в это время, например, обновится массив только в одном значении (не в текущей строке), хочется, чтобы оператор спокойно остался на прежней текущей строке, а измененную строку он увидит, продолжив скроллинг. Если не запоминать текущую строку, то невозможно будет спокойно просматривать массив, при каждом обновлении массива текущей будет становится первая строка. Это будет даже в том случае, если данных разных массивов будут полностью совпадать, ведь я же удаляю старый массив и добавляю новый. Сообщение отредактировал Steklova Olga - 7.2.2012, 14:57 |
|
|
Текстовая версия | Сейчас: 25.11.2024, 18:46 |