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

Insert Select и Isvalid() - что-то не совмещаются...

Добавлено: 15 июн 2011, 21:09
Ольга
Заполняю тут таблицу в памяти с помощью Insert Select и хочу одно поле заполнить простым выражением - если документ включен в реестр - номер реестра, если нет - значение из переменной.
Наличие/отсутствие записей для заполнения поля хотела проверить IsValid.
Собственно, код:

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

//Таблица
table struct local tPlatDocs
(
  IsRee : boolean,
  DatOpl : Date,     
  cPlpor : comp,
  cRee : Comp,         //== ReePlPor.Nrec
  ReeNo : String[20] //Номер реестра
)
with index
(
byPartPol = DatOpl+ReeNo,
byPlpor   = cPlPor
)
;
//заполняю
Insert tPlatDocs select
  IsValid(#ReePlDoc),
  plPor.DatOb, Plpor.Nrec, 
  ReePlPor.Nrec, if(IsValid(tnReePlDoc),ReePlDoc.Nodok, NextReeNo)
from PlPor, ReePlDoc
where (( DocTidk    /== Plpor.tidkGal
  and ReestrDate /== PlPor.DatVip
  and PlPor.Nrec         == ReePlDoc.cPlpor
  and ReePlDoc.cReeplPor == ReePlpor.Nrec
));
Однако получется как-то занятно - если по всей выборке нет реестра (нет ссылок на ReePlDoc) - все нормально, если по всем записям есть реестр - тоже все нормально, а вот если по одим записям ReePlDoc есть, а по другим нет - IsVAlid срабатывает через раз - дает false по некоторым записям при наличии ссылки (Nrec из ReePlPor в таблицу падает нормально).
Не могу понять чего такое происходит, и куда вообще копать :(

ПС. С прикладной точки зрения проблем, в общем то нет - переделаю индех в таблице на нреки, благо они заполняются нормально, просто хочу понять, это что-то с IsValid или я где-то туплю ?
ПС2. Ах да, 5.4.35.6

Re: Insert Select и Isvalid() - что-то не совмещаются...

Добавлено: 15 июн 2011, 23:10
LaaLaa
Функция "IsValid" фактические является методом видимой части интерфейса, работает адекватно только в браузерах и скринах.
Воспользуйтесь в своем примере "insert...select..." другими функциями либо IsValidNew либо IsValidAll.

Re: Insert Select и Isvalid() - что-то не совмещаются...

Добавлено: 16 июн 2011, 11:14
pk
Как-то попробовал конструкцию insert into table1 select nrec,,,,.. from table2
на производительность, оказалась в 2 раза медленнее (oracle) обычного "ручного" цикла _loop table2 where((...)) {insert table1 set ...:=table2.nrec}.

Re: Insert Select и Isvalid() - что-то не совмещаются...

Добавлено: 16 июн 2011, 12:36
LaaLaa
pk, прирост скорости от этого оператора может быть только тогда, когда запрос разложится в такой же идентичный запроса оракла. К сожалению на випе insert...select... не всегда соответствует оному запросу в оракле. Трансляция insert...select... в один запрос идет лишь в не которых случаях, когда в операторе участвуют таблицы из БД и простые условия отбора.

В примере Ольги выборка идет из БД, а вставка идет в таблицу в памяти. Как ни крути, это все равно перекачка данных с сервера БД на клиента. Суть будет та же самая что и при _loop ... insert ..., плюс/минус небольшая разница в накладных расходах.

Re: Insert Select и Isvalid() - что-то не совмещаются...

Добавлено: 16 июн 2011, 15:16
Ольга
LaaLaa писал(а):Функция "IsValid" фактические является методом видимой части интерфейса, работает адекватно только в браузерах и скринах.
Понятно... Были у меня на счет применения IsValid смутные сомнения. :smile:
LaaLaa писал(а): Воспользуйтесь в своем примере "insert...select..." другими функциями либо IsValidNew либо IsValidAll.
ААА! :idea:
IsValidALl вчера пробовала использовать, протупила малось и решила что не работает... (В первом поле (IsRee : boolean) поставила IsValidAll, а в конце осталась IsValid в выражении - в результате получила false по всем записям в первом поле). Кстати, получается, что IsValid, затесавшийся в запрос, приводит к неверной работе IsValidAll и IsValidNew?

Сейчас поправила и попробовала - обе функции работают. Спасибо!!!