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

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

Ресурсоемкая задача. [D6, IB6.x]


Misha Uskov ©   (2004-08-26 13:16:00) 

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


Sergey13   (2004-08-27 09:02:00) [1]

2[12] Misha Uskov ©   (26.08.04 18:48)
> А если у меня товара 10 000 на остатке, а пришел покупатель, который хочет 40 000 купить.
А если у тебя какого-то товара вообще нет и не было никогда, а пришел покупатель и хочет купить 100 тонн. Ты что - заведешь строчку и продашь?


Misha Uskov   (2004-08-27 07:46:00) [2]

Я, вобщем-то, совершенно не против кнопки "обновить", против заказчик. В результате всех извращений (+ запросы к MSSQL через ODBC) на открытие формы затрачивается 0,35 с. К сожалению, совет s999 не помог, теперь курсор "прилипает" к нижней стороне грида.


Deniz   (2004-08-27 06:40:00) [3]

> Zacho ©   (26.08.04 20:00) [13]
> но почему бы просто не сделать кнопку "Обновить" ?

И еще повесить таймер, и если нет действий более чем 10 сек, то в "локальный" остаток записать ??? , а юзер когда глянет, сам нажмет кнопку "Обновить". Время таймера можно сократить и до 1 сек ;-)


Zacho   (2004-08-26 20:00:00) [4]

Не знаю, как оно там в фармацевтических фирмах, но могу сказать как обстоят дела в крупных оптово/розничных магазинах, с которыми я имел дело. А делается там так:
Сначалона складе набирается, упаковывается и т.д. товар для клиента, а потомуже оформляются документы, в т.ч. забиваются накладные в программе. И никакого запрета на отрицательные остатки нет. (Предупреждения - конечно есть, и далеко не у всех есть права приходовать документы, создающие отрицательные остатки) Почему ? Да потому что в реальности бывают такие вещи как висячие партии, пересортица, излишки/недостачи, а клиент не будет ждать пока кто-то разберется почему программа не дает продать 10000 товара если эти 10000 он видит своими глазами.
Видеть остатки конечно нужно, но почему бы просто не сделать кнопку "Обновить" ? А обновлять данные при пркретке грида - имхо, излишество. И огромадные тормоза :)


Misha Uskov   (2004-08-26 18:48:00) [5]

(11) А если у меня товара 10 000 на остатке, а пришел покупатель, который хочет 40 000 купить. Какое ограничение нужно вводить? Видеть остатки при выписке накладной все равно нужно


Sergey13   (2004-08-26 15:51:00) [6]

2[10] Misha Uskov ©   (26.08.04 15:43)
>Даже если закупают вагонами, остаток товара все равно иногда становится нулевым и это нужно контролировать.
Для этого нужно ограничение в БД kol>=0 и чуть-чуть кода в делфи (try...except). Все.


Misha Uskov   (2004-08-26 15:43:00) [7]

(9) выбранные ранее товары резервируются, т.е. затребованное количество уже не спишут.
Я думал, что вопрос риторический... С таким подходом можно показать оператору в колонке остатки просто надпись "Расслабься, дофига еще таблеточек", не проверяя фактический остаток. Даже если закупают вагонами, остаток товара все равно иногда становится нулевым и это нужно контролировать.


Sergey13   (2004-08-26 15:24:00) [8]

2[8] Misha Uskov ©   (26.08.04 13:41)
Критерии "Самой свежести" спроси у заказчика. Допустим та запись которая щас видна, видна уже 3 часа - оператор ушел на "5 минут". Пришел и прочитал глазами то что видит. Сделал заказ. И что? "Вторая свежесть" получилась? Пока ты выбираешь все позиции, что становится с актуальностью уже выбранных ранее?

Глупости это, а не требование заказчика. И глупость вдвойне (уж извини) воплощать это в жизнь. Тем более если это " большаяфармацевтическая фирма". Я представляю во что это выльется с их объемами и номенклатурой.
Повторю вопрос:
Что изменится если по какой то позиции остаток будет не 100000 а 99000, а для заказа надо 500 штук?


Misha Uskov   (2004-08-26 13:41:00) [9]

(6) Это непременное условие моего заказчика. В момент выбора позиции ТМЦ остаток должен быть "самым свежим", даже если юзер открыл подбор, а клиент забыл, что ему нужно и пять минут уточняет выбор ТМЦ по телефону. Заказчик - большая фармацевтическая фирма, возможно, что им это на самом деле необходимо.


Sergey13   (2004-08-26 13:36:00) [10]

2[5] Misha Uskov ©   (26.08.04 13:33)
> спасибо огромное, попробую. А ларчик просто открывался :-)
А из ларца два молодца
И ланца-дрица-оп-ца-ца
8-)


Sergey13   (2004-08-26 13:34:00) [11]

2 [4] Misha Uskov ©   (26.08.04 13:30)
И что? За время прокрутки в гриде остатки успевают измениться? И какова длина списка? И что изменится если по какой то позиции остаток будет не 100000 а 99000?


Misha Uskov   (2004-08-26 13:33:00) [12]

(3) спасибо огромное, попробую. А ларчик просто открывался :-)


Misha Uskov   (2004-08-26 13:30:00) [13]

(2) За справочником ТМЦ 1С :-)


s999   (2004-08-26 13:28:00) [14]


> Главная проблема, вызванная использованием закладок, текущая
> запись получается всегда в центре грида.


Простенький потомок ДатаСета, у которого есть метод:

procedure TMyDataSet.MyGotoBookmark(Bookmark: TBookmark);
begin
 if Bookmark <> nil then
 begin
   CheckBrowseMode;
   DoBeforeScroll;
   InternalGotoBookmark(Bookmark);
   Resync([rmExact]); //!!! в оригинале-([rmExact, rmCenter]);
   DoAfterScroll;
 end;
end;


Sergey13   (2004-08-26 13:22:00) [15]

Господи, да за чем же таким ты следишь то в реале?


Misha Uskov   (2004-08-26 13:19:00) [16]

Сейчас сделано так: набор данных довольно статичен, поэтому созданы триггера на таблицу справочника, которые пишут в дополнительную таблицу ID измененных записей + время изменения (i,u,d). На клиенте используется таблица в памяти, содержимое к-й синхронизируется при открытии по алгоритму - если форма открыта впервые, то выполняется запрос целиком, в противном случае выполняется запрос только по измененым с момента последнего открытия записям. В событии OnDataChange datasource-а определяется кол-во видимых записей, выбираются их ID и делается запрос по остаткам. Главная проблема, вызванная использованием закладок, текущая запись получается всегда в центре грида. Можно ли обойти это затруднение или вообще решить поставленную задачу другим способом?


Наверх

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