Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обновить датасет по получению Alert от СУБД / 8 сообщений из 8, страница 1 из 1
11.03.2021, 23:15
    #40052741
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновить датасет по получению Alert от СУБД
В 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
11.03.2021, 23:30
    #40052743
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновить датасет по получению Alert от СУБД
муторное занятие если честно
надо отслеживать все датасеты, при обновлениях надо смотреть если ли записи с id которые нужно обновлять, проверить а не будет ли рефреш нужного массива строк по времени дольше чем просто рефреш всего датасета, ну и так далее.
...
Рейтинг: 0 / 0
11.03.2021, 23:51
    #40052749
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновить датасет по получению Alert от СУБД
энди
муторное занятие если честно
надо отслеживать все датасеты, при обновлениях надо смотреть если ли записи с id которые нужно обновлять, проверить а не будет ли рефреш нужного массива строк по времени дольше чем просто рефреш всего датасета, ну и так далее.

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

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


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

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

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

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

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

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

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

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


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