powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по POST_EVENT
25 сообщений из 147, страница 5 из 6
Вопрос по POST_EVENT
    #33094228
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабасда, еще, он не расчитан на квотированные идентификаторы, все имена полей приводит к одному регистру

это фигня все - некритично

Карабас Барабас
короче, ограничений куча, единственный плюс - возможность обновления больших наборов данных на клиенте
так это и есть главная фишка

Карабас Барабас
мне не жалко, могу и выложить исходники, только ведь сам потом ко мне придешь, мол то не так, да это не эдак
давай файл с основной логикой идеи, я использовать твой компонент, как таковой, не сбираюсь, мне идея понравилась - хочу подробно разобраться.
Ну, возможно, задам еще пару вопросов что там для чего.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33094301
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут основные методы: LoadFromDB и UpdateFromDB
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532892
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, понадобилось тоже заняться этой ерундой интересной темой. Собственно, вполне подойдет, думаю, способ с пометкой записей timestamp или счетчиком обновления таблицы и последующей выборкой на клиента записей, измененных с момента последней выборки. А что касается опасности пропуска записей, между получением метки и завершением транзакции которых клиент успеет произвести выборку - то не так это и страшно.
Назад в будущееВремя... У меня сколько угодно времени! У меня машина времени!
Можно брать записи не с момента последней выборки, а чуть раньше. Ну да, записи будут рефрешиться повторно, но ведь это
Amris MirddinФигня по сравнению с мировой революцией.
Конечно, если сидят сотни машинисток, то это уже будет серьезной проблемой, но ведь в реальности это редкость.
А если теоретически. Неужели нельзя отследить момент пропуска записей? Теоретически количество событий (а ведь мы его знаем, не так ли?) должно быть не больше, чем количество обновленных записей при очередной выборке (на каждое закомиченное обновление получаем одно событие). Если вести лог изменений в отдельной таблице, то достаточно подсчитывать количество событий и количество выбранных из лога записей. А если не вести лог, а ограничиться метками в основной таблице? Тогда можно завести поле "версия" и в after update делать NEW.Версия = OLD.Версия + 1 . Тогда при выборке where Update_ID > :LastUpdateID суммировать разницы версий (между полученной из базы и локальной - полученной ранее) для всех обновленных записей и сравнивать с количеством полученных событий.
Ну а если обнаружили "недосдачу", то откатываться назад до тех пор, пока количество событий и количество обновленных записей как минимум не сравняются.

Трава хороша, но одному курить скучно.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532900
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sextonспособ с пометкой записей timestamp или счетчиком обновления таблицыесли ты используешь счетчик обновлений, то пропуска быть не должно, если я все правильно понимаю
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532906
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под окатом назад можно теоретически понимать, например, повтор выборки с постепенным уменьшением LastUpdateID (если установить сразу в 0, то будет FullRefresh, так?).
Да, речь идет о случае отсутствия удалений (или предположении, что отслеживание удалений нас не интересует).
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532910
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас Sextonспособ с пометкой записей timestamp или счетчиком обновления таблицыесли ты используешь счетчик обновлений, то пропуска быть не должно, если я все правильно понимаю
Неправильно, ибо тынц.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532917
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonНеправильно, ибо тынц.дак ты храни на клиенте последнее значение счетчика, зачем из генератора брать ? или я чего-то не догоняю ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33532931
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sextonв after update делать NEW.Версия = OLD.Версия + 1
Ой, after update, конечно, заменить на before update, а в before insert делать NEW.Версия = 1
Карабас Барабасдак ты храни на клиенте последнее значение счетчика, зачем из генератора брать ? или я чего-то не догоняю ?

Еще раз тынц внимательнее. Зачем там сравнене с генератором (то есть, хуже то не будет, но зачем?), я и сам не понял. Там суть не в этом. Ну и
Код: plaintext
1.
2.
3.
4.
1) Транзакция1. В триггере обновления получили текущее время (или счетчик обновления из генератора).
2) Транзакция2. Получили и установили текущее время (счетчик обновления). Завершили транзакцию с генерацией события.
3) Клиент. Прочитал все изменения с момента последней выборки. Запомнил время (счетчик) последнего изменения.
4) Транзакция1. Установли текущее время (счетчик), прочитанное ранее. Завершили транзакцию с генерацией события.
5) Клиент. Читает изменения с момента последней выборки, но не видит запись Транзакции1!
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534019
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, дак ты совсем про другое

PS: А ты зачем полугодовалый топик поднял ?
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534099
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас БарабасА ты зачем полугодовалый топик поднял ?
Возникла необходимость сделать автообновление данных при многопользовательской работе. Столкнулся с проблемами реализации. Стал искать топики на эту тему, чтобы найти ответы, а нашел описание тех же самых проблем.
Так как тема далеко не новая, то поднял старый топик, чтобы новый не плодить.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534120
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonТеоретически количество событий (а ведь мы его знаем, не так ли?) должно быть не больше, чем количество обновленных записей при очередной выборке (на каждое закомиченное обновление получаем одно событие).
Уточнение. Общее количество полученных событий должно быть не больше, чем общее количество обновленных записей.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534122
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonВозникла необходимость сделать автообновление данных при многопользовательской работеКак один из вариантов - способ, описанный мною же, тут же, там и удаленные записи отслеживаются

/topic/187250&pg=-1#1586487
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534142
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonУточнение. Общее количество полученных событий должно быть не больше, чем общее количество обновленных записей.Да нафига вобще обновление делать по событию ? Чтобы все моргало непрерывно ? Даже если ты ограничишь обновления по минимальному промежутку между ними, все равно это неудобно. Мое ИМХО состоит в том, что только пользователь должен решать, когда ему надо увидеть обновленные данные.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534215
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас SextonВозникла необходимость сделать автообновление данных при многопользовательской работеКак один из вариантов - способ, описанный мною же, тут же, там и удаленные записи отслеживаются

/topic/187250&pg=-1#1586487

Так и я пришел к такому же способу в конце концов (только мне больше понравился вариант с timestamp, так как timestamp у меня все равно используется). И в реализации прост, учитывая, что формы у меня генерятся автоматом. Гонял возможные варианты работы этого метода и понял, что теоретически может быть пропуск данных. Думал, умные люди знают, как сделать правильно. А умные люди пишут о той же самой проблеме.
Стал думать дальше и пришел в голову способ, который сюда и запостил: может кто подскажет, где в нем ошибка.
Карабас БарабасДа нафига вобще обновление делать по событию ? Чтобы все моргало непрерывно ? Даже если ты ограничишь обновления по минимальному промежутку между ними, все равно это неудобно. Мое ИМХО состоит в том, что только пользователь должен решать, когда ему надо увидеть обновленные данные.

А с чего будет моргать? Как правило, в событии обновляется всего несколько записей (а в большинстве случаев одна). Разумеется, запоминаю состояние курсора и отключаю обновление Data-Aware компонентов, а потом все это восстанавливаю. Разумеется, если DataSet не в dsBrowse, данные кладутся в буфер и выбираются из него, как только DataSet переходит в этот режим.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534380
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SextonА с чего будет моргать? Как правило, в событии обновляется всего несколько записей (а в большинстве случаев одна). Разумеется, запоминаю состояние курсора и отключаю обновление Data-Aware компонентов, а потом все это восстанавливаю. Разумеется, если DataSet не в dsBrowse, данные кладутся в буфер и выбираются из него, как только DataSet переходит в этот режим.может быть, я не прав, может быть ты права ... (С) Бутусов
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534413
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабасможет быть, я не прав, может быть ты права ... (С) Бутусов

Да не так это и важно. Идеальных решений все равно нет.
Я просто выложил способ, так как не могу обнаружить в нем проколов. Вдруг кто-то другой сможет. Может, предположние, что всегда известно количество посланных из базы событий не верно, может еще чего...
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534644
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда не возникало необходимости динамически обновлять наборы данных на клиенте. Обычно вешаю на форму кнопочку "Обновить" и пользователю этого достаточно. Ну и сам при необходимости refresh выполняю. Перед редактированием к примеру. Ну да ладно...
Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать? Считать эту запись с сервера, потом на клиенте разбираться попадает ли она под условие в selectsql? А там черте-что может быть. Это-ж на клиенте еще один мини-сервер под эту фигню реализовать надо. Ну и с сортировкой не проще...
Или просто переоткрыть Query? Тогда нафига пляски с event-ами? Да и может переоткрытие операция серьезная (висим n минут пока сервер запрос выполнит, и соседи тоже не в восторге). А в результате ползателю эта запись нафик не нужна была...
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534889
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лентяй
Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать?
TpFIBDataSet.CacheAppend(id, true)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33534974
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sexton Лентяй
Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать?
TpFIBDataSet.CacheAppend(id, true)
И чего, FibDataSet при этом распарсит Sql-оператор в SelectSql проверит, попадает ли добавляемая запись под where кляузу и решит, нано ли вставлять этот id в локальные буфера DataSet? Если да, снимаю шляпу.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33535347
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лентяй
И чего, FibDataSet при этом распарсит Sql-оператор в SelectSql проверит, попадает ли добавляемая запись под where кляузу и решит, нано ли вставлять этот id в локальные буфера DataSet? Если да, снимаю шляпу.
Fib просто вставит запись в локальный буфер, а потом сделает для нее Refresh.
А по теме вопроса, есть ли просчеты в предложенном способе так никто ничего...
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33535363
Amris Mirddin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет проблем.
Но платно
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33535373
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amris MirddinДа нет проблем.
Но платно

Да меня бы устроила даже инфракрасная коагуляция анальной трещины: да, нет. Ну а потом можно и комментарии добавить.
Вопрос ведь не практический, а так - спортивный.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33535403
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amris Mirddin Но платно Я плакаль! Сцылку в мемориз!
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33535575
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще интересная ситуация (вариаций много придумать можно). Имеем SelectSQL такого скажем вида:
Код: plaintext
1.
2.
3.
Select тыры-пыры , S.Name
From Tbl t
Left join Spr s on S.Id = T.Id
Сосед добавляет/изменяет/удаляет записи в Spr - чего делать? Писать на каждый Select свой обработчик прихоящих Event?
Ладно, это цветочки. А что вот с этим делать?
Код: plaintext
1.
2.
Select тыры-пыры from Tbl1
where not exists (select  1  from Tbl2 Where Tbl2.Fld_m = Tbl1.Fld_n)
Предположим мы исхитрились и написали обработчик Event-ов для такого select-а (для конкретного select-а проблема решаемая, а вот универсальное решение, как я говорил - мини-сервер на клиенте . Дальше начинаем издеваться над пользователем:
Удаляем запись из Tbl2 и, о чудо, - у соседа добавляется тысченка-другая записей в гриде. Класс, теперь вставляем другую запись в Tbl2 - у соседа пропадет сколько-там записей из грида. Или вааще все. А теперь корректируем значение какой нибудь записи - у соседа какая-то часть записей пропадает, и еще сколько-то добавляется...

Вообщем на select-ах чуть сложнее палки и веревки проктология становиться все очевиднее...
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33536245
Sexton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛентяйА вот еще интересная ситуация (вариаций много придумать можно). Имеем SelectSQL такого скажем вида:
Код: plaintext
1.
2.
3.
Select тыры-пыры , S.Name
From Tbl t
Left join Spr s on S.Id = T.Id
Сосед добавляет/изменяет/удаляет записи в Spr - чего делать? Писать на каждый Select свой обработчик прихоящих Event?

Один обработчик вешается сразу на события от всех таблиц, входящих в запрос (на Фибах получить список таблиц элементарно). В обновляющем запросе используется тот же select, что и в основном, с наложением дополнительного условия Datastamp >= :LastDataStamp (ну или кому что нравится). Дата (или счетчик - опять же, кому что нравится) обновления записи берется максимальная между t.Дата и s.Дата. Версия записи определяется суммированием t.Версия+s.Версия. Далее все сводится к случаю с одной таблицей.
Но с одним условием: в составном select'е должны учавствовать только таблицы, связанные 1:1, причем выбираться должны все записи. Иначе, нарушится связь между количеством событий и количеством выбранных версий. То есть, в общем случае метод с версиями не подходит и отследить пропуск записей при обновлении невозможно, что и требовалось доказать. Доказано Лентяем

Получается, что обновление действительно проще делать по таймеру с выборкой записей, измененных с момента последней выборки минус какое-то "буферное время", а события использовать лишь для того, чтобы не делать "холостые" обновления: если между тиками не произошло событий, то и обновлять нечего.
Лентяй
Ладно, это цветочки. А что вот с этим делать?
Код: plaintext
1.
2.
Select тыры-пыры from Tbl1
where not exists (select  1  from Tbl2 Where Tbl2.Fld_m = Tbl1.Fld_n)
Предположим мы исхитрились и написали обработчик Event-ов для такого select-а (для конкретного select-а проблема решаемая, а вот универсальное решение, как я говорил - мини-сервер на клиенте . Дальше начинаем издеваться над пользователем:
Удаляем запись из Tbl2 и, о чудо, - у соседа добавляется тысченка-другая записей в гриде. Класс, теперь вставляем другую запись в Tbl2 - у соседа пропадет сколько-там записей из грида. Или вааще все. А теперь корректируем значение какой нибудь записи - у соседа какая-то часть записей пропадает, и еще сколько-то добавляется...

Реальный пример этого случая мне в голову не пришел, но не важно - мы же рассуждаем теоретически.
Такой запрос не сделает то же самое, но без подзапроса:
Код: plaintext
1.
2.
3.
Select тыры-пыры from Tbl1
left join Tbl2 on Tbl2.Fld_m = Tbl1.Fld_n
where Tbl2.Fld_m is NULL
? Это вопрос: проверяю, правильно ли я усвоил тынц .

Как я написал выше, удаление я не рассматриваю: в моем случае удаление отсутствует по причине необходимости репликации, а лог вести не хочется. К тому же, желательна необходимость восстановления недавно удаленных записей. Так что удаление делается пометкой записи на удаление. Время от времени записи, помеченные на удаление "давно" удаляются физически. Вообщем, типичный проктологический способ. Невозможность вставки записи с такими же значениями уникальных полей, что и у помеченных на удаление записей не считается проблемой.
А что мешает помечать записи в запросе?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Select
  тыры-пыры,
  case
  when Tbl2.Fld_m is NULL or Tbl2.IS_DELETED =  1  then  0 
  else  1 
  end IS_DELETED
from Tbl1
left join Tbl2 on Tbl2.Fld_m = Tbl1.Fld_n
Разумеется, обновляющая выборка должна выбирать как помеченные, так и не помеченные на удаление записи.
Далее все сводится к предыдущему случаю, который сводится к случаю с одной таблицей (но в общем случае уже без отслеживания соответствия версий событиям).

А вот проблема с тем, что одновременно может измениться большое количество записей - это реальная проблема, согласен. В этом случае можно делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
КоличествоВыбранныхЗаписей :=  1 ;
while not ОбновляющаяВыборка.Eof do
begin
  if КоличествоВыбранныхЗаписей > Много then
  begin
    Button1.Caption := 'Юзер, тут много инфы пришло, нажми сюда для обновления';
    Break; // Ну его нах, столько обновлять!
  end
  else begin
    ОбновляемТекущуюЗаписьИзОбновляющейВыборки;
    ОбновляющаяВыборка.Next;
    Inc(КоличествоВыбранныхЗаписей);
  end;
end;
Полностью согласен, что каждый запрос должен рассматриваться индивидуально в базе. А вот клиента универсальным вполне можно сделать. ;-)
Лентяй
Вообщем на select-ах чуть сложнее палки и веревки проктология становиться все очевиднее...
Покупал я сканер сестре недавно. Выбрал по инету подходящую модель со слайд-модулем. В одной комп. фирме ее не оказалось и мне стали впаривать совершенно другую: более старую, более дорогую и без слайд-модуля. Все свелось к попытке убедить меня, что слайд-модуль не так уж и нужен, что сестра вполне может обойтись и без него. Справедливо? Да, наверное. Да, в фотолаборатории сделают все качественнее, чем получится на слайд-модуле бытового сканера. Но в итоге заказ был сделан в другой фирме, где этой модели также не было: ее без лишних вопросов поставили в заказ и через некоторое время привезли.
Отсюда вывод: заказчика не должны интересовать технические проблемы исполнителя. :)
...
Рейтинг: 0 / 0
25 сообщений из 147, страница 5 из 6
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по POST_EVENT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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