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

Скрипт: Перебор дочерних объектов без отметки в атрибуте

Добавлено: 26 июл 2007, 12:32
Александр
Может кому понадобится
Лоция предлагает перебирать дочерние объекты в цикле используя для исключения обработанных объектов - два момента - найти max id и проставить отметку в атрибуте...
но можно же гораздо проще и главное быстрее - искать min id сохранять его в переменной и следующий проход делать по сохраненному значению
например выбрать все объекты с направленной связью

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

Current_id=Set(0)
...
sql = Set ('
SELECT min(rw.id)  
  FROM LSDBO.object_reference_view rw,
       lsdbo.tree_link_view tl 
 WHERE tl.parent_id =100004656200000 
       and tl.link_id =rw.id 
       and tl.link_type_id = 11
       and rw.id>'+string(Current_id))
Current_id= Set ( number( f_ExecSQLSelect_2 ( sql,'','')) )
... 
зацикливаем
и скорость больше :wink:
и атрибуты целее :wink:

Добавлено: 26 июл 2007, 20:58
Старик Крупский
Отличная, кстати, мысль!!! Я этим пользуюсь, но не пришло в голову поделиться, думал и так все знают. Но на самом деле, пометка в атрибутах тоже иногда может пригодиться.

Добавлено: 27 июл 2007, 13:10
Александр
предлагаю еще больше ускориться :wink:
допустим в запросе отбирающем дочерние объекты влепить top25
т.е. отбираем первые 25 id например так (тут простой запрос для примера - но лучше конечно чтобы был сложный)

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

tmp = Set ( f_execsqlselect_2 ('
SELECT top 25 rw.id 
  FROM LSDBO.object_reference_view rw,
       lsdbo.tree_link_view tl
 WHERE tl.parent_id =100004656200000
       and tl.link_id =rw.id
       and tl.link_type_id = 11','', ',') )

получаем строку из id через запятую
а дальше в цикле вырезаем очередной id и выходим на объект простым и быстрым запросом

tmp=set(left(tmp,',',1))
id = Set ( number(f_ExecSQLSelect_2 ('
SELECT rw.id 
  FROM  lsdbo.object_reference_view rw
WHERE rw.id='+string(id),'','') )
т.е. чтобы каждый раз не гонять сложный запрос делаем выборку - кешируем ее, быстро обрабатываем и т.д.
на сложном первом запросе должно работать быстро :wink: :wink: на простом конечно - не имеет смысла - а может и имеет :roll: