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

Проблема с vip-м

Добавлено: 12 сен 2007, 10:04
Гаврилюк Марина
Помогите, пожалуйста, беда ващще!!!

Имеется интерфейс с предварительно описанными таблицами в памяти:

 (подробно описывать не буду, опытные галактиоиды должны понять)



table struct SpecDog

( CDog : comp,

  kod : string,

 ......)

with index

(MyReestr 00 = CDog + Kod,

 ......);



Interface  ReestR 'Реестр  номенклатуры договоров по наличию и движению.........'

..........

create view

var

......

   coDog: comp;

....

   KodMU : string;

......

as select *



from

 .......

  dogovor,  katsopr,

  spdocs,  spsopr,

.....

  specdog, synonym specdog specdog_p,

......

where

((   ....... // здесь подцепки 

and coDog == specdog.cdog

and kodMU == specdog.bkod

and coDog == specdog_p.cdog

and kodMU == specdog_p.bkod

.......

  ))

;

........

........

.........



procedure Make;

{ var

........;

 if(Getfirst dogovor = tsOk) 

    Do

   {

    coDog := dogovor.nrec;

  ............

..............// здесь выборка изаполнение временных таблиц

 If (GetFirst Spdocs <> tsOk) {LogStrToFile('logGrPr.log', 'No!');}

 If (GetFirst Spdocs = tsOk)

  Do

  ..........

    KodMU := Katmc_D.Barkod;

........

 if(GetFirst specdog <> tsOk)

   {

    Insert specdog set

    specdog.cdog = coDog,

  specdog.bkod = KodMU,

    ......

;

   LogStrToFile('logGrPr.log', specdog.bkod + ' //'+ specdog.named +' // '+ specdog.cdog);

}

while (Getnext Spdocs = tsOk);

If (GetFirst KatSopr = tsOk)

  Do

  {

   If (GetFirst SpSopr = tsOk)

  Do

   {

      KodMU := KatMC.barkod; 

.........

   if(GetFirst specdog_p = tsOk)  // ищутся уже заведенная запись по индексу

{   Kod_D := specdog_p.bkod;

    sp_name := specdog_p.Named;

LogStrToFile('logGr10.log',Kod_d + ' \ ' + CoDog +' \ '+ specdog_p.priz);

}

 else

 {Insert specdog_p set

    specdog_p.cdog = coDog,

    specdog_p.bkod = 'нет',

    sp_name := specdog_p.named;

    Kod_D := specdog_p.bkod;

   LogStrToFile('logGr10.log',Kod_d + ' \ ' + sp_name +' \ '+ specdog_p.priz);

  }

...........

   }

  While(GetNext SpSopr = tsOk);

   }

  While(GetNext katsopr = tsOk);

  }

 While(GetNext dogovor = tsOk);

 }



Суть проблемы в том, что во втором случае обращения к таблице  в памяти SPECDOG записи никакие не находятся и вставляются новые, хотя таблица уже заполнена 

 ( Это видно из лог-файлов!!!)  и индексы к ней должны работать в этой вьюхе.

Что делать ?????

Добавлено: 12 сен 2007, 10:33
edward_K
rereadrecords(#specdog_p). Так то конечно масло маслянное. Я бы вставку вообще бы вынес в отдельную функцию и использовал бы ее в обоих местах может чуть с разными параметрами.

Добавлено: 12 сен 2007, 10:59
san
Кто вас учил писать программы на випе?

Добавлено: 12 сен 2007, 12:53
Гаврилюк Марина
Кто вас учил писать программы на випе?
Что, так плохо? Никто, самиздат.

Добавлено: 12 сен 2007, 13:27
Гаврилюк Марина
то edward_K Может быть rereadrecord(#specdog_p)?
Пробовала так
if(GetFirst specdog <> tsOk)
{
Insert specdog set
specdog.cdog = coDog,
specdog.bkod = KodMU,
......
;
rereadrecord(#specdog_p);
......
}
Результат этот же ;(( . Насчет инсертов вынести в функцию, то это не получится - они разные...

Добавлено: 12 сен 2007, 13:35
PViP
san, аффтор жжжжжет !!!!!!! :grin:

Гаврилюк Марина, попробуйте убрать synonym, без него тоже будет работат. Ваша проблема в том что образно говоря логическая табла делает слепок на момент обращенияк ней, дак вот, когда вы первый раз обращаетесь к лог табле, то заносите в таблу specdog. Табла же specdog_p фактически не имеет к specdog никакого отношения в этой ЛОГ. табле, и поэтому записей в specdog_p никаких нет на момент ее считывания после добавления записей в specdog_p. Делайте инсерт в одну таблу(specdog), не используйте при этом синонимов. а потом попробуйте rereadrecords(#specdog_p).

Я бы делал так, с использование pushpos и poppos. Это позволяет не использовать сининим, к примеру:такое использование

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

     _loop mySklOst
     {
       if (CurCount <= mySklOst.Kol){
         pushpos(#mySklOst);
         update mySklOst where ((TmpSklOst == mySklOst.SklOstNrec)) set mySklOst.Kol := mySklOst.Kol - CurCount;
         poppos(#mySklOst);
         break;
       }else{
         pushpos(#mySklOst);
         update mySklOst  where ((TmpSklOst == mySklOst.SklOstNrec)) set mySklOst.Kol := 0;
         poppos(#mySklOst);
       }
     }

Добавлено: 12 сен 2007, 17:21
Гаврилюк Марина
Спасибо

Добавлено: 13 сен 2007, 10:39
Goblin
Вместо Getfirst = tsok isValidAll(tnspecdog_p) попробуйте ...