|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Карабас Барабасда, еще, он не расчитан на квотированные идентификаторы, все имена полей приводит к одному регистру это фигня все - некритично Карабас Барабас короче, ограничений куча, единственный плюс - возможность обновления больших наборов данных на клиенте так это и есть главная фишка Карабас Барабас мне не жалко, могу и выложить исходники, только ведь сам потом ко мне придешь, мол то не так, да это не эдак давай файл с основной логикой идеи, я использовать твой компонент, как таковой, не сбираюсь, мне идея понравилась - хочу подробно разобраться. Ну, возможно, задам еще пару вопросов что там для чего. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2005, 11:07 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
тут основные методы: LoadFromDB и UpdateFromDB ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2005, 11:27 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Вот, понадобилось тоже заняться этой ерундой интересной темой. Собственно, вполне подойдет, думаю, способ с пометкой записей timestamp или счетчиком обновления таблицы и последующей выборкой на клиента записей, измененных с момента последней выборки. А что касается опасности пропуска записей, между получением метки и завершением транзакции которых клиент успеет произвести выборку - то не так это и страшно. Назад в будущееВремя... У меня сколько угодно времени! У меня машина времени! Можно брать записи не с момента последней выборки, а чуть раньше. Ну да, записи будут рефрешиться повторно, но ведь это Amris MirddinФигня по сравнению с мировой революцией. Конечно, если сидят сотни машинисток, то это уже будет серьезной проблемой, но ведь в реальности это редкость. А если теоретически. Неужели нельзя отследить момент пропуска записей? Теоретически количество событий (а ведь мы его знаем, не так ли?) должно быть не больше, чем количество обновленных записей при очередной выборке (на каждое закомиченное обновление получаем одно событие). Если вести лог изменений в отдельной таблице, то достаточно подсчитывать количество событий и количество выбранных из лога записей. А если не вести лог, а ограничиться метками в основной таблице? Тогда можно завести поле "версия" и в after update делать NEW.Версия = OLD.Версия + 1 . Тогда при выборке where Update_ID > :LastUpdateID суммировать разницы версий (между полученной из базы и локальной - полученной ранее) для всех обновленных записей и сравнивать с количеством полученных событий. Ну а если обнаружили "недосдачу", то откатываться назад до тех пор, пока количество событий и количество обновленных записей как минимум не сравняются. Трава хороша, но одному курить скучно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 07:18 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Sextonспособ с пометкой записей timestamp или счетчиком обновления таблицыесли ты используешь счетчик обновлений, то пропуска быть не должно, если я все правильно понимаю ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 07:26 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Под окатом назад можно теоретически понимать, например, повтор выборки с постепенным уменьшением LastUpdateID (если установить сразу в 0, то будет FullRefresh, так?). Да, речь идет о случае отсутствия удалений (или предположении, что отслеживание удалений нас не интересует). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 07:35 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Карабас Барабас Sextonспособ с пометкой записей timestamp или счетчиком обновления таблицыесли ты используешь счетчик обновлений, то пропуска быть не должно, если я все правильно понимаю Неправильно, ибо тынц. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 07:40 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
SextonНеправильно, ибо тынц.дак ты храни на клиенте последнее значение счетчика, зачем из генератора брать ? или я чего-то не догоняю ? Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 07:51 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Sextonв after update делать NEW.Версия = OLD.Версия + 1 Ой, after update, конечно, заменить на before update, а в before insert делать NEW.Версия = 1 Карабас Барабасдак ты храни на клиенте последнее значение счетчика, зачем из генератора брать ? или я чего-то не догоняю ? Еще раз тынц внимательнее. Зачем там сравнене с генератором (то есть, хуже то не будет, но зачем?), я и сам не понял. Там суть не в этом. Ну и Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 08:07 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
А, дак ты совсем про другое PS: А ты зачем полугодовалый топик поднял ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 13:20 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Карабас БарабасА ты зачем полугодовалый топик поднял ? Возникла необходимость сделать автообновление данных при многопользовательской работе. Столкнулся с проблемами реализации. Стал искать топики на эту тему, чтобы найти ответы, а нашел описание тех же самых проблем. Так как тема далеко не новая, то поднял старый топик, чтобы новый не плодить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 13:35 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
SextonТеоретически количество событий (а ведь мы его знаем, не так ли?) должно быть не больше, чем количество обновленных записей при очередной выборке (на каждое закомиченное обновление получаем одно событие). Уточнение. Общее количество полученных событий должно быть не больше, чем общее количество обновленных записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 13:39 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
SextonВозникла необходимость сделать автообновление данных при многопользовательской работеКак один из вариантов - способ, описанный мною же, тут же, там и удаленные записи отслеживаются /topic/187250&pg=-1#1586487 Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 13:40 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
SextonУточнение. Общее количество полученных событий должно быть не больше, чем общее количество обновленных записей.Да нафига вобще обновление делать по событию ? Чтобы все моргало непрерывно ? Даже если ты ограничишь обновления по минимальному промежутку между ними, все равно это неудобно. Мое ИМХО состоит в том, что только пользователь должен решать, когда ему надо увидеть обновленные данные. Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 13:44 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Карабас Барабас SextonВозникла необходимость сделать автообновление данных при многопользовательской работеКак один из вариантов - способ, описанный мною же, тут же, там и удаленные записи отслеживаются /topic/187250&pg=-1#1586487 Так и я пришел к такому же способу в конце концов (только мне больше понравился вариант с timestamp, так как timestamp у меня все равно используется). И в реализации прост, учитывая, что формы у меня генерятся автоматом. Гонял возможные варианты работы этого метода и понял, что теоретически может быть пропуск данных. Думал, умные люди знают, как сделать правильно. А умные люди пишут о той же самой проблеме. Стал думать дальше и пришел в голову способ, который сюда и запостил: может кто подскажет, где в нем ошибка. Карабас БарабасДа нафига вобще обновление делать по событию ? Чтобы все моргало непрерывно ? Даже если ты ограничишь обновления по минимальному промежутку между ними, все равно это неудобно. Мое ИМХО состоит в том, что только пользователь должен решать, когда ему надо увидеть обновленные данные. А с чего будет моргать? Как правило, в событии обновляется всего несколько записей (а в большинстве случаев одна). Разумеется, запоминаю состояние курсора и отключаю обновление Data-Aware компонентов, а потом все это восстанавливаю. Разумеется, если DataSet не в dsBrowse, данные кладутся в буфер и выбираются из него, как только DataSet переходит в этот режим. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 14:01 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
SextonА с чего будет моргать? Как правило, в событии обновляется всего несколько записей (а в большинстве случаев одна). Разумеется, запоминаю состояние курсора и отключаю обновление Data-Aware компонентов, а потом все это восстанавливаю. Разумеется, если DataSet не в dsBrowse, данные кладутся в буфер и выбираются из него, как только DataSet переходит в этот режим.может быть, я не прав, может быть ты права ... (С) Бутусов Posted via ActualForum NNTP Server 1.3 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 14:35 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Карабас Барабасможет быть, я не прав, может быть ты права ... (С) Бутусов Да не так это и важно. Идеальных решений все равно нет. Я просто выложил способ, так как не могу обнаружить в нем проколов. Вдруг кто-то другой сможет. Может, предположние, что всегда известно количество посланных из базы событий не верно, может еще чего... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 14:43 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Никогда не возникало необходимости динамически обновлять наборы данных на клиенте. Обычно вешаю на форму кнопочку "Обновить" и пользователю этого достаточно. Ну и сам при необходимости refresh выполняю. Перед редактированием к примеру. Ну да ладно... Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать? Считать эту запись с сервера, потом на клиенте разбираться попадает ли она под условие в selectsql? А там черте-что может быть. Это-ж на клиенте еще один мини-сервер под эту фигню реализовать надо. Ну и с сортировкой не проще... Или просто переоткрыть Query? Тогда нафига пляски с event-ами? Да и может переоткрытие операция серьезная (висим n минут пока сервер запрос выполнит, и соседи тоже не в восторге). А в результате ползателю эта запись нафик не нужна была... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 15:39 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Лентяй Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать? TpFIBDataSet.CacheAppend(id, true) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 16:36 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Sexton Лентяй Вот интересно, как народ поступает с добавленными записями. На клиенте висит набор данных уфильтрованный и засортированный ползателем насмерть. И тут приходит event, по поводу того, что запись с id таким-то добавили. И чего делать? TpFIBDataSet.CacheAppend(id, true) И чего, FibDataSet при этом распарсит Sql-оператор в SelectSql проверит, попадает ли добавляемая запись под where кляузу и решит, нано ли вставлять этот id в локальные буфера DataSet? Если да, снимаю шляпу. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 16:57 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Лентяй И чего, FibDataSet при этом распарсит Sql-оператор в SelectSql проверит, попадает ли добавляемая запись под where кляузу и решит, нано ли вставлять этот id в локальные буфера DataSet? Если да, снимаю шляпу. Fib просто вставит запись в локальный буфер, а потом сделает для нее Refresh. А по теме вопроса, есть ли просчеты в предложенном способе так никто ничего... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 18:58 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Да нет проблем. Но платно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 19:09 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Amris MirddinДа нет проблем. Но платно Да меня бы устроила даже инфракрасная коагуляция анальной трещины: да, нет. Ну а потом можно и комментарии добавить. Вопрос ведь не практический, а так - спортивный. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 19:13 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
Amris Mirddin Но платно Я плакаль! Сцылку в мемориз! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 19:31 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
А вот еще интересная ситуация (вариаций много придумать можно). Имеем SelectSQL такого скажем вида: Код: plaintext 1. 2. 3.
Ладно, это цветочки. А что вот с этим делать? Код: plaintext 1. 2.
Удаляем запись из Tbl2 и, о чудо, - у соседа добавляется тысченка-другая записей в гриде. Класс, теперь вставляем другую запись в Tbl2 - у соседа пропадет сколько-там записей из грида. Или вааще все. А теперь корректируем значение какой нибудь записи - у соседа какая-то часть записей пропадает, и еще сколько-то добавляется... Вообщем на select-ах чуть сложнее палки и веревки проктология становиться все очевиднее... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2006, 22:11 |
|
Вопрос по POST_EVENT
|
|||
---|---|---|---|
#18+
ЛентяйА вот еще интересная ситуация (вариаций много придумать можно). Имеем SelectSQL такого скажем вида: Код: plaintext 1. 2. 3.
Один обработчик вешается сразу на события от всех таблиц, входящих в запрос (на Фибах получить список таблиц элементарно). В обновляющем запросе используется тот же select, что и в основном, с наложением дополнительного условия Datastamp >= :LastDataStamp (ну или кому что нравится). Дата (или счетчик - опять же, кому что нравится) обновления записи берется максимальная между t.Дата и s.Дата. Версия записи определяется суммированием t.Версия+s.Версия. Далее все сводится к случаю с одной таблицей. Но с одним условием: в составном select'е должны учавствовать только таблицы, связанные 1:1, причем выбираться должны все записи. Иначе, нарушится связь между количеством событий и количеством выбранных версий. То есть, в общем случае метод с версиями не подходит и отследить пропуск записей при обновлении невозможно, что и требовалось доказать. Доказано Лентяем Получается, что обновление действительно проще делать по таймеру с выборкой записей, измененных с момента последней выборки минус какое-то "буферное время", а события использовать лишь для того, чтобы не делать "холостые" обновления: если между тиками не произошло событий, то и обновлять нечего. Лентяй Ладно, это цветочки. А что вот с этим делать? Код: plaintext 1. 2.
Удаляем запись из Tbl2 и, о чудо, - у соседа добавляется тысченка-другая записей в гриде. Класс, теперь вставляем другую запись в Tbl2 - у соседа пропадет сколько-там записей из грида. Или вааще все. А теперь корректируем значение какой нибудь записи - у соседа какая-то часть записей пропадает, и еще сколько-то добавляется... Реальный пример этого случая мне в голову не пришел, но не важно - мы же рассуждаем теоретически. Такой запрос не сделает то же самое, но без подзапроса: Код: plaintext 1. 2. 3.
Как я написал выше, удаление я не рассматриваю: в моем случае удаление отсутствует по причине необходимости репликации, а лог вести не хочется. К тому же, желательна необходимость восстановления недавно удаленных записей. Так что удаление делается пометкой записи на удаление. Время от времени записи, помеченные на удаление "давно" удаляются физически. Вообщем, типичный проктологический способ. Невозможность вставки записи с такими же значениями уникальных полей, что и у помеченных на удаление записей не считается проблемой. А что мешает помечать записи в запросе? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Далее все сводится к предыдущему случаю, который сводится к случаю с одной таблицей (но в общем случае уже без отслеживания соответствия версий событиям). А вот проблема с тем, что одновременно может измениться большое количество записей - это реальная проблема, согласен. В этом случае можно делать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Лентяй Вообщем на select-ах чуть сложнее палки и веревки проктология становиться все очевиднее... Покупал я сканер сестре недавно. Выбрал по инету подходящую модель со слайд-модулем. В одной комп. фирме ее не оказалось и мне стали впаривать совершенно другую: более старую, более дорогую и без слайд-модуля. Все свелось к попытке убедить меня, что слайд-модуль не так уж и нужен, что сестра вполне может обойтись и без него. Справедливо? Да, наверное. Да, в фотолаборатории сделают все качественнее, чем получится на слайд-модуле бытового сканера. Но в итоге заказ был сделан в другой фирме, где этой модели также не было: ее без лишних вопросов поставили в заказ и через некоторое время привезли. Отсюда вывод: заказчика не должны интересовать технические проблемы исполнителя. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2006, 10:29 |
|
|
start [/forum/topic.php?fid=40&msg=33534644&tid=1562165]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 441ms |
0 / 0 |