Проблема со вьюхой, хелп! 2-й день бьюсь :((

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Проблема со вьюхой, хелп! 2-й день бьюсь :((

Сообщение Alexander »

Проблема следующего плана:
Делаю выборку некоторых актов и спецификаций по стройкам.
делаю таблицу MyTableMC, куда хочу сгружать данные. НО,
КАК ТОЛЬКО Я К ЭТОЙ ТАБЛИЦЕ ОБРАЩАЮСЬ, КОРНЕВАЯ ВЬЮХА ОТКАЗЫВАЕТСЯ РАБОТАТЬ!!!!!
Причем, делал такой пример: создал ф-цию, которая нигде не вызывается, внутри инсерт одной записи в MyTableMC:

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

insert
    into MyTableMC
    set mcname   = '',
         mckind   = 1,
         mcdsopr  = 1,
         mcamount = 1;
и все! приехали! getfirst возвращает 4... комметнарю инсерт - все в порядке! Что, блин, за глюк такой???
Пример(закомментаренный дефайн - без инсерта, раскоментарите дефайн - с ним):

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

//#define t1

Interface test 'test' Cyan;
table struct MyTableMC(
   mcname  : string,
   mckind  : word,
   mcdsopr : date,
   mcamount: double
)with index(Ind = mckind);
   create view ViewKatStroy
   var
      x                    :  integer;
   as select
       katstroy.Name,
       katstroy.nrec,
       katorg.name,
       katmc.name,
       katmc.kind,
       spsopr.kolfact,
       spsopr.price
   from
        katstroy,
        katsopr,
        katorg
   where ((
                katstroy.nrec    /== spsopr.cuks
            and spsopr.csopr     /== katsopr.nrec
            and katsopr.corg      == katorg.nrec
            and 110 == spsopr.vidsopr
            and spsopr.cmcusl == katmc.nrec and (spsopr.prmc=1)
         ));

   SCREEN screen1;
      fields
      buttons
         cmClearFilter;
      <<
                <.Проверить.>
      >>
   end;

   handleEvent
     cmClearFilter:{
       x := viewkatstroy.getfirst;
       if(x=0)
#ifdef t1
          insert
               into MyTableMC
                  set mcname   = ViewKatStroy.katmc.name,
                      mckind   = ViewKatStroy.katmc.kind,
                      mcdsopr  = ViewKatStroy.katsopr.dsopr,
                      mcamount = (ViewKatStroy.spsopr.kolfact * ViewKatStroy.spsopr.price);
#else
     x;
#end
        message(ViewKatStroy.getfirst);
     }
   end;
end. 
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Обращайся напрямую. А то чудеса всякие могут быть
x := viewkatstroy.getfirst katsopr;
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Den
Действительно, работает, НО только до тех пор, пока не установлена сортировка!
Добавив к вьюхе
...))order by katorg.nrec;
или
...))order Ord1 by katorg.nrec;
...
SetOrder(tiOrd1);
getfirst katstroy //опять возвращает 4
......
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

НИКОГДА НЕ ПИШЕТЕ ТАК
and spsopr.cmcusl == katmc.nrec and (spsopr.prmc=1)
смесь условий == и = в двойных скобках приводит к непредсказемым результам и помимо глюков накладывает условие жесткой подцепки на все вышестояшие таблы.
лучше уж написать так
and 1 == spsopr.prmc ( noindex)
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

edward_K
исправил, но проблемы с сортировкой это не решило....
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

order by если идет не по индексу корневой таблицы( да еще и с жесткой подцепкой) тоже плохо.
да и в данном случае getfirst katstroy тоже как то не логично ( у вас же сортировка по katorg.nrec).
проще выгрузть во времянку а потом уже работать с ней.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

проблема с запросом:
отбирает только vidsopr=210, т.е. берет только последнюю добавленную запись в TableVidDocs! как быть??

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

table struct TableVidDocs(
   code    : longint
)with index (Ind = code);

Interface test 'test' Cyan;
   create view ViewKatStroy
   as select
       katstroy.Name
   from
        katstroy
   where ((
                katstroy.nrec /== spsopr.cuks
            and 1 == spsopr.npp (noindex)
            and TableVidDocs.code == spsopr.vidsopr
            and spsopr.csopr     == katsopr.nrec
            and katsopr.corg     == katorg.nrec
         ));

   SCREEN screen1;
      fields
      buttons
         cmClearFilter;
      <<
                <.Проверить.>
      >>
   end;

   handleEvent
     cmInit:{
        insert into TableVidDocs set code = 110;
        insert into TableVidDocs set code = 111;
        insert into TableVidDocs set code = 210;
     }
     cmClearFilter:{
       _loop katstroy{
          message(katstroy.name);
       }
     }
   end;
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

TableVidDocs.code == spsopr.vidsopr
надо
spsopr.vidsopr ==TableVidDocs.code
)) and isvalidall(tnTableVidDocs)
так сработает.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

я так делал, но тогда ломаются индесы....
приходится делать:
katstroy.nrec /== spsopr.cuks(noindex)
что ведет к тормозам.... :-(
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Суть то задачи в чем состоит ?
Есть ли вывести отсортированные по виду katstory, то с построенной Вашей вью вы этого не добьетесь...


where ((
TableVidDocs.code == spsopr.vidsopr
and 1 == spsopr.npp (noindex)
and spsopr.csopr == katsopr.nrec
and katsopr.corg == katorg.nrec
and spsopr.cuks == katstroy.nrec
));


cmInit:{
insert into TableVidDocs set code = 110;
insert into TableVidDocs set code = 111;
insert into TableVidDocs set code = 210;
}


....
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

А если нужно сортировка еще по организациям, то только с предварительной буферизацией потока. Одной вью без внешней выгрузки Вы этого не добьетесь с приемлимой по скорости работе...
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

Den
порядок подцепок не тот, придется сливать во временную таблицу... сгруппировать тогда не смогу.
спасибо всем! :-)

З.Ы. а что такое буферизация потока? где почитать?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

под буферезацией я и имел ввиду сохранение в набора данных в таблице в памяти )
Ответить