Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как автоматически освежать запрос? [D5, IB5.x]


Страницы:   1 2 3

YuraKiller ©   (2003-05-27 01:27:00) 

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


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

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

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

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;


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


YuraKiller   (2003-06-06 22:27:00) [2]

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


YuraKiller   (2003-06-06 22:11:00) [3]

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 записей всем клиентам, а они (клиенты) просто будут узнавать не пошол ли кто вибивать бутылку водки на ЗП, что-бы это зафиксировать (клиенту новую запись) на голубом екране.


Sandman25   (2003-06-06 16:06:00) [4]

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


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

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



bushmen   (2003-06-06 15:31:00) [6]

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


Sandman25   (2003-06-06 15:22:00) [7]

bushmen © (06.06.03 12:36)

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

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

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


Oleg_E   (2003-06-06 14:16:00) [8]

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


bushmen   (2003-06-06 12:36:00) [9]

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


Sandman25   (2003-06-06 12:24:00) [10]

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

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


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

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


Sergey13   (2003-06-06 11:50:00) [12]

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


Sandman25   (2003-06-06 11:02:00) [13]

YuraKiller © (06.06.03 02:19)

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


elected   (2003-06-06 02:26:00) [14]

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


YuraKiller   (2003-06-06 02:19:00) [15]

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 мин.


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

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

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




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

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

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

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

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

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

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


С Ув. Юра Г.


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

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

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


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

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


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

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо