Проблемы с логической таблицей

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

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

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

Проблемы с логической таблицей

Сообщение Hershy »

Добрый день, уважаемые!
Возникла проблема с логической таблицей в следующем интерфейсе

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

table struct local party041 (
  NREC        : COMP
, CKatmc      : COMP
, party       : string
, Podr        : STRING
, Mol         : STRING)
WITH INDEX(
    MT01 = NREC(unique, surrogate)
   ,MT02=  cKatmc);
//--------------------------------------------------------------------------------------------------------
Interface i041Konvertor_Int1 'Выбор из партий заданной МЦ';
    Var  mc_nrec,_csklad,_cmol,_cparty: comp;
          kolSpsopr : DOUBLE;

CREATE VIEW T1 AS SELECT * FROM PARTY041,TEKSALDO,KATMC
WHERE ((MC_NREC     == KATMC.NREC
    AND KATMC.NREC  == PARTY041.CKATMC))
    AND _csklad <> PARTY041.PODR
    AND _cmol   <> PARTY041.MOL
    AND _cparty <> PARTY041.PARTY;
                
Parameters mc_nrec, kolSpsopr, _csklad, _cmol, _cparty;
//--------------------------------------------------------------------------------------------------------
Procedure FillTable(nr_mc : comp);{
    Message('FillTable: ['+String(nr_mc,0,0)+']');
    _loop TEKSALDO WHERE ((nr_mc == TEKSALDO.CMC)) {
        Message('Итерация TEKSALDO ['+String(TEKSALDO.NREC,0,0)+']');
    }
}
//--------------------------------------------------------------------------------------------------------
HandleEvent
cmInit:{ FillTable(mc_nrec); }
End; 
End.
так вот, проблема в следующем. В данном примере, почему-то не отрабатывает

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

_loop TEKSALDO WHERE
, т.е. ни одного сообщения "Итерация ..." не появляется. Хотя в документации четко написано,
Если вызван оператор навигации с конструкцией where, то на время своего выполнения он отменяет текущую подцепку для таблицы в которой происходит поиск /перебор записей и если найденная запись не попадает в текущую подцепку, то модификатор возвращает статус tsOk, но текущая запись становится невалидной. Перед вызовом операторов навигации, условие в where для которых не является более сильным чем условие текущей подцепки рекомендуется вызывать ResetBounds, после вызова модификатора и выборки найденных значений рекомендуется вызывать SetBounds для таблицы модификатора.
Если убрать сцепки из логической таблицы T1, то все работает на ура, т.е.:

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

table struct local party041 (
  NREC        : COMP
, CKatmc      : COMP
, party       : string
, Podr        : STRING
, Mol         : STRING)
WITH INDEX(
    MT01 = NREC(unique, surrogate)
   ,MT02=  cKatmc);
//--------------------------------------------------------------------------------------------------------
Interface i041Konvertor_Int1 'Выбор из партий заданной МЦ';
    Var  mc_nrec,_csklad,_cmol,_cparty: comp;
          kolSpsopr : DOUBLE;

CREATE VIEW T1 AS SELECT * FROM PARTY041,TEKSALDO,KATMC
WHERE ((MC_NREC     == KATMC.NREC));
                
Parameters mc_nrec, kolSpsopr, _csklad, _cmol, _cparty;
//--------------------------------------------------------------------------------------------------------
Procedure FillTable(nr_mc : comp);{
    Message('FillTable: ['+String(nr_mc,0,0)+']');
    _loop TEKSALDO WHERE ((nr_mc == TEKSALDO.CMC)) {
        Message('Итерация TEKSALDO ['+String(TEKSALDO.NREC,0,0)+']');
    }
}
//--------------------------------------------------------------------------------------------------------
HandleEvent
cmInit:{ FillTable(mc_nrec); }
End; 
End.
В этом варианте все мессаги появляются как надо. Пробовал поставить:

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

    ResetBounds(tnTEKSALDO);
    _loop TEKSALDO WHERE ((nr_mc == TEKSALDO.CMC)) {
        Message('Итерация TEKSALDO ['+String(TEKSALDO.NREC,0,0)+']');
    }
Тоже самое, ни одной итерации нет. Помогите пожалуйста.
LnStep
заказчик
Сообщения: 6
Зарегистрирован: Чт, 22/10/2009 08:27
Имя Фамилия: Алексей Шунин
Откуда: Валента Фарм ОАО

Сообщение LnStep »

попробуйте так, (и _Loop без Where)

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

CREATE VIEW T1 AS SELECT * FROM PARTY041,TEKSALDO,KATMC 
WHERE 
((
                MC_NREC == PARTY041.CKATMC
                                       (
                                         AND _csklad <> PARTY041.PODR 
                                         AND _cmol   <> PARTY041.MOL 
                                         AND _cparty <> PARTY041.PARTY
                                       )
        and PARTY041.CKATMC == KATMC.NREC 


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

Сообщение Hershy »

Да, да, это все понятно и спасибо за быстрый ответ. Я проблему самой задачи уже решил другим способом.

Однако, самая главная проблема - это то, что where не отрабатывает как надо, т.е. он же должен был в _loop снять все ограничения на таблицу TEKSALDO и поставить свои, чего не было сделано.

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

Сообщение cruger »

Николай Воронцов
Всё отрабатывает, как положено.
AND _csklad <> PARTY041.PODR
AND _cmol <> PARTY041.MOL
AND _cparty <> PARTY041.PARTY;
- это не ограничения на таблицу TEKSALDO, а кондишены на всю ЛТ.
Hershy
рег.отделение
Сообщения: 64
Зарегистрирован: Вт, 03/03/2009 07:53
Имя Фамилия: Николай Воронцов
Откуда: Галактика-Урал
Контактная информация:

Сообщение Hershy »

Я чего-то не могу понять.
Вопрос в том, что для _loop ... where
Если вызван оператор навигации с конструкцией where, то на время своего выполнения он отменяет текущую подцепку для таблицы в которой происходит поиск /перебор записей и если найденная запись не попадает в текущую подцепку, то модификатор возвращает статус tsOk, но текущая запись становится невалидной. Перед вызовом операторов навигации, условие в where для которых не является более сильным чем условие текущей подцепки рекомендуется вызывать ResetBounds, после вызова модификатора и выборки найденных значений рекомендуется вызывать SetBounds для таблицы модификатора.
При чем здесь вообще ЛТ интерфейса?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

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

Сообщение cruger »

Да и сказано - снимается подцепка. Кондишены уровня ЛТ - это не подцепка.

Далее, допустим к луповской таблице в ЛТ подцеплена какая-то другая. Так вот эта подцепка в лупе сниматься не будет! И не должна!

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

Сообщение Hershy »

Понятно, т.е. получается, что where (которая для _loop) может только изменить подцепки для T1, но описанные в T1 ограничения (не сцепки) все-равно остаются в силе, даже для ЛТ _loopа.

Мне кажется можно добавить это в мануал, т.е. акцентировать одним предложением. Для четкого понимания.

За два с половиной года, первый раз с таким сталкиваюсь

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

Сообщение cruger »

Николай Воронцов
Но с другой стороны, если бы в лупе снимались общие кондишены, а затем в теле цикла проводилась навигация по той же PARTY041, то возникал бы резонный вопрос - почему же не срабатывают кондишены?! :lol:
Ответить