11.09.2006 12:51
он может и загадочный, хотя есть подозрения, что это общая накопительная скидка на группу карточке, но это не важно я думаю, запрос сюдя по данным в таблицах явно ничего не отбирает с любыми параметрами
11.09.2006 12:52
При отключении выгрузки дисконтныых карт в административном модуле все идет нормально, удаляли все и заново создавали, в том то и проблема...
11.09.2006 13:26
Цитата:
isi При отключении выгрузки дисконтныых карт в административном модуле все идет нормально, удаляли все и заново создавали, в том то и проблема...
если оставить карты, но снести скидки по группам - тоже все плохо?

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

Код:
 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
да собственно все и так видно VIDSTART никогда не сможет стать больше VIDMAX и в последнем цикле процедуры такая же проблема...
12.09.2006 07:56
Думается, что после
VIDSTART := VIDEND + 1;
надо вписать
VIDEND := VIDSTART + VIDBETWEEN;
И немного озадачивает жесткое кодирование
VIDBETWEEN INTEGER := 2000;
что это за цифра разобрался? Я спросонья пока не въеду :)
12.09.2006 08:11
Согласен, а вот явное присваивание VIDBETWEEN INTEGER := 2000 мне тоже не понятно, странно что народ перешел на 24.5 и у всех все нормально, либо не используют дисконтные карты, либо только тестируют...
12.09.2006 08:30
Меня эта переписка радует безумно. Я только-только себя уговорила перейти... Придется ждать очередного сервис-пака... *11
Часовой пояс GMT +3, время: 03:53.

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