[ОТВЕТИТЬ]
11.09.2006 11:22
isi
 
после обновления на версию 1.0.24.5 sp2 + Oracle 8 и 9 версии
при выгрузках на кассу кассовый модуль повисает на отборе -> CLICLASS, при этом выполняется запрос:
Код:
INSERT INTO TTUKMCLICLASS ( TREE,BARCODE,PERCENT )  SELECT X.TREE,T.CODE,C.PERCENT   FROM TTDISCCARDCHANGES T,SMDISCPERSCLASS C,SACARDCLASS X  WHERE C.CARDTYPE = T.CARDTYPE  AND C.PRICEID = :b1  AND C.IDCLASS BETWEEN :b2 AND :b3  AND X.ID = C.IDCLASS  AND (T.ISCOLLECT = '0' )
и следом:
begin Supermag.Cash.CreateUkmCliClass(5); end;

и так по кругу в цикле...
11.09.2006 11:24
OlegON
 
Эээ, а план запроса? Статистика давно собиралась? Чем сервер занят?
11.09.2006 11:25
isi
 
У такая проблема по всем магазинам, как не проверил вовремя блин...
11.09.2006 11:25
isi
 
Статистику собрал оптимайзером только что, сделал полный optimize, ошибок нет, база новая, в ней ещё нет ни приходов ни расходов
11.09.2006 11:30
OlegON
 
Это-то что-то в тему накопительных скидок, я думаю. В виндовом журнале что-то есть? Что со скидками в базе вообще?
11.09.2006 11:35
isi
 
да это со скидками по дк на группы товаров, в виндовом журнале ничего нет
11.09.2006 12:36
Mtirt
 
Читаю описание, написано: "Для типа дисконтных карт введен новый флаг «Накопительная скидка». " Может стоит проверить настройку?
11.09.2006 12:41
isi
 
Проверил сразу же
Вложения
Тип файла: rar Описание.rar (6.0 Кб, 139 просмотров)
Тип файла: rar Описание.rar (6.0 Кб, 139 просмотров)
11.09.2006 12:47
akonev
 
Цитата:
Mtirt Читаю описание, написано: "Для типа дисконтных карт введен новый флаг «Накопительная скидка». " Может стоит проверить настройку?
и в запросике как раз какой-то загадочный (T.ISCOLLECT = '0') болтается
11.09.2006 12:50
akonev
 
а есть на чем пару экспериментов поставить, не гоняя в магазины?
поодключать нафиг все типы дисконтов, потом включать по одному.
посдергивать скидки с групп, потом опять же возвращать?
может получиться локализовать багу.
11.09.2006 12:51
isi
 
он может и загадочный, хотя есть подозрения, что это общая накопительная скидка на группу карточке, но это не важно я думаю, запрос сюдя по данным в таблицах явно ничего не отбирает с любыми параметрами
11.09.2006 12:52
isi
 
При отключении выгрузки дисконтныых карт в административном модуле все идет нормально, удаляли все и заново создавали, в том то и проблема...
11.09.2006 13:26
akonev
 
Цитата:
isi При отключении выгрузки дисконтныых карт в административном модуле все идет нормально, удаляли все и заново создавали, в том то и проблема...
если оставить карты, но снести скидки по группам - тоже все плохо?

вопрос принципиальный. если скидочная схема не слишком сложная - можно снести скидки
по дисконтам на группы и задать вместо них скидку в типе карты и ограничения скидок на группы.
заодно и кассы грузиться быстрее станут :)
11.09.2006 13:28
akonev
 
... понятно, что это не решение проблемы, но хоть пару дней выгадаете, чтобы спокойно причину найти.
12.09.2006 04:02
isi
 
Проблема в том, что даже если в БД вообще нет дисконтных карт, то при включенной выгрузке ДК почтовый модуль все равно "циклит", блин глянуть бы исходный код Кассового модуля... Ладно буду ждать ответа службы поддержки...
12.09.2006 05:26
isi
 
Вот собственно код процедуры, где "клинит" кассовый модуль:

Код:
 PROCEDURE CREATEUKMCLICLASS( PRICETYPE IN INTEGER )
    IS
      TRANSSIZE PLS_INTEGER := 10000;
      TRANSROW INTEGER := 0;
      VIDSTART INTEGER;
      VIDEND INTEGER;
      VIDMIN INTEGER;
      VIDMAX INTEGER;
      VIDBETWEEN INTEGER := 2000;
    BEGIN
      EXECUTE IMMEDIATE 'truncate table TTUkmCliClass';
      INSERT 
         INTO TTUKMCLICLASS
         ( TREE, BARCODE, PERCENT )
         SELECT
            X.TREE, '!' || T.PREFIX, C.PERCENT
            FROM TTDISCTYPECHANGES T, SMDISCPERSCLASS C, SACARDCLASS X
            WHERE X.ID = C.IDCLASS AND C.CARDTYPE = T.ID AND C.PRICEID = PRICETYPE;
      COMMIT;
      SELECT
         MIN( ID ), MAX( ID )
         INTO VIDMIN, VIDMAX
         FROM SACARDCLASS;
      VIDSTART := VIDMIN;
      VIDEND := VIDSTART + VIDBETWEEN;
   LOOP
         INSERT 
            INTO TTUKMCLICLASS
            ( TREE, BARCODE, PERCENT )
            SELECT
               X.TREE, T.CODE, C.PERCENT
               FROM TTDISCCARDCHANGES T, SMDISCPERSCLASS C, SACARDCLASS X
               WHERE C.CARDTYPE = T.CARDTYPE AND C.PRICEID = PRICETYPE AND C.IDCLASS BETWEEN VIDSTART AND VIDEND AND X.ID = C.IDCLASS AND ( T.ISCOLLECT = '0' );
         COMMIT;
         VIDSTART := VIDEND + 1;
         EXIT WHEN ( VIDSTART > VIDMAX );
      END LOOP;  
      FOR R IN ( SELECT
                    X.TREE, T.CODE, C.PERCENT
                    FROM TTDISCCARDCHANGES T, SMDISCCARDCLASS C, SACARDCLASS X
                    WHERE C.IDCLASS = X.ID AND C.CARDCODE = T.CODE AND C.PRICEID = PRICETYPE AND ( T.ISCOLLECT = '0' )
                    ORDER BY LENGTH( X.TREE ) ASC )
       LOOP
         IF R.TREE = '#' THEN
            DELETE 
               FROM TTUKMCLICLASS C
               WHERE C.BARCODE = R.CODE;
          ELSE
            DELETE 
               FROM TTUKMCLICLASS C
               WHERE C.BARCODE = R.CODE AND C.TREE LIKE ( R.TREE || '%' );
         END IF;
         INSERT 
            INTO TTUKMCLICLASS
            ( TREE, BARCODE, PERCENT )
            VALUES( R.TREE, R.CODE, R.PERCENT );
         TRANSROW := TRANSROW + 1;
         IF TRANSROW > TRANSSIZE THEN
            COMMIT;
            TRANSROW := 0;
         END IF;
      END LOOP;
      COMMIT;
      VIDSTART := VIDMIN;
      VIDEND := VIDSTART + VIDBETWEEN;
      LOOP
         INSERT 
            INTO TTUKMCLICLASS
            ( TREE, BARCODE, PERCENT )
            SELECT
               X.TREE, T.CODE, C.PERCENT
               FROM TTDISCCARDCHANGES T, SMCOLLECTDISCCARD C, SACARDCLASS X
               WHERE C.CODE = T.CODE AND C.IDCLASS BETWEEN VIDSTART AND VIDEND AND X.ID = C.IDCLASS AND ( T.ISCOLLECT != '0' );
         COMMIT;
         VIDSTART := VIDEND + 1;
         EXIT WHEN ( VIDSTART > VIDMAX );
      END LOOP;
      COMMIT;
   END;
А конкретнее я так понимаю не выполняется условие выхода из цикла:

Код:
 LOOP
         INSERT 
            INTO TTUKMCLICLASS
            ( TREE, BARCODE, PERCENT )
            SELECT
               X.TREE, T.CODE, C.PERCENT
               FROM TTDISCCARDCHANGES T, SMDISCPERSCLASS C, SACARDCLASS X
               WHERE C.CARDTYPE = T.CARDTYPE AND C.PRICEID = PRICETYPE AND C.IDCLASS BETWEEN VIDSTART AND VIDEND AND X.ID = C.IDCLASS AND ( T.ISCOLLECT = '0' );
         COMMIT;
         VIDSTART := VIDEND + 1;
         EXIT WHEN ( VIDSTART > VIDMAX );
      END LOOP;
от этого и такая высокая нагрузка на Oracle при работе процедуры... Сейчас буду дальше разбираться
12.09.2006 07:10
isi
 
да собственно все и так видно VIDSTART никогда не сможет стать больше VIDMAX и в последнем цикле процедуры такая же проблема...
12.09.2006 07:56
OlegON
 
Думается, что после
VIDSTART := VIDEND + 1;
надо вписать
VIDEND := VIDSTART + VIDBETWEEN;
И немного озадачивает жесткое кодирование
VIDBETWEEN INTEGER := 2000;
что это за цифра разобрался? Я спросонья пока не въеду :)
12.09.2006 08:11
isi
 
Согласен, а вот явное присваивание VIDBETWEEN INTEGER := 2000 мне тоже не понятно, странно что народ перешел на 24.5 и у всех все нормально, либо не используют дисконтные карты, либо только тестируют...
12.09.2006 08:30
Mtirt
 
Меня эта переписка радует безумно. Я только-только себя уговорила перейти... Придется ждать очередного сервис-пака... *11
12.09.2006 10:32
isi
 
Цитата:
Mtirt Меня эта переписка радует безумно. Я только-только себя уговорила перейти... Придется ждать очередного сервис-пака... *11
Я думаю сервиспак на днях появится, а временно, как вариант можно отключить выгрузку дисконтных карт, если до этого на кассах были выгрузки (со старой версии), то дисконтные карты останутся, и можно перебиться несколько дней
12.09.2006 11:42
Mtirt
 
С накопительными картами? Не думаю... Меня за эти несколько дней покупатели съедят.
12.09.2006 12:09
isi
 
мы пока накопительные не используем :)
12.09.2006 15:02
OlegON
 
В процедуре загрузки кассы действительно есть ошибка. Ошибка проявляется если в классификаторе товаров имеются группы с номером 2000 и больше.

Для исправления ошибки будет выпущен 5-й сервис пак к версии 1.024.5. В более ранних версиях ошибка не встречается.
16.09.2006 07:44
isi
 
Как ты и говорил, Олег.
в сервиспаке втором строка
Код:
VIDEND := VIDSTART + VIDBETWEEN;
просто ушла в цикл, но я так и не понимаю, зачем VIDBETWEEN INTEGER := 2000
16.09.2006 08:11
OlegON
 
Наверное кто-то не выспался, когда код писал :) То, что я привел выше - цитата высказывания главного программера. SP5 уже вышел.
Опции темы


Часовой пояс GMT +3, время: 03:32.

 

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