Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Сличительные ведомости по разному заполняются остатки : Супермаг Плюс (Супермаг 2000)

16.04.2024 18:56


30.12.2011 15:19
Vlad
 
В одном из магазинов начали долго (мин. 15) вычисляться остатки в сличительной ведомости. Начал разбираться. Так вот в том магазине где заполняются долго отрабатывает такой запрос:
Код:
INSERT /*+  APPEND */ INTO ttremains
    (storeloc, article, quantity)
    (SELECT /*+  ORDERED USE_NL (s) FULL (d) INDEX (s) */ l.id location, 
            s.article, sum(s.quantity * decode(l.id, d.locationto, 1, 
            d.locationfrom, -1, 0)) quantity
         FROM smdocuments d, smstorelocations l, smspec s
         WHERE d.doctype = s.doctype
           AND d.id = s.docid
           AND l.id IN (d.locationto, d.locationfrom)
           AND d.docstate >= 2
           AND d.createdat <= :i_date
           AND l.id = 18
           AND s.article IN (SELECT article
                    FROM smspec
                    WHERE doctype = 'RL'
                      AND docid = 'СВур000069')
         GROUP BY l.id, s.article
         HAVING sum(s.quantity * decode(l.id, d.locationto, 1, d.locationfrom, 
                -1, 0)) <> 0)
В других магазин вычисляются немного другим запросом:
Код:
INSERT /*+  APPEND */ INTO ttremains
    (storeloc, article, quantity)
    (SELECT /*+  ORDERED USE_NL (s) FULL (d) INDEX (s) */ l.id location, 
            s.article, sum(s.quantity * decode(l.id, d.locationto, 1, 
            d.locationfrom, -1, 0)) quantity
         FROM smdocuments d, smstorelocations l, smspec s
         WHERE d.doctype = s.doctype
           AND d.id = s.docid
           AND l.id IN (d.locationto, d.locationfrom)
           AND d.docstate >= 2
           AND d.createdat <= :i_date
           AND l.id = 18
           AND s.article IN (SELECT article
                    FROM smspec
                    WHERE doctype = 'RL'
                      AND docid = 'СВур000069')
         GROUP BY l.id, s.article
         HAVING sum(s.quantity * decode(l.id, d.locationto, 1, d.locationfrom, 
                -1, 0)) <> 0)
Все перепробовал и остатки рассчитать, и статистику, и все параметры сверил с другими базами, так и не понял почему разница пошла. может было у кого?
Версия СМ2000 1.23.5 Oracle 9i

Добавлено через 9 минут 44 секунды
Не тот запрос вставил вместо этого
Цитата:
Vlad
Код:
INSERT /*+  APPEND */ INTO ttremains
    (storeloc, article, quantity)
    (SELECT /*+  ORDERED USE_NL (s) FULL (d) INDEX (s) */ l.id location, 
            s.article, sum(s.quantity * decode(l.id, d.locationto, 1, 
            d.locationfrom, -1, 0)) quantity
         FROM smdocuments d, smstorelocations l, smspec s
         WHERE d.doctype = s.doctype
           AND d.id = s.docid
           AND l.id IN (d.locationto, d.locationfrom)
           AND d.docstate >= 2
           AND d.createdat <= :i_date
           AND l.id = 18
           AND s.article IN (SELECT article
                    FROM smspec
                    WHERE doctype = 'RL'
                      AND docid = 'СВур000069')
         GROUP BY l.id, s.article
         HAVING sum(s.quantity * decode(l.id, d.locationto, 1, d.locationfrom, 
                -1, 0)) <> 0)
Вот этот
Код:
INSERT /*+  APPEND */ INTO ttremains
    (storeloc, article, quantity)
    (SELECT location, article, -sum(quantity) quantity
         FROM (SELECT /*+  ORDERED USE_NL (s) INDEX (d smdocuments_createdat) 
                          INDEX (s) */ l.id location, s.article, sum(s.quantity
                      * decode(l.id, d.locationto, 1, d.locationfrom, -1, 0))
                      quantity
                   FROM smdocuments d, smstorelocations l, smspec s
                   WHERE d.doctype = s.doctype
                     AND d.id = s.docid
                     AND l.id IN (d.locationto, d.locationfrom)
                     AND d.docstate >= 2
                     AND d.createdat > :i_date
                     AND l.id = 18
                     AND s.article IN (SELECT article
                              FROM smspec
                              WHERE doctype = 'RL'
                                AND docid = 'СВц001928')
                   GROUP BY l.id, s.article
                   HAVING sum(s.quantity * decode(l.id, d.locationto, 1, 
                          d.locationfrom, -1, 0)) <> 0
               UNION ALL
               SELECT storeloc, article, -quantity
                   FROM smgoods
                   WHERE quantity <> 0
                     AND storeloc = 18
                     AND article IN (SELECT article
                              FROM smspec
                              WHERE doctype = 'RL'
                                AND docid = 'СВц001928'))
         GROUP BY location, article
         HAVING sum(quantity) <> 0)
30.12.2011 15:22
akonev
 
я, наверное, невнимателен. в чем конкретно разница между запросами?
30.12.2011 15:28
Vlad
 
Я второй запрос исправил. Во втором запросе (где быстро считается) идет использование таблицы SMGOODS, в первом такого нету.
30.12.2011 15:29
akonev
 
звездец какой-то, как ты поправился... :)
один считает от начала времен вперед до даты ревизии. другой от текущих остатков назад до даты ревизии. который из них у тебя медленнее работает?

только не надо снова его вставлять :) :)

дата ревизии какая, там где долго считает?
30.12.2011 15:35
Vlad
 
Медленнее считает от начала времен вперед до даты ревизии (без smgoods).

Добавлено через 1 минуту 54 секунды
Везде текущая дата стоит, т. е. сегодня создал, сегодня и вычисляю остатки, запросы с разных баз
Часовой пояс GMT +3, время: 18:56.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.