Организация работы Firebird на розничной точке. Проблема.

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Организация работы Firebird на розничной точке. Проблема.

Сообщение Mironico » 18 дек 2007, 12:15

Добрый день.

Занимаюсь программой для учета на розничных точках (аптеках).

1-5 компов на кассовых местах с фиск регистраторами.
1 комп - сервер (работает заведующие аптекой).
Возникла проблема.
Начальство начало усложнять программу для заведующей.

Больше всего это коснулось таблицы заказа товара со склада.
Добавилось много операций именно на "сервере" - звгрузка в таблицу из файла, куча всяких расчетов типа запас, потребность, продажи, отказы и еще всякого добра.
Это все дело загружается пересчитывается от 20 мин до 3 часов
в зависимости от мощности компа, колва строк в каталоге товара, продаж (протокол).

Во время пересчета система сильно нагружается и клиенты неплохо притормаживают что влияет на скорость отпуска товара.
Компы- серверы прибл-но такой конфигурации:
CeleronD 2.6/512/80G

Подскажите плиз варианты решения проблемы.
От пересчета никуда не деться. Нужно менять компы- серверы?
Поможет ли замена на 2 ядерные?

СПС

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 дек 2007, 12:30

Это все дело загружается пересчитывается от 20 мин до 3 часов
плохо. оптимизируй код.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Организация работы Firebird на розничной точке. Проблема

Сообщение WildSery » 18 дек 2007, 12:37

Mironico писал(а):звгрузка в таблицу из файла
А файл откуда берётся?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 18 дек 2007, 12:41

файл каждый день по модему из офиса приходит.


а код уже переделывал много раз разными способами.

Для примера в 1С лопатится такая же таблица 5 часов.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 дек 2007, 12:45

сколько записей в таблице / файле?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 18 дек 2007, 13:01

записей 10-20 тыс

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 18 дек 2007, 13:30

Mironico писал(а):записей 10-20 тыс
Судя по кол-ву записей и мощности компа счёт должет идти на секунды (максимум, минута-две), а не десятки минут и тем более часы. Приводи структуру таблиц и рассказывай чего и как ты делаешь с ними.

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 18 дек 2007, 16:34

ладно по порядку:
1) файл с офиса (текст с разделителями) считывается в массив строк.
2) массив разбивается, идет проверка наличия кода товара в таблице. если код есть - обновляются некоторые поля, если нет добавляется новая строка.
3) идет перебор каталога товаров и если в нем есть код товара которго нет таб заказа создается в в последней новая строка.
4) перечитывается колонка остатков.
структура стандартная - таблица "товары" и подчиненная "партии"
из них двоих делается выборка с Sum().
выборка перебирается построчно, локейтом ищу по коду в таб заказа товар и переписываю туда колво.
5) заполняем колонку "последняя цена.
опять же делаю выборку из товары/партии по дате партии
опять перебираю выборку, локейтом в таб заказа ищу код и ставлю цену
6) продажи за 30 последних дней (из протокола продаж)
делаю выборку по коду товара из пр. продаж с sum() по колву.
перебираю выборку, локейтом ищу товар, ставлю кво продаж
7) перечитываем колонку "отказы покупателям"
делаю выборку за 14 дней из таблицы "отказы" с sum() по кву
перебираю, выставляю результат в таб заказа
8) перечитываю ожидаемый товар (файлы накладных пришли из офиса, они загружены но не проведены т.к. товар не привезли пока).
тут выборка из 2 таблиц накладные/строковая часть
снова выборка из них с sum() по кву, перебор, и обновление
таб заказа.
9) запас товара.
перебор таб заказа и расчет по формуле остаток товара /(кво продаж за мес/30)
10) потребность. похоже на предыдущий пункт
11) пересчет колонки заказанного уже товара но не полученного еще
тут делается выборка из 2 таблиц заказы и строковая часть заказов тоже с sum() по кву, и опять же локейтом ищем по коду и обновляем таб заказа.

вроде все.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 18 дек 2007, 16:49

Локейтом - это сильно.
Вот первый попавшийся - 3й пункт. "идёт перебор каталога...". Как именно "перебор"? Ищешь каждую запись что ли?

Мне почему-то кажется, что эти жалкие 20 тыс. строк можно было залить тупо во временную таблицу, а затем несколькими запросами/процедурами за пару минут (или даже секунд) пересчитать нужные агрегаты/значения.

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 18 дек 2007, 17:26

пробовал я так 4 пункт летом гдето.
получилось на 10 сек меньше но индикатора я
при этом на экран вывести не мог.
Тети в аптеках в компах не оч.
Если не выволить индикатора то подумаю что
зависло и комп перегрузят что уже не раз было.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 18 дек 2007, 18:45

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

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 19 дек 2007, 11:46

Подскажите как запрос сделать не хватает знаний.

если есть 3 таблицы:

Tovars
id_tovar
Tovar_kod

и подчиненная Partions
id_tovar
kolvo

zakaz
tova_kod
kolvo


Не соображаю как сделать запрос с обновлением.
в таблицу zakaz должно попасть суммированное
количество из partions по коду товара tovar_kod.

Такой запрос бы многое решил но за неимением
нужных знаний и не пониманием как это реализовать
вынужден был делать перебор с локейтом.

Подскажите варианты пожалуйста.
Заранее благодарен.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 19 дек 2007, 12:11

Mironico писал(а): Подскажите как запрос сделать не хватает знаний.
А ХП не устраивает?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 19 дек 2007, 12:28

ЧТо за "ХП"?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 19 дек 2007, 12:43

Mironico писал(а):ЧТо за "ХП"?
Хранимая процедура

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 19 дек 2007, 12:46

а, пробовал, долго получается.


select into
потом
в цикле update

долго

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 19 дек 2007, 12:56

Подскажите еще пожалуйста аналог
Round в скуле ФБ

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 19 дек 2007, 12:57

Mironico писал(а):а, пробовал, долго получается.


select into
потом
в цикле update

долго
на 20000 записей?
долго это сколько?
а если у тебя раньше этого товара не было? что апдейтить будешь?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 19 дек 2007, 13:01

Mironico писал(а):Подскажите еще пожалуйста аналог
Round в скуле ФБ
см. UDF
или CAST на худой конец :)

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 19 дек 2007, 13:05

На тот момент в таблице есть абсолютно все товары
причем есть же проверка where tovar_kod=такойто

Ответить