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
  опции профиля:
сообщение 8.2.2012, 12:14
Сообщение #2


Участник
**

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

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




Репутация:   4  


Таблицы Т1 и Т2 - это один пример,
таблица БД с полями ID, PARAM, FINT1, FINT2, FSTR - это таблица Т3, другой пример.
В T1 записи только добавляются,
в T2 удаляются старые записи и добавляются новые,
в Т3 записи добавляются или обновляются в зависимости от поступившего ID
(UPDATE OR INSERT INTO T3 ... MATCHING (ID)).

Цитата(Tonal @ 8.2.2012, 8:51) *
Ты же вроде бы писала, что T2 ты очищаешь и вставляешь данные по новой. Т. е. в этом случае у тебя только 1 sql для удаления и 1 для вставки.
Да

Цитата(Tonal @ 8.2.2012, 8:51) *
Как использовать биндинг вроде очевидно
Так как в Т2 все поля обязательные, то для Т2 - да, очевидно.

Цитата(Steklova Olga @ 7.2.2012, 14:40) *
Если оператор начнет скроллинг таблицы, а в это время, например, обновится массив только в одном значении (не в текущей строке), хочется, чтобы оператор спокойно остался на прежней текущей строке, а измененную строку он увидит, продолжив скроллинг.
Если не запоминать текущую строку, то невозможно будет спокойно просматривать массив, при каждом обновлении массива текущей будет становится первая строка.
Это будет даже в том случае, если данных разных массивов будут полностью совпадать, ведь я же удаляю старый массив и добавляю новый.
Здесь я говорю о Т2. А под словом "обновится" я подразумеваю не то, что я делаю таблице UPDATE, а то, что меняются данные поступающего массива, например.
Поступает 1-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 445.00),
оператор начинает его просмотр,
делает текущей запись со значением 300.45,
поступает 2-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 1888.00),
<здесь я перерисовываю таблицу, но хочу, чтобы текущей осталась запись со значением 300.45>,
поступает 3-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 1888.00, 2001.45),
<здесь я перерисовываю таблицу, но хочу, чтобы текущей осталась запись со значением 300.45>.

Цитата(Tonal @ 8.2.2012, 8:51) *
Почему тогда просто не привязываться к порядковому номеру и верхней видимой строке?
Других-то ориентиров у пользователя всё равно нету...
В соотв. с выше написанным, мне надо привязываться не к ID, а к PARAM, ориентир - это PARAM.

Но я-то хочу во всех случаях (для Т1, Т2, Т3 и любых других моих таблиц, в том числе с любым количеством необяз. полей) использовать одну функцию формирования запроса.
Поэтому я и пишу s.setNum(d, 'f', 15).

Читаю дальше Ваши предложения...
Цитата(Tonal @ 8.2.2012, 8:51) *
Но даже если рассматривать более общий случай, который ты описываешь, то можно использовать биндинг несколькими способами:
1. Генерить параметрический sql (без данных) для каждого случая.
Если я Вас правильно поняла, то в этом случае для Т3, в которой четыре необяз. поля, придется писать 16 параметр. sql (все комбинации).

Цитата(Tonal @ 8.2.2012, 8:51) *
2. Использовать всегда полный insert/update с биндингом а в триггерах разбираться какие реально поля изменяются
Я пока не настолько сильна в триггерах, чтобы такое написать. Пока что, использую триггеры только для генераторов.

Цитата(Tonal @ 8.2.2012, 8:51) *
3. Вынести логику разборок с данными на сервер - в сохранённую процедурку.
Очень хорошо, а что будет в этой хранимой процедуре? :scratch_one-s_head: Не могли бы Вы, Tonal, если не жалко, набросать код для случая обновления данных в таблице Т3?

Цитата(Tonal @ 8.2.2012, 8:51) *
Да и в 1ом случае можно добавить систему кеширования позволяющую воспользоваться этими преимуществами.
А эти слова для меня вообще пока как китайская грамота. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




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