powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обновить датасет по получению Alert от СУБД
8 сообщений из 8, страница 1 из 1
Обновить датасет по получению Alert от СУБД
    #40052741
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В FireDAC есть на мой взгляд механизм по обновлению датасета при получении алерта от СУБД. Так, в проге на дельфи при добавление/модификацию/удаление записи вызываю
Код: pascal
1.
	dpdm.conCF.ExecSQL('EXECUTE BLOCK AS BEGIN POST_EVENT ''EVENTS_CHANGED''; END; ');


в модуле есть EventAlerter, который ловит 3 типа нотификаций - EVENTS_CHANGED, CLIENTS_CHANGED, EVITEMS_CHANGED
Так вот - как правильно настроить FDQuery, чтоб при получении нотификации от СУБД автоматом обновлялся датасет? При этом я так понимаю основная фишка - это если датасет в режиме редактирования - он должен обновиться прозрачно, не меняя логики работы программы. Пока удалось обрабатывать нотификацию в обработчике EventAlerter
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
	if SameText('EVENTS_CHANGED', AEventName) then for I := 0 to screen.FormCount-1 do screen.forms[i].Perform(WM_EVENTS_CHANGED,0,0);
	if SameText('CLIENTS_CHANGED',AEventName) then
  begin
    qCLs.Active:=false;
    qCLs.Active:=true;
		for I := 0 to screen.FormCount-1 do if assigned(screen.forms[i]) then  screen.forms[i].Perform(WM_CLIENTS_CHANGED,0,0);
  end;
	if SameText('EVITEMS_CHANGED',AEventName) then for I := 0 to screen.FormCount-1 do screen.forms[i].Perform(WM_EVITEMS_CHANGED,0,0);


посылаю окнам соответствующее событие. Но ведь можно прописать в FDQuery нужный алертер, но почему-то оно не срабатывает. Мож у кого-то рабочий код есть.
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052743
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
муторное занятие если честно
надо отслеживать все датасеты, при обновлениях надо смотреть если ли записи с id которые нужно обновлять, проверить а не будет ли рефреш нужного массива строк по времени дольше чем просто рефреш всего датасета, ну и так далее.
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052749
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
энди
муторное занятие если честно
надо отслеживать все датасеты, при обновлениях надо смотреть если ли записи с id которые нужно обновлять, проверить а не будет ли рефреш нужного массива строк по времени дольше чем просто рефреш всего датасета, ну и так далее.

так я что кумекаю - механизм FireDAC ДОЛЖЕН это делать автоматически, прозрачно и без проблем основной логике программы (типа ошибок - датасет не в режиме вставки/редактирования или еще каких сюрпризов), иначе зачем эти возможности предусмотрены? Вручную я и сам могу все контролировать, просто подозреваю, что FIREDAC это умеен из коробки и красиво
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052753
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFomin,

если "на той стороне" действительно СУБД, то "обновлять" FDQuery можно только одним способом - это его закрыть и открыть, т.е. выполнить запрос заново. Никакого "прозрачного" обновления тут не будет. Что, собственно, у вас и написано
Код: pascal
1.
2.
    qCLs.Active:=false;
    qCLs.Active:=true;


хотя этот код хреновый, лучше явно писать
qCLs.Close; qCLs.Open;

При этом отсылать событие форме - зачем? Непонятно. Если там ДБГрид - он сам обновится после переоткрытия запроса.
А вот если датасет в режиме редактирования, то вы переоткрытием запроса режим редактирования поломаете. Старые данные пропали, новые появились, старую запись уже редактировать невозможно.
И т.д.
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052754
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GrigoriyFomin> я что кумекаю - механизм FireDAC ДОЛЖЕН это делать автоматически, прозрачно и без проблем основной логике программы

Бедный Арефьев...
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052760
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GrigoriyFominя что кумекаю - механизм FireDAC ДОЛЖЕН это делать автоматически, прозрачно и без проблем
основной логике программы

Делать автоматически то, за что живому программисту оторвали бы руки, реально плохая идея.

Этот механизм существует исключительно чтобы информировать этого живого программиста о
событии. И всё. А дальше тот уже действует на собственный страх и риск.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052762
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Серьёзно?
А вот это свойство тогда зачем?

Правда с FireBird мне его заставить работать так и не удалось.
...
Рейтинг: 0 / 0
Обновить датасет по получению Alert от СУБД
    #40052764
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpА вот это свойство тогда зачем?

Видимо, чтобы укрепить широко распространённое мнение, что на Дельфи невозможно писать
вменяемо работающие приложения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обновить датасет по получению Alert от СУБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]