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


Участник
**

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

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




Репутация:   4  


Привет! :) Пишу на этот раз сразу несколько сообщений.
09.02.2012 часть 1
уточнения про Т2

1)
Цитата(Tonal @ 9.2.2012, 9:45) *
не ясно что делать при наличии 2х и более одинаковых (или очень близких) значений PARAM в массиве
У меня для Т2 предполагается, что в одном и том же массиве не могут приходить одинаковые значения.
Близкими значения могут быть, но при этом они все равно будут разными.

2)
Цитата(Tonal @ 9.2.2012, 9:45) *
Как-то ты же должна задавать на этом массиве порядок/сортировку для выборки.
Сортировка Т2 установлена всегда по возрастанию значения PARAM.

3)
Цитата(Tonal @ 9.2.2012, 9:45) *
Цитата
Поступает 1-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 445.00),
оператор начинает его просмотр,
делает текущей запись со значением 300.45,

Куда позиционироватся, если следующий запрос вернёт:
PARAM (445.00, 2.34, 300.45, 1.23)
- на 300.45, так как массив с моей точки зрения не изменился, ведь он всегда сортируется по возрастанию,

Цитата(Tonal @ 9.2.2012, 9:45) *
или
PARAM (1.23, 2.34, 300.45, 300.45, 300.45, 300.45, 445.00)
- такой массив не может поступить,

Цитата(Tonal @ 9.2.2012, 9:45) *
или
PARAM (3.38, 1.32, 300.45001, 455.01, 300.44999)
- на 1.32 (на min значение), так как значение 300.45 с моей точки зрения изменилось.

09.02.2012 часть 2
-----------------------------------------------------------------------------
уточненная постановка задачи !!!

4) Пока разбиралась с программой, уточнила постановку задачи.
Она оказалась проще, чем я рассчитывала. Поняла ее так.


Есть цикл работы, например, 5 сек. Он может измениться.

Есть "анализатор" и несколько "устройств". Со всеми устройствами анализатор работает одинаково.
Анализатор (с каким-то своим внутренним циклом) собирает данные от устройства,
на основе этих данных рассчитывает массив значений параметра PARAM этого устройства
и посылает этот массив мне (не чаще раза в цикл работы 5 сек) для сохранения в БД.
(Поэтому, в Т2 у меня есть еще поле с номером устройства TO_OBJ_ID, внешний ключ.)

Передача массива для устройства в каждом рабочем цикле не является обязательной.
Если анализатор насчитал новые значения параметра для устройства, то он передает массив.
Если массив для устройства "устаканился" (определился с нужной точностью, а данные от устройства
в последнее время резко не менялись), то анализатор приостанавливает для этого устройства
передачу массива в БД.

Получается, что массив для Т2 будет поступать ко мне только при его изменении.
И я была не права, когда сказала, что
Цитата(Steklova Olga @ 3.2.2012, 21:20) *
Данные разных массивов:
- могут полностью совпадать,

И тогда логичнее, как мне кажется, был бы следующий вариант А.

А) Вариант для случая, когда массив будет поступать ко мне только при его изменении.
При поступлении очередного массива
- удалить старый массив, добавить новый массив,
сделать текущей первую запись.
(Не "отлавливать блох", проверяя, осталось ли в новом массиве значение PARAM, бывшее текущим.
Тогда и оператор сразу увидит, что массив изменился, а не будет пребывать в неведении.)


Цитата(Tonal @ 9.2.2012, 9:45) *
Что-то я не очень понял, если для Т2 используется та же структура, то почему не использовать ID для позиционирования.

- Когда я раньше, при поступлении очередного массива проверяла, какая запись была до этого текущей,
я не могла проверять ID, так как я удаляю старый массив вместе со всеми этими ID и добавляю новый.
Ведь ID - автоинкрементное поле.
- Теперь, в варианте А, в соотв. с новым пониманием постановки задачи, можно будет для позиционирования
использовать ID вместо PARAM.
ID - автоинкрементное поле.
- В Т1 можно позиционироваться по ID, так как там записи не удаляются.

Б) Вариант для случая, когда массив будет поступать ко мне каждый цикл, даже если массив не изменился.
Этот вариант для моей программы, получается, не нужен, но остается интерен мне теоретически, на будущее.
При поступлении очередного массива
- отсортировать новый массив по возрастанию PARAM (?),
- сравнить новый массив со старым (?),
- если они абсолютно совпадают, то оставить все как было,
- если массивы хоть немного отличаются, то удалить старый массив, добавить новый массив,
сделать текущей первую запись.
Здесь тоже можно будет для позиционирования использовать ID вместо PARAM.
ID - автоинкрементное поле.
-----------------------------------------------------------------------------

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

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


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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.4.2025, 21:34