Обновление данных в формах при изменении записи.
Модератор: Модераторы
Обновление данных в формах при изменении записи.
Здравствуйте.
При изменении данных в базе набор данных в уже загруженных формах не обновляется,
подскажите, что сделать, чтобы все зависимости автоматически обновлялись. А то данные
изменил, а в списке они старые, форма то уже загружена.
Спасибо.
При изменении данных в базе набор данных в уже загруженных формах не обновляется,
подскажите, что сделать, чтобы все зависимости автоматически обновлялись. А то данные
изменил, а в списке они старые, форма то уже загружена.
Спасибо.
Slava1970 писал(а):При изменении данных в базе...
Какой именно базе?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Например, вызывать по таймеру refresh у dataset.
Vadim
Изменение записи в таблице в базе.
Добавлено спустя 4 минуты 59 секунд:
Спасибо, Снег Север.
Тут просто я неправильно, выбрал объект для редактирования записи DBComboBox и итем добавлял вручную, естественно он
не обновлялся при обновлении датасет, потому почитав решил использовать DBLookupComboBox и список привязать к датасет
выбора, тогда он будет автоматически обновляться. Тогда не пойму почему используют в самплах ComboBox и заполняют
вручную или каждый пишет свой объект под свои нужды?
Изменение записи в таблице в базе.
Добавлено спустя 4 минуты 59 секунд:
Спасибо, Снег Север.
Тут просто я неправильно, выбрал объект для редактирования записи DBComboBox и итем добавлял вручную, естественно он
не обновлялся при обновлении датасет, потому почитав решил использовать DBLookupComboBox и список привязать к датасет
выбора, тогда он будет автоматически обновляться. Тогда не пойму почему используют в самплах ComboBox и заполняют
вручную или каждый пишет свой объект под свои нужды?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Конечно, каждый пишет под свои нужды. Если у меня DBComboBox связан со справочником, который меняется раз году, то чего ради мне заботится о его обновлении в аппликации? А если это таблица, в которую все время вносят изменения операторы, то ее надо обновлять очень часто. И т.п.
Пока принимаю RxDBLookupCombo, в нем можно выводить на экран одно, а запись вести по другому полю (смотреть имя, а записывать id),
а главное обновляется, то есть при обновлении датасет, результат тутже, а от DBLookupComboBox, такого получить не смог.
Скорее всего не понял функционала.
а главное обновляется, то есть при обновлении датасет, результат тутже, а от DBLookupComboBox, такого получить не смог.
Скорее всего не понял функционала.
Снег Север писал(а):Например, вызывать по таймеру refresh у dataset.
Если данные очень большие, связь тяжелая и дорогая - не самый лучший вариант.. Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Slava19\70 писал(а):
Добавлено спустя 4 минуты 59 секунд:
Спасибо, Снег Север.
Тут просто я неправильно, выбрал объект для редактирования записи DBComboBox и итем добавлял вручную, естественно он
не обновлялся при обновлении датасет, потому почитав решил использовать DBLookupComboBox и список привязать к датасет
выбора, тогда он будет автоматически обновляться. Тогда не пойму почему используют в самплах ComboBox и заполняют
вручную или каждый пишет свой объект под свои нужды?
DBLookupComboBox тянется с тех махровых времен когда DBF считалось очень хорошей БД для хранения, а сетевые многопользовские базы данных были очень сложными и дорогими.. Тогда и нормы записи были были попроще: открыл форму с таблицей, кликнул по записи вышла фома с контролерами БД, где человек выбрал нужный в списках позицию.. сохранил - и таблица рефрешнулась...
Но сейчас нормы другие: таблицы могут содержать миллионы позиций, с картинками, с динамическими параметрами которые изменяются мгновенно...вставка записи в edit может быть интерактивна(подбором вариантов из уже вставленых) быть составной(Город,улица, дом..)..
Тогда вот нужны не классические подходы: подгрузка данных(зачем тянуть миллионы строк?) по мере движения, свой edit( вплоть до картинок и т.п.)...
У меня был проект: юзер мог открыть много одних и тех же таблиц, но при редактировании позиции в таблицах происходил рефрешь - при изменении форма отправляла оконное событие(PostMessage) с командой об обновлении с информацией об таблице - те формы которые открыты были заданные таблицы - обязаны были обновится..
Кладр, связанные таблицы я вообще подгружал отдельным трейдом..
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123, а кто мешает сделать так же?
Снег Север писал(а):Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Произошло событие - широковещательный Postmessage.. Формы которые "подписаны" получат извещение.. далее уже полет фантазии как поступить дальше - обновить, выделить как новое и т.п...
данные можно менять даже в котролах с Combobox.
Некоторые БД позволяют отправлять сообщения - тогда вообще можно унифицировать механизм и сделать его общим для всех пользователей.. в разных концах мира.
И не надо рефрешить секунды.. все произойдет моментально.
Спасибо. Просто всем спасибо.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Извините, я не понимаю, как можно обновить данные на форме без отсылки запроса серверу базы данных. Телепатически, что ли?olegy123 писал(а):Снег Север писал(а):Зависит исключительно от ваших задач. У меня в одной программе было с десяток таймеров - с временем от 10 с до получаса.olegy123 писал(а):Да и рефрешить сколько надо? раз в минуту достаточно? или 30fps уже мало?
Произошло событие - широковещательный Postmessage.. Формы которые "подписаны" получат извещение.. далее уже полет фантазии как поступить дальше - обновить, выделить как новое и т.п...
данные можно менять даже в котролах с Combobox.
Некоторые БД позволяют отправлять сообщения - тогда вообще можно унифицировать механизм и сделать его общим для всех пользователей.. в разных концах мира.
И не надо рефрешить секунды.. все произойдет моментально.
А как выполняется запрос - явно, или неявно, по таймеру или по месаджу - дело вкуса.
ExecSql - это выполнение sql команды. Commit - это та же sql команда которая завершает транзакцию, и измененные данные фиксируются и становятся актуальными для всей бд, но старые транзакции могут не видеть их - все это зависит от реализации их в самом движке БД(Mysql,FB,Oracle,MSSQL)..
Поэтому важно сделать обновления транзакций у других активных запросов.. чтобы обновленные данные там тоже появились.
ApplyUpdates - это кэш данных на уровне компонента TDataSet.. до ApplyUpdates - данные в БД не отправляются, позволяет сэмулировать транзакцию для движков БД которые их не имеют.
Если работаете с FirebirdSQL - то там есть уровни транзакции, некоторые режимы могут запрещать что то менять на уровне записи или всей таблицы. Т.е. пока не закроете активную транзакцию - FirebirdSQL вам не даст другой что то сделать, даже прочитать данные.
Добавлено спустя 12 минут 27 секунд:
Когда вам нужно увидеть сразу обновленные данные - таймер не самый лучший вариант(хотя лучший вариант при использование удаленной многопользовательской БД без сигнализации клиентов об изменения данных) .
А вот использовать оконные сообщения - которые вам дадут гибкость и свободу действий.. более правильное решение. Особенно необходимо если вы хотите сделать свои навороченные чуткие контролы.
Как пример: Combobox в котором в выдающем списке данные меняются по мере заполнения..
Поэтому важно сделать обновления транзакций у других активных запросов.. чтобы обновленные данные там тоже появились.
ApplyUpdates - это кэш данных на уровне компонента TDataSet.. до ApplyUpdates - данные в БД не отправляются, позволяет сэмулировать транзакцию для движков БД которые их не имеют.
Slava1970 писал(а):Спасибо. Просто всем спасибо.
У меня наверное больше проблема в датасет, делаю сначала ExecSql, потом Commit транзакции,
может поэтому сразу отражения нет, датасет не обновился, а ApplyUpdates() виснет,
запись заношу одним датасетом, а обновить другой на нем и виснет.
Если работаете с FirebirdSQL - то там есть уровни транзакции, некоторые режимы могут запрещать что то менять на уровне записи или всей таблицы. Т.е. пока не закроете активную транзакцию - FirebirdSQL вам не даст другой что то сделать, даже прочитать данные.
Добавлено спустя 12 минут 27 секунд:
Снег Север писал(а): Извините, я не понимаю, как можно обновить данные на форме без отсылки запроса серверу базы данных. Телепатически, что ли?
А как выполняется запрос - явно, или неявно, по таймеру или по месаджу - дело вкуса.
Когда вам нужно увидеть сразу обновленные данные - таймер не самый лучший вариант(хотя лучший вариант при использование удаленной многопользовательской БД без сигнализации клиентов об изменения данных) .
А вот использовать оконные сообщения - которые вам дадут гибкость и свободу действий.. более правильное решение. Особенно необходимо если вы хотите сделать свои навороченные чуткие контролы.
Как пример: Combobox в котором в выдающем списке данные меняются по мере заполнения..
