Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Вниз

Как автоматически освежать запрос?   Найти похожие ветки 

 
YuraKiller   (2003-05-27 01:27) [0]

На главной форме программы находится таблица проводок. Туда записываются действия операторов.
Для отображения таблицы использовал TQuery.
Если работать локально, то рефреш вешается на процедуру, т. е. проблемы нет, но если на одном клиенте кипит работа, то на втором пока вручную не запустиш апдейт запроса новых действий не видно.
Можно решить вопрос через таймер, но может есть способ поумнее?


 
Alexandr   (2003-05-27 06:03) [1]

кнопка f4.
Когда надо увидень новые данные - пусть конопку лупит.
Все остальные способы в 99% случаев не нужны и извратны при реализации.


 
passm   (2003-05-27 10:38) [2]

Alexandr © (27.05.03 06:03)> Обычно используется F5 :)
Не мучайте юзера.


 
xmrz   (2003-05-27 10:42) [3]

> YuraKiller © (27.05.03 01:27)

F5 + Таймер с возможностью настройки пользователем времени рефреша


 
Alexandr   (2003-05-27 12:22) [4]

F5...
надо запомнить. Переделаю...
Вообще у меня юзеры уже к F4 привыкли...


 
Polevi   (2003-05-27 12:35) [5]

у меня по F4 запись удалаяется Ж))


 
Alexandr   (2003-05-27 12:41) [6]

значит наше ПО несовместимо :)


 
YuraKiller   (2003-05-28 00:52) [7]

Ок, спасибо!


 
Nikolay M.   (2003-05-28 10:04) [8]

В Д4 для этого есть IBEventAlerter. В 5 его убрали?


 
Alexandr   (2003-05-28 10:56) [9]

он не для этого.


 
Мое имя   (2003-05-28 10:59) [10]

Mentos - The Freshmaker


 
Карелин Артем   (2003-05-28 11:32) [11]

Делай в триггере на изменении/вставке Event и лови на клиенте. Что делать дальше наверно не надо обьяснять.


 
Sergey13   (2003-05-28 11:51) [12]

2YuraKiller © (27.05.03 01:27)
Ты бы задумался сначала над вопросом - как ты отнесешся к душу (ну или к одеколону) который будет тебя "автоматически освежать"? 8-)


 
Nikolay M.   (2003-05-28 15:48) [13]


> Alexandr © (28.05.03 10:56)
> он не для этого.

А для чего же еще? Как сказал Карелин Артем © (28.05.03 11:32), в триггере или в процедуре, которая отвечает за вставку записи, генерится Event, который потом ловится клиентом. Сам так делал, как сейчас помню.


 
Alexandr   (2003-05-28 15:54) [14]

делай делай...
я что, не даю?
Я ж просто тут советы умные даю...
Посмотрю я потом когда подключений будет много, в сети будет Firewall или на сервере 2 сетевых карты... когда записей в таблицах будет не по десятку, а на порядки больше...
Прибежишь ты опять сюда, будешь говорит, чего тормозит... чего не работает...


 
Zacho   (2003-05-28 16:16) [15]

Кстати, вот в тему кусок письма Дмитрия Еманова в конференции epsylon.public.interbase :

Насчет придумает - это вопрос второй, но ивенты нормально работают в
полуторке. И с двумя сетевыми картами, и через файрвол, и как угодно еще.
Тот, кто их боится - он просто не имеет их готовить ;-)

--
Дмитрий Еманов


 
Nikolay M.   (2003-05-28 16:55) [16]


> Посмотрю я потом когда подключений будет много


А вот про это темы не было! :)
С таймером - явно изврат, тут нельзя было EventAlerter не посоветовать. А уж какие там объемы гоняются - это личное дело каждого. Будут тормоза - тогда можно думать об ограничении количества рефрешей (5 обновлений в секунду тоже никому не нужно). А насчет сетевых карт и файерволов уже было сказано
Zacho © (28.05.03 16:16)
:) У меня проблем с файерволом не было.


 
Zacho   (2003-05-28 17:03) [17]


> Nikolay M. © (28.05.03 16:55)

Только прошу обратить внимание, что приведенное мной высказывание Димы Еманова касается FB 1.5, а YuraKiller © (27.05.03 01:27) спрашивал про IB 5.x


 
YuraKiller   (2003-05-28 21:47) [18]

2Sergey13 ©
Ха. Какой ты смешной и оригинальный..


 
Sergey13   (2003-05-29 09:02) [19]

2YuraKiller © (28.05.03 21:47)
Когда наступит то о чем писал Alexandr © (28.05.03 15:54), когда юзеры не смогут нормально работать из-за постоянно дергающихся формочек, пропадающих почти готовых готовых документов и неоправдано большим временем отклика БД, ты, слегка (а может и не слегка 8-) побитый этими юзерами, скажешь - да!!! Какой Sergey13 умный и дальновидный!!!
8-)))))))))))))))))))))


 
Danilka   (2003-05-29 09:10) [20]

Sergey13 © (29.05.03 09:02)
Спорим, что не скажет, а побежит к начальству требуя закупить сеть побыстрее, компы помощьнее и т.д.? :))


 
Alexandr   (2003-05-29 09:28) [21]

и программиста поменять ... :)


 
prihod   (2003-05-29 11:18) [22]

Чем-то похоже на мою проблемку. Как тут все весело обсуждають...


 
YuraKiller   (2003-05-29 22:33) [23]

Э! Хлопцы, Вас куда понесло?!?

2Sergey13 © и Alexandr © (28.05.03 15:54) - для моей базы нужно "ОСВЕЖАТЬ" только данные за текущий день. В базе будут работать до 10 оперов, права на операции, которые записываются в таблицю проводок имеют максимум 4 человека (штат работников, который увеличивать не имеет смысла).

Короче, как не крути, даже без индексов и хранимой процедуры отбора записей работать будет очень шустро.

При любом расскладе Sergey13 останется балаболом.

Если, не прав пиши ответ..




 
Sergey13   (2003-05-30 10:48) [24]

2YuraKiller © (29.05.03 22:33)
> При любом расскладе Sergey13 останется балаболом.
Ты пока не знаешь даже как это сделать, а уже говоришь, что "работать будет очень шустро". Так что балаболом пока остаешься ты.
>Если, не прав пиши ответ..
Вот и написал. 8-)


 
Sandman25   (2003-05-30 12:18) [25]

"работать будет очень шустро" только некоторое время.
Когда через пару лет объемы данных вырастут, начнутся проблемы. Так что если в планах нет уволиться к тому времени, рекомендуется продумать все заранее :)


 
Sergey13   (2003-05-30 13:32) [26]

2Sandman25 © (30.05.03 12:18)
>Когда через пару лет
Не, ИМХО, гораздо быстрее. 8-)


 
YuraKiller   (2003-06-03 21:43) [27]

2Sergey13
>Ты пока не знаешь даже как это сделать
Ничего нового я тут не услышал, ... остался только твой умный совет.
>Когда через пару лет объемы данных вырастут
Данные для работы нужны только за текущий год. За прошедшие нужны только для архива. Даже в такой ситуации: "данных вырастут, начнутся проблемы" - забекапив старую (архивную) базу с рабочей можно убить всё барахло. И опять остался только твой сверхмудрый совет (которого не будет).
>Так что балаболом пока остаешься ты.
Нет, ты. Кроме пустых слов не по теме и без реальных советов на тебя по другому не скажеш %-(




 
kaif   (2003-06-04 00:34) [28]

Предлагаю компромисс.
Делаешь три радиокнопки:
1. Освежать при изменении данных другим оператором
2. Освежать каждые N секунд
3. Освежать вручную.

Кнопки "добавить проводку", "удалить проводку" и т.п. делаются выбираемы только, когда включен режим 3.

Режим 1 организовать по post event-ам IB сервера.

P.S. Я лично никогда так не делаю.
Так как у меня никогда при введении проводок в журнал смотреть не нужно. Журнал это вообще отстой. Толку от него, как от козла молока. Лучше сразу видеть изменения в балансе.


 
Danilka   (2003-06-04 07:41) [29]

YuraKiller © (03.06.03 21:43)
>забекапив старую (архивную) базу с рабочей можно убить всё
>барахло.
Угу, только это барахло, в любом случае, никогда бы не передавалось по сети, а именно из-за объемов передаваемой по сети информации по каждому событию, по каждой новой проводке юзеры заимеют геморой и нехилый. Причем безполезный, см про журнал: kaif © (04.06.03 00:34)
:))
Тебе об этом говорят люди, которые через это уже прошли, а ты ничего не хочешь слушать, только ругаешся.

kaif © (04.06.03 00:34)
Что-то мне подсказывает, какой пункт выберут юзеры.


 
Alexandr   (2003-06-04 07:52) [30]

2Danilka ©
и какой-же?


 
Danilka   (2003-06-04 08:08) [31]

Alexandr © (04.06.03 07:52)
Все зависит от того, сколько секунд во втором пункте и сколько опыта у юзера. :))
Скорее всего, по умолчанию будет выбран 1 пункт, через некоторое время юзеры начнут жаловатся на тормоза и непонятные глюки, и им поступит разьяснение от разработчиков, залезть в настройки, в такой-то пункт и переключить этот радиобуттон во второй или третий пункт. С учетом того, что когда кол-во проводок перевалит за какое-то количество (например, за сотню или тысячу) никакие юзеры не смогут в уме проанализировать все эти проводки, им любое автоматическое обновление станет просто ненужно - необходимую информацию они получат из отчетов формируемых на основе этих проводок. Может быть, тогда они догадаются совсем его вырубить. Или разработчик им сам посоветует.


 
Alexandr   (2003-06-04 08:14) [32]

:) писатель прямо...


 
Danilka   (2003-06-04 08:19) [33]

Alexandr © (04.06.03 08:14)
угу, работы куча великая, делать ее не хочется, отпуск всего через месяц, в отпуске небыл 3 года, вот меня и прорвало :))


 
Sergey13   (2003-06-04 09:35) [34]

Сколько болтунов собралось. 8-)
И всего один деловой - YuraKiller ©. 8-)))))
Совпало так - у меня есть программист Юра, так вот он сделал тоже самое (правда на Оракле - но это не суть). Кстати сделал все достаточно корректно. Так вот, когда сетевой трафик его программы на каждой машине стал много больше 10М в час, а машин с его программой около 10, и сервер стал работать практически только на них, и юзера стали жаловаться на медленную работу, я его (Юру) практически убил, но потом пожалел (2 детей у него) и заставил убрать всю эту хрень. Так это Оракл на серваке с DualP3+все дела+100Мбс сетка!!!

Так что я тоже в каком то смысле YuraKiller. 8-)


 
YuraKiller   (2003-06-05 00:33) [35]

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

Вид приличный, сортировка в обратном порядке. Новая проводка появляется сверху. Выводятся проводки только за текущий день. Индексация по полю date1. В день от 100 до 500 (ну аж 1000)проводок.

Выкинуть журнал плохой вариант.

Узерам нужно видеть только последние проводки. Может сперва посылать "select count(*) from main where date1=""+DateToStr(date)+""". Ну.. и если больше 20 то добавить к дате ограничение по времени, .. за последние 2 часа (память у всех плохая).

А освежитель весить на действия оператора, которые приводят к проводке и на таймер (каждые 5 мин.). Причём после проводки вызывать событие OnTimer что-бы таймер считал следующие 5 мин.

Или ещё что-то посоветуйте. Трафик превышать стыдно. Ну нету как журнал отключать..


С Ув. Юра Г.


 
интересующийся   (2003-06-05 07:59) [36]

очень интересно тема развивалась, но ...

в итоге YuraKiller © остался у разбитого корыта
со своим журналом
2YuraKiller ©
вот вы сами и ищете ответ на свой вопрос
а существует пакетная обработка данных
или оперы все проводки ручками по одной заносят?





 
YuraKiller   (2003-06-06 02:19) [37]

2интересующийся
>оперы все проводки ручками по одной заносят?
ДА

Вот что я сегодня сделал:

procedure TfMain.bFreshClick(Sender: TObject);
Var mx: LongWord; ss: String;
begin
If (DateToStr(Date)=DateToStr(dp.Date)) and (cbAll.Checked) Then Begin
With qw do Begin
SQL.Clear;
SQL.Add("select max(number) from main");
Active:=True;
mx:=qw["max"];
End;
If mx>20 Then mx:=mx-20 Else mx:=0;
ss:=" and number>="+IntToStr(mx);
End Else ss:="";
With qMain do Begin
SQL.Clear;
SQL.Add("select * from main where date1=""+DateToStr(dp.Date)+"""+ss+" order by number descending");
Active:=True;
End;
With Timer1 do Begin
Enabled:=False;
Enabled:=True;
End;
end;


Вроде всё круто.. И журнал есть, и трафик не гружоный.
Таймер обновляется каждые 5 мин.


 
elected   (2003-06-06 02:26) [38]

Таймер это немного неправильно в плане того что он будер рефрешить и без надобности
я решил проблему у себя так
когда юзер чтото вносит я полылаю сообщение в сеть о том что нужно
другие клиенты его ловят и рефреш ...
кстати сообщение может иметь формат для того чтобы рефрешить то или иное =-)))
удачи
могу дать исходникик посыла приема
а в оракле даже есть alert =-)


 
Sandman25   (2003-06-06 11:02) [39]

YuraKiller © (06.06.03 02:19)

Мне понравилось :)
Можно еще позволять пользователю настраивать количество последних проводок для просмотра (сейчас оно жестко задано как 20).


 
Sergey13   (2003-06-06 11:50) [40]

2YuraKiller © (06.06.03 02:19)
Ты будешь смеяться, но это опять я. 8-)
>Вроде всё круто.. И журнал есть, и трафик не гружоный.
Ну это пока... Но я не об этом.
Ты пока не ответил мне на один вопрос - ЗАЧЕМ ЭТО ВСЕ?
ИМХО, ты решаешь проблему которую сам себе придумал. Так ли интересно операторам видеть эти новые записи?
Предлагаю такое решение.
Оставь свои запросы на количество новых строк по таймеру, но не обновляй рабочий запрос а выводи результат первого в лейблу на форме (типа "Со времени последнего обновления было вставлено ...") и рядом кнопочку - "освежить?". И потом проанализируй количество нажатий на эту кнопку (какой нито лог организуй). Но не сразу, а через месяц, когда юзеры привыкнут к программе. Вот если количество нажатий будет сопоставимо с автоматическим тогда да включай автомат, а так...
Иначе представь - тетя Маша отпросилась на полдня, но прогу погасить забыла - а сервак добросовестно ей данные обновляет 12 раз в час.


 
bushmen   (2003-06-06 12:00) [41]

To elected ©:
Если можно, мне тоже вышли исходник, пожалуйста, передачи-приёма.


 
Sandman25   (2003-06-06 12:24) [42]

>Иначе представь - тетя Маша отпросилась на полдня, но прогу погасить забыла - а сервак добросовестно ей данные обновляет 12 раз в час.

Можно поставить таймер с Interval = 1000*60*60 и в OnKeyPress (и OnMouseDown) сбрасывать его и включать заново. Если за час не будет нажата ни одна кнопка, то вызывать Application.Terminate.


 
bushmen   (2003-06-06 12:36) [43]

To Sandman25 ©:
Получается, что, когда тетя Маша придёт, то ей одним заходом сразу все 500 записей добавятся, да еще с задержкой на время интервала таймера. Я не вижу ничего криминального в том, чтобы в отсутствии тети Маши шло обновление


 
Oleg_E   (2003-06-06 14:16) [44]

Делали описаный [Sergey13 © (06.06.03 11:50)] метод, и действительно увидели что пользователям (основной массе) "чужие" записи до лампочки, оставили вариант обновления набора по запросу, т.е. пользователь САМ жмет "Обновить" когда считает "нужным", а требование в начале было такое же: "Хотим чтобы ОНО САМО АВТОМАТИЧЕСКИ..."
Прислушайся к совету [Sergey13 © (06.06.03 11:50)]


 
Sandman25   (2003-06-06 15:22) [45]

bushmen © (06.06.03 12:36)

Мне кажется, Вы не поняли моей идеи.

>Я не вижу ничего криминального в том, чтобы в отсутствии тети Маши шло обновление

А я вижу. У нас, например, 50 юзеров сидят. Если каждый из них будет "забывать" выходить из программы, серверу это скорости не прибавит. Зачем обновлять данные, когда их никто не смотрит?


 
bushmen   (2003-06-06 15:31) [46]

> Sandman25 ©:
Если пользователь не работает с мышью или клавиатурой, это еще не означает, что он не смотрит на монитор.


 
интересующийся   (2003-06-06 15:32) [47]

elected ©
используешь sockets или MailSlots?




 
Sandman25   (2003-06-06 16:06) [48]

Если пользователь ЧАС смотрит на монитор, то я сомневаюсь, что он смотрит на обновленные данные :)


 
YuraKiller   (2003-06-06 22:11) [49]

2 elected © (06.06.03 02:26)
>Таймер это немного неправильно в плане того что он будер рефрешить и без надобности
.. ну и ..
>другие клиенты его ловят и рефреш

Ты прав. Но с идеей опаздал на советов 20.
Спасибо большое Sergey13 (история YuraKiller) после которой я прозрел, понял суть.

Прикиним: недельки через две база будет готова, и.. полным ходом посадят оперов набивать её (база товара и клиентов). Их будет НЕ МЕНЬШЕ 10. 1 юзер за 5 мин. может создать (добавить) ну 5 записей, а таких юзеров минимум 10, и.. в минуту мы имеем: (5/5)*10=10 решрешей в минуту (на каждую машину).

2 Sandman25 ©
Спасибо, мне очень приятно!

2 bushmen ©
Прочитай всё внимательно!!

2 Sergey13 ©
>ЗАЧЕМ ЭТО ВСЕ?
>проблему которую сам себе придумал
Всё это для "тугих юзеров" (см. выще прим. авт.)
Да, проблему я придумал может быть сам, но не зря: я думаю, что визуальный контроль над проделаной работой нужен.

Но .. протупил я. Поспешиш людей н...
Как Вы поняли эта процедура вешается на:
1. Кнопку Refresh (типа "Обновить")
2. На Таймер
3. На процедуры добавления, изменения и т. д. записей (если клиент что-то добавил - ему решреш)

Но.. даже при нажатии на кнопку Refresh (когда надо явно обновить) нету необходимости освежать запрос, если нету ничего нового: вот где ошибка.


mx:=qw["max"]; надо сохранить. И начинать процедуру с того, что надо узнать максимальный (последний) номер.. и сравнить его с прошлым. Если mx1=mx2 то хвост процедуры опускается, т. к. новых записей нет.

Вот общими усилиями приближаемся к истине.

2 YuraKiller
>Вроде всё круто.. И журнал есть, и трафик не гружоный.
Может уже да. И вообще: "Не говори ГОП, пока не перескочил"

P. S.
Теперь если тёта Маша будет выставлятся за День Рождения, то небудет обновления 20 записей всем клиентам, а они (клиенты) просто будут узнавать не пошол ли кто вибивать бутылку водки на ЗП, что-бы это зафиксировать (клиенту новую запись) на голубом екране.



 
YuraKiller   (2003-06-06 22:27) [50]

Поле number Primary Key, а поле
date1 индексируемое (полезно, если использовать оператор where для поля).


 
YuraKiller   (2003-06-07 22:23) [51]

Да, ответов много :-))

Короче, переработка:

procedure TfMain.cbAllClick(Sender: TObject);
begin
With cbAll do If Checked Then Tag:=0 Else Begin
Tag:=1;
If (DateToStr(Date)=DateToStr(dp.Date)) Then bFresh.Click;
End;
end;

procedure TfMain.dpChange(Sender: TObject); //dp - это TDateTimePicker
begin
dp.Tag:=1;
bFresh.Click;
end;

procedure TfMain.bFreshClick(Sender: TObject);
Var mx: LongInt; ss: String;
begin
mx:=0;
If (DateToStr(Date)=DateToStr(dp.Date)) and (cbAll.Checked) Then Begin
With qw do Begin
SQL.Clear;
SQL.Add("select max(number) from main");
Active:=True;
If qw["max"]<>null Then mx:=qw["max"];
End;
If mx>bFresh.Tag Then Begin
bFresh.Tag:=mx;
mx:=mx-20;
ss:=" and number>="+IntToStr(mx);
End Else ss:="";
End Else ss:="";

If (dp.Tag=1) or (ss<>"") or (cbAll.Tag=1) Then Begin
dp.Tag:=0;
cbAll.Tag:=0;
With qMain do Begin
SQL.Clear;
SQL.Add("select * from main where date1=""+DateToStr(dp.Date)+"""+ss+" order by number descending");
Active:=True;
End;
With Timer1 do Begin
Enabled:=False;
Enabled:=True;
End;
End;
end;


Подскажите, посоветуйте если кому интересно..



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.009 c
6-7578
Aleks
2003-04-28 13:02
2003.07.03
Как узнать запущена ли программа и имя компьютера на котором...


14-7688
RDA
2003-06-14 18:49
2003.07.03
Идентичность отпечатков пальцев


8-7554
Nesh Briges
2003-03-21 00:54
2003.07.03
Проблема с PlayList!


1-7458
ASt
2003-06-23 15:01
2003.07.03
Процедура BlockWrite


14-7598
Домарощинер
2003-06-17 14:02
2003.07.03
HASPVVD Error





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский