Обновление данных в формах при изменении записи.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Обновление данных в формах при изменении записи.

Сообщение Slava1970 » 28.11.2016 13:01:07

Здравствуйте.
При изменении данных в базе набор данных в уже загруженных формах не обновляется,
подскажите, что сделать, чтобы все зависимости автоматически обновлялись. А то данные
изменил, а в списке они старые, форма то уже загружена.
Спасибо.
Slava1970
новенький
 
Сообщения: 24
Зарегистрирован: 19.08.2016 12:26:38

Re: Обновление данных в формах при изменении записи.

Сообщение Vadim » 28.11.2016 13:42:49

Slava1970 писал(а):При изменении данных в базе...

Какой именно базе?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Обновление данных в формах при изменении записи.

Сообщение Снег Север » 28.11.2016 13:56:10

Например, вызывать по таймеру refresh у dataset.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Обновление данных в формах при изменении записи.

Сообщение Slava1970 » 28.11.2016 13:57:19

Vadim
Изменение записи в таблице в базе.

Добавлено спустя 4 минуты 59 секунд:
Спасибо, Снег Север.
Тут просто я неправильно, выбрал объект для редактирования записи DBComboBox и итем добавлял вручную, естественно он
не обновлялся при обновлении датасет, потому почитав решил использовать DBLookupComboBox и список привязать к датасет
выбора, тогда он будет автоматически обновляться. Тогда не пойму почему используют в самплах ComboBox и заполняют
вручную или каждый пишет свой объект под свои нужды?
Slava1970
новенький
 
Сообщения: 24
Зарегистрирован: 19.08.2016 12:26:38

Re: Обновление данных в формах при изменении записи.

Сообщение Снег Север » 28.11.2016 14:47:52

Конечно, каждый пишет под свои нужды. Если у меня DBComboBox связан со справочником, который меняется раз году, то чего ради мне заботится о его обновлении в аппликации? А если это таблица, в которую все время вносят изменения операторы, то ее надо обновлять очень часто. И т.п.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Обновление данных в формах при изменении записи.

Сообщение Slava1970 » 28.11.2016 15:50:25

Пока принимаю RxDBLookupCombo, в нем можно выводить на экран одно, а запись вести по другому полю (смотреть имя, а записывать id),
а главное обновляется, то есть при обновлении датасет, результат тутже, а от DBLookupComboBox, такого получить не смог.
Скорее всего не понял функционала.
Slava1970
новенький
 
Сообщения: 24
Зарегистрирован: 19.08.2016 12:26:38

Re: Обновление данных в формах при изменении записи.

Сообщение olegy123 » 28.11.2016 16:43:17

Снег Север писал(а):Например, вызывать по таймеру refresh у dataset.

Если данные очень большие, связь тяжелая и дорогая - не самый лучший вариант.. Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Обновление данных в формах при изменении записи.

Сообщение Снег Север » 28.11.2016 16:52:35

olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Обновление данных в формах при изменении записи.

Сообщение olegy123 » 28.11.2016 17:03:31

Slava19\70 писал(а):
Добавлено спустя 4 минуты 59 секунд:
Спасибо, Снег Север.
Тут просто я неправильно, выбрал объект для редактирования записи DBComboBox и итем добавлял вручную, естественно он
не обновлялся при обновлении датасет, потому почитав решил использовать DBLookupComboBox и список привязать к датасет
выбора, тогда он будет автоматически обновляться. Тогда не пойму почему используют в самплах ComboBox и заполняют
вручную или каждый пишет свой объект под свои нужды?


DBLookupComboBox тянется с тех махровых времен когда DBF считалось очень хорошей БД для хранения, а сетевые многопользовские базы данных были очень сложными и дорогими.. Тогда и нормы записи были были попроще: открыл форму с таблицей, кликнул по записи вышла фома с контролерами БД, где человек выбрал нужный в списках позицию.. сохранил - и таблица рефрешнулась...

Но сейчас нормы другие: таблицы могут содержать миллионы позиций, с картинками, с динамическими параметрами которые изменяются мгновенно...вставка записи в edit может быть интерактивна(подбором вариантов из уже вставленых) быть составной(Город,улица, дом..)..
Тогда вот нужны не классические подходы: подгрузка данных(зачем тянуть миллионы строк?) по мере движения, свой edit( вплоть до картинок и т.п.)...

У меня был проект: юзер мог открыть много одних и тех же таблиц, но при редактировании позиции в таблицах происходил рефрешь - при изменении форма отправляла оконное событие(PostMessage) с командой об обновлении с информацией об таблице - те формы которые открыты были заданные таблицы - обязаны были обновится..

Кладр, связанные таблицы я вообще подгружал отдельным трейдом..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Обновление данных в формах при изменении записи.

Сообщение Лекс Айрин » 28.11.2016 17:08:02

olegy123, а кто мешает сделать так же?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Обновление данных в формах при изменении записи.

Сообщение olegy123 » 28.11.2016 17:14:10

Снег Север писал(а):
olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.

Произошло событие - широковещательный Postmessage.. Формы которые "подписаны" получат извещение.. далее уже полет фантазии как поступить дальше - обновить, выделить как новое и т.п...
данные можно менять даже в котролах с Combobox.

Некоторые БД позволяют отправлять сообщения - тогда вообще можно унифицировать механизм и сделать его общим для всех пользователей.. в разных концах мира.
И не надо рефрешить секунды.. все произойдет моментально.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Обновление данных в формах при изменении записи.

Сообщение Slava1970 » 28.11.2016 21:34:59

Спасибо. Просто всем спасибо.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.
Slava1970
новенький
 
Сообщения: 24
Зарегистрирован: 19.08.2016 12:26:38

Re: Обновление данных в формах при изменении записи.

Сообщение Снег Север » 28.11.2016 22:24:59

olegy123 писал(а):
Снег Север писал(а):
olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.

Произошло событие - широковещательный Postmessage.. Формы которые "подписаны" получат извещение.. далее уже полет фантазии как поступить дальше - обновить, выделить как новое и т.п...
данные можно менять даже в котролах с Combobox.

Некоторые БД позволяют отправлять сообщения - тогда вообще можно унифицировать механизм и сделать его общим для всех пользователей.. в разных концах мира.
И не надо рефрешить секунды.. все произойдет моментально.
Извините, я не понимаю, как можно обновить данные на форме без отсылки запроса серверу базы данных. Телепатически, что ли?
А как выполняется запрос - явно, или неявно, по таймеру или по месаджу - дело вкуса.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Обновление данных в формах при изменении записи.

Сообщение olegy123 » 29.11.2016 08:47:13

ExecSql - это выполнение sql команды. Commit - это та же sql команда которая завершает транзакцию, и измененные данные фиксируются и становятся актуальными для всей бд, но старые транзакции могут не видеть их - все это зависит от реализации их в самом движке БД(Mysql,FB,Oracle,MSSQL)..
Поэтому важно сделать обновления транзакций у других активных запросов.. чтобы обновленные данные там тоже появились.
ApplyUpdates - это кэш данных на уровне компонента TDataSet.. до ApplyUpdates - данные в БД не отправляются, позволяет сэмулировать транзакцию для движков БД которые их не имеют.

Slava1970 писал(а):Спасибо. Просто всем спасибо.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.


Если работаете с FirebirdSQL - то там есть уровни транзакции, некоторые режимы могут запрещать что то менять на уровне записи или всей таблицы. Т.е. пока не закроете активную транзакцию - FirebirdSQL вам не даст другой что то сделать, даже прочитать данные.

Добавлено спустя 12 минут 27 секунд:
Снег Север писал(а): Извините, я не понимаю, как можно обновить данные на форме без отсылки запроса серверу базы данных. Телепатически, что ли?
А как выполняется запрос - явно, или неявно, по таймеру или по месаджу - дело вкуса.


Когда вам нужно увидеть сразу обновленные данные - таймер не самый лучший вариант(хотя лучший вариант при использование удаленной многопользовательской БД без сигнализации клиентов об изменения данных) .
А вот использовать оконные сообщения - которые вам дадут гибкость и свободу действий.. более правильное решение. Особенно необходимо если вы хотите сделать свои навороченные чуткие контролы.
Как пример: Combobox в котором в выдающем списке данные меняются по мере заполнения..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru