Работа с таблицами в памяти. Ошибка наложения ограничений

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Работа с таблицами в памяти. Ошибка наложения ограничений

Сообщение Hershy »

Доброе время суток всем.
Опять вопрос про таблицы в памяти
вот интерфейс

Код: Выделить всё

TABLE STRUCT LOCAL MTMovRoll "ТАБЛИЦА В ПАМЯТИ"(
  NREC       : COMP
, CKATPAYM   : COMP
)
WITH INDEX
(
    MT1 = NREC,
    MT2 = CKATPAYM
);

interface iRepDOMovRollDem_nastr 'Настройка отчета', CYAN;
    Show at(0,0,43,11);
    CREATE VIEW vw
    var
        coFOPLAT
        : Comp;
    as select
        *
    from
        MTMovRoll,
    bounds byPAYMENT = coFOPLAT /== MTMovRoll.CKATPAYM
    ;

    SCREEN S1
......
    END;
    HANDLEEVENT
        cmOK:{
                    if(coFOPLAT <> 0){
                        pushBounds(tbbyPAYMENT);
                    }
                    if(BoundActive (tbbyPAYMENT)){
                        message('Ограничение активно '+String(coFOPLAT,0,0));
                    }
                    _loop MTMovRoll ordered by MTMovRoll.CKATPAYM{
                         message(String(MTMovRoll.CKATPAYM,0,0)+' = '+String(coFOPLAT,0,0);
                    }
       }
   END; 
END.
Вопрос в следующем
При выполнении вижу сообщение "'Ограничение активно 0001000000054668h"

а дальше:
0001000000054668h = 0001000000054668h
и, о чудо:
0001000000000002h = 0001000000054668h

Т.е. получается ограничение не срабатывает, и в отчет выводится вся таблица в памяти

В чем может быть проблема?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

В _loop наложен баунд, в котором ограничений нет, но есть сортировка. Этот баунд перебивает то, что наложено отдельно.
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

Хорошо, тогда вариант был еще такой

Код: Выделить всё

TABLE STRUCT LOCAL MTMovRoll "ТАБЛИЦА В ПАМЯТИ"( 
  NREC       : COMP 
, CKATPAYM   : COMP 
) 
WITH INDEX 
( 
    MT1 = NREC, 
    MT2 = CKATPAYM 
); 

interface iRepDOMovRollDem_nastr 'Настройка отчета', CYAN; 
    Show at(0,0,43,11); 
    CREATE VIEW vw 
    var 
        coFOPLAT 
        : Comp; 
    as select 
        * 
    from 
        MTMovRoll, 
    bounds byPAYMENT = coFOPLAT /== MTMovRoll.CKATPAYM 
    ordered by MTMovRoll.CKATPAYM
    ; 

    SCREEN S1 
...... 
    END; 
    HANDLEEVENT 
        cmOK:{ 
                    if(coFOPLAT <> 0){ 
                        pushBounds(tbbyPAYMENT); 
                    } 
                    if(BoundActive (tbbyPAYMENT)){ 
                        message('Ограничение активно '+String(coFOPLAT,0,0)); 
                    } 
                    _loop MTMovRoll { 
                         message(String(MTMovRoll.CKATPAYM,0,0)+' = '+String(coFOPLAT,0,0); 
                    } 
       } 
   END; 
END.
При компиляции выдавал предупреждение, что стандартная выгрузка, внешнее ограничение и т.д. и т.п.
А при выполнении опять не работало ограничение.

Как быть, в этом случае?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

а зачем вообще тут этот ordered? bound индексный, ограничение на ==...
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

Ну значит, вот зачем.
Вы, наверно, обратили внимание на текст

Код: Выделить всё

                    if(coFOPLAT <> 0){ 
                        pushBounds(tbbyPAYMENT); 
                    } 
т.е. получается, что ограничение работает не всегда. В том случае, если ограничение не активно, например в _loop MTMovRoll {} поставить группировку по полю MTMovRoll.CKATPAYM. Вот для чего, собственно, и нужна сортировка по полю.

Как из ситуации выкрутиться?

Сейчас все работает так

Код: Выделить всё

TABLE STRUCT LOCAL MTMovRoll "ТАБЛИЦА В ПАМЯТИ"( 
  NREC       : COMP 
, CKATPAYM   : COMP 
) 
WITH INDEX 
( 
    MT1 = NREC, 
    MT2 = CKATPAYM 
); 

interface iRepDOMovRollDem_nastr 'Настройка отчета', CYAN; 
    Show at(0,0,43,11); 
    CREATE VIEW vw 
    var 
        coFOPLAT 
        : Comp; 
    as select 
        * 
    from 
        MTMovRoll
    ; 

    SCREEN S1 
...... 
    END; 
    HANDLEEVENT 
        cmOK:{ 
                    if(coFOPLAT <> 0){ 
                        _loop MTMovRoll where ((coFOPLAT /== MTMovRoll.CKATPAYM )) { 
                             message(String(MTMovRoll.CKATPAYM,0,0)+' = '+String(coFOPLAT,0,0); 
                        } 
                    }else{
                        _loop MTMovRoll ordered by MTMovRoll.CKATPAYM { 
                             message(String(MTMovRoll.CKATPAYM,0,0)+' = '+String(coFOPLAT,0,0); 
                        } 
                     }
       } 
   END; 
END.
Мне кажется, это бред полный
И так, может быть проблема в том, что используется таблица в памяти, ведь на физическую таблицу можно такие вещи ставить?
И если это так, то есть ли решение проблемы?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

так можно описать отдельно ограничение и отдельно сортировку
накладывать то одно, то другую
ну и делать луп. просто луп
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

А можете объяснить почему не работает в таком варианте, ведь ничего запретного не написано?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

В каком из 3х?
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

во втором
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

второй вариант нормально работает
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Вот дописанный рабочий пример по 2му варианту:

Код: Выделить всё

TABLE STRUCT LOCAL MTMovRoll "ТАБЛИЦА В ПАМЯТИ"(
  NREC       : COMP
, CKATPAYM   : COMP
)
WITH INDEX
(
    MT1 = NREC,
    MT2 = CKATPAYM
);

interface iRepDOMovRollDem_nastr 'Настройка отчета', CYAN;
    Show at(0,0,43,11);
    CREATE VIEW vw
    var
        coFOPLAT
        : Comp;
    as select
        *
    from
        MTMovRoll
    bounds byPAYMENT = coFOPLAT /== MTMovRoll.CKATPAYM
    ordered by MTMovRoll.CKATPAYM
    ;

    SCREEN S1;
fields
coFOPLAT:noprotect;
buttons
cmok;
<<
.@@@@@@@@@@@@@@@@@@@@@

<.ok.>

>>

    END;

    HANDLEEVENT
        cmOK:{
                    if(coFOPLAT <> 0){
                        pushBounds(tbbyPAYMENT);
                    }
                    if(BoundActive (tbbyPAYMENT)){
                        message('Ограничение активно '+String(coFOPLAT,0,0));
                    }
                    _loop MTMovRoll {
                         message(String(MTMovRoll.CKATPAYM,0,0)+' = '+String(coFOPLAT,0,0));
                    }
       }
cminit: {
insert mtmovroll set nrec=1,ckatpaym=1;
insert mtmovroll set nrec=2,ckatpaym=2;
}
   END;
END.
Ответить