Страница 1 из 1

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

Добавлено: 17 янв 2007, 14:38
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. 

Добавлено: 17 янв 2007, 17:51
Den
Обращайся напрямую. А то чудеса всякие могут быть
x := viewkatstroy.getfirst katsopr;

Добавлено: 18 янв 2007, 08:37
Alexander
Den
Действительно, работает, НО только до тех пор, пока не установлена сортировка!
Добавив к вьюхе
...))order by katorg.nrec;
или
...))order Ord1 by katorg.nrec;
...
SetOrder(tiOrd1);
getfirst katstroy //опять возвращает 4
......

Добавлено: 18 янв 2007, 10:33
edward_K
НИКОГДА НЕ ПИШЕТЕ ТАК
and spsopr.cmcusl == katmc.nrec and (spsopr.prmc=1)
смесь условий == и = в двойных скобках приводит к непредсказемым результам и помимо глюков накладывает условие жесткой подцепки на все вышестояшие таблы.
лучше уж написать так
and 1 == spsopr.prmc ( noindex)

Добавлено: 18 янв 2007, 11:34
Alexander
edward_K
исправил, но проблемы с сортировкой это не решило....

Добавлено: 18 янв 2007, 11:59
edward_K
order by если идет не по индексу корневой таблицы( да еще и с жесткой подцепкой) тоже плохо.
да и в данном случае getfirst katstroy тоже как то не логично ( у вас же сортировка по katorg.nrec).
проще выгрузть во времянку а потом уже работать с ней.

Добавлено: 18 янв 2007, 13:58
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.

Добавлено: 18 янв 2007, 14:16
edward_K
TableVidDocs.code == spsopr.vidsopr
надо
spsopr.vidsopr ==TableVidDocs.code
)) and isvalidall(tnTableVidDocs)
так сработает.

Добавлено: 18 янв 2007, 14:24
Alexander
я так делал, но тогда ломаются индесы....
приходится делать:
katstroy.nrec /== spsopr.cuks(noindex)
что ведет к тормозам.... :-(

Добавлено: 18 янв 2007, 15:43
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;
}


....

Добавлено: 18 янв 2007, 15:46
Den
А если нужно сортировка еще по организациям, то только с предварительной буферизацией потока. Одной вью без внешней выгрузки Вы этого не добьетесь с приемлимой по скорости работе...

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

З.Ы. а что такое буферизация потока? где почитать?

Добавлено: 18 янв 2007, 16:43
Den
под буферезацией я и имел ввиду сохранение в набора данных в таблице в памяти )