![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Steklova Olga |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет!
![]() Есть у меня две таблицы БД: 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 |
![]()
Сообщение
#2
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Привет!
![]() 09.02.2012 часть 1 уточнения про Т2 1) не ясно что делать при наличии 2х и более одинаковых (или очень близких) значений PARAM в массиве У меня для Т2 предполагается, что в одном и том же массиве не могут приходить одинаковые значения.Близкими значения могут быть, но при этом они все равно будут разными. 2) Как-то ты же должна задавать на этом массиве порядок/сортировку для выборки. Сортировка Т2 установлена всегда по возрастанию значения PARAM.3) Цитата - на 300.45, так как массив с моей точки зрения не изменился, ведь он всегда сортируется по возрастанию,Поступает 1-й раз массив со значениями PARAM (1.23, 2.34, 300.45, 445.00), оператор начинает его просмотр, делает текущей запись со значением 300.45, Куда позиционироватся, если следующий запрос вернёт: PARAM (445.00, 2.34, 300.45, 1.23) или - такой массив не может поступить,PARAM (1.23, 2.34, 300.45, 300.45, 300.45, 300.45, 445.00) или - на 1.32 (на min значение), так как значение 300.45 с моей точки зрения изменилось.PARAM (3.38, 1.32, 300.45001, 455.01, 300.44999) 09.02.2012 часть 2 ----------------------------------------------------------------------------- уточненная постановка задачи !!! 4) Пока разбиралась с программой, уточнила постановку задачи. Она оказалась проще, чем я рассчитывала. Поняла ее так. Есть цикл работы, например, 5 сек. Он может измениться. Есть "анализатор" и несколько "устройств". Со всеми устройствами анализатор работает одинаково. Анализатор (с каким-то своим внутренним циклом) собирает данные от устройства, на основе этих данных рассчитывает массив значений параметра PARAM этого устройства и посылает этот массив мне (не чаще раза в цикл работы 5 сек) для сохранения в БД. (Поэтому, в Т2 у меня есть еще поле с номером устройства TO_OBJ_ID, внешний ключ.) Передача массива для устройства в каждом рабочем цикле не является обязательной. Если анализатор насчитал новые значения параметра для устройства, то он передает массив. Если массив для устройства "устаканился" (определился с нужной точностью, а данные от устройства в последнее время резко не менялись), то анализатор приостанавливает для этого устройства передачу массива в БД. Получается, что массив для Т2 будет поступать ко мне только при его изменении. И я была не права, когда сказала, что Данные разных массивов: - могут полностью совпадать, И тогда логичнее, как мне кажется, был бы следующий вариант А. А) Вариант для случая, когда массив будет поступать ко мне только при его изменении. При поступлении очередного массива - удалить старый массив, добавить новый массив, сделать текущей первую запись. (Не "отлавливать блох", проверяя, осталось ли в новом массиве значение PARAM, бывшее текущим. Тогда и оператор сразу увидит, что массив изменился, а не будет пребывать в неведении.) Что-то я не очень понял, если для Т2 используется та же структура, то почему не использовать ID для позиционирования. - Когда я раньше, при поступлении очередного массива проверяла, какая запись была до этого текущей, я не могла проверять ID, так как я удаляю старый массив вместе со всеми этими ID и добавляю новый. Ведь ID - автоинкрементное поле. - Теперь, в варианте А, в соотв. с новым пониманием постановки задачи, можно будет для позиционирования использовать ID вместо PARAM. ID - автоинкрементное поле. - В Т1 можно позиционироваться по ID, так как там записи не удаляются. Б) Вариант для случая, когда массив будет поступать ко мне каждый цикл, даже если массив не изменился. Этот вариант для моей программы, получается, не нужен, но остается интерен мне теоретически, на будущее. При поступлении очередного массива - отсортировать новый массив по возрастанию PARAM (?), - сравнить новый массив со старым (?), - если они абсолютно совпадают, то оставить все как было, - если массивы хоть немного отличаются, то удалить старый массив, добавить новый массив, сделать текущей первую запись. Здесь тоже можно будет для позиционирования использовать ID вместо PARAM. ID - автоинкрементное поле. Сообщение отредактировал Steklova Olga - 10.2.2012, 10:15 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 17.4.2025, 21:34 |