Скрипт: Альтернативный поиск/выбор объектов в Party
Добавлено: 10 июл 2007, 07:40
Андрей! - твоя мечта сбылась...
основываясь на процедуре http://www.lplm.ru/phpBB2/viewtopic.php?t=257
мы реализовали быстрый выбор объектов на основе значений отвязанного атрибута. Если в первой части массивы каждый раз пересоздавались заново (размер) то тут мы работаем в массиве из 25 элементов
поиск идет мгновенный
единственное что нужно учитывать -что при увеличении вариантов запросов - быстродействие данной хп будет снижаться 
а что самое интересное вы можете сами не заморачиваясь созданием массива - просто создать атрибут - забить туда 25 любых значений и работать с этой процедурой используя на формах значения этого атрибута в виде выпадающего списка - вырезая из нужной строки последнии 15 знаков для идентификации объекта
вызов такой
а то что Лоция в 4.20 добавила скрытие значений атрибута- это вообще упростило жизнь (т.е. массив 25 элементов - найдено 4 - и именно эти 4 и будут показаны)(правда тем кто использовал filial_id - больше ловить нечего - но наверно Лоция знала что делала)
кстати нам самим - очень понравилось это дело
не забудьте дать доступ к этой процедуре пользователям Party
и еще - расширенный импорт иногда убивает значения отвязанного атрибута - но это дело поправимое - ведь импорт делаем не каждый день



основываясь на процедуре http://www.lplm.ru/phpBB2/viewtopic.php?t=257
мы реализовали быстрый выбор объектов на основе значений отвязанного атрибута. Если в первой части массивы каждый раз пересоздавались заново (размер) то тут мы работаем в массиве из 25 элементов
Код: Выделить всё
/*------------------------------------------------------
* очистить существующий массив
* произвести поиск в соответствии с параметрами
* записать значения в массив @d_atr
*-----------------------------------------------------*/
ALTER Procedure [LSDBO].[Ric_RefreshArray1]
(@d_atr numeric(18,0) Output, --ID массива (атрибута) для записи значений
@NSelect integer=0, --номер Select
@ObjID numeric(18,0)=0, --ID объекта
@ObjType char(256), --Тип объекта
@ObjAttr1ID numeric(18,0)=0, --ID Атрибута1 Объекта
@ObjAttr1Value sql_variant=0, --Значение Атрибута1 Объекта
@ObjAttr2ID numeric(18,0)=0, --ID Атрибута2 Объекта
@ObjAttr2Value sql_variant=0 --Значение Атрибута2 Объекта
)As
Begin
SET CONCAT_NULL_YIELDS_NULL OFF --отключить проверку NULL значений
--Очистить массив
Update lsdbo.value_string Set
value ='', --обнулить все строки
filial_id=1 --запретить отображение значений атрибутов
From lsdbo.value_string
Where lsdbo.value_string.attrib_id=@d_atr
--Создать и заполнить первую временную таблицу результатами запроса
Create table #t1 (id numeric(18,0) identity(1,1) primary key, value char(255) not null ,filial_id int not null )
/*************************************************************************************/
If @NSelect=101
--101.0 Найти первые 25 объектов, где:
-- = ID типа объекта @ObjID
-- = Тип объекта @ObjType
--После названия вывести значение строкового атрибута с id=@ObjAttr1ID
/*************************************************************************************/
Begin
Insert #t1(filial_id,value)
Select TOP 25
0 as filial_id,
left (rw.description + space(200),200)+
--форма собственности
'|'+(SELECT vv.value
FROM lsdbo.attrib_value_view av,
lsdbo.value_string_view vv
WHERE av.value_id = vv.id
AND av.object_id = rw.id
AND av.treelink_id = 0
AND av.attrib_id = @ObjAttr1ID)+'|' +
STR(rw.id,15) as value
From lsdbo.object_reference_view rw,
lsdbo.object_type_view tw
Where (rw.type_id = tw.id)
AND (tw.mnemo = @ObjType)
and(rw.description like CAST(@ObjAttr1Value AS varchar(256)));
End
/*************************************************************************************/
-- set rowcount 0
--Создать и заполнить вторую таблицу id номереми массива
Create table #t2 (id numeric(18,0) identity(1,1) not for replication primary key,Free_id numeric(18,0) not null )
Insert #t2(Free_id)
Select lsdbo.value_string.id
From lsdbo.value_string
Where lsdbo.value_string.attrib_id=@d_atr
--Записать результаты запроса через двойную перепривязку в массив
--Begin Tran --начать транзакцию
Update vs Set
vs.value=rtrim(t1.value),
vs.filial_id=t1.filial_id
From lsdbo.value_string vs
join #t2 t2
on t2.Free_id=vs.id
join #t1 t1
on t1.id=t2.id
--Commit Tran --подтвердить транзакцию
--Удалить временные таблицы
Drop table #t1
Drop table #t2
Set @d_atr=0
SET CONCAT_NULL_YIELDS_NULL ON --включить проверку NULL значений
--!!! Для корректного выхода из f_ExecSQLSelect_2 ('exec... нужно использовать
-- Select @d_atr перед последним End
-- НО это в свою очередь вызывает двойной запуск процедуры из действия Лоции???
-- Таким образом для эмитации нормального завершения функции - необходим следующий
-- шаг с формой (можно с автоматическим завершением)-тогда все Ок (вызов один)
End




а что самое интересное вы можете сами не заморачиваясь созданием массива - просто создать атрибут - забить туда 25 любых значений и работать с этой процедурой используя на формах значения этого атрибута в виде выпадающего списка - вырезая из нужной строки последнии 15 знаков для идентификации объекта
вызов такой
Код: Выделить всё
Client = Set ( '%'+client+'%' )
res = Set ( 'exec lsdbo.RIC_RefreshArray1 100004086900000,101,0,~'Clt~',3000000000002,~''+Client+'~'' )
res = Set ( f_ExecSQLSelect_2(res,'','') )
...
форма с атрибутом (строка ShortFind_str - выпадающий список на отвязанном атрибуте с c id=100004086900000)
...
ID_Section = Set ( number(right(ShortFind_str,15) ) )
Temp_Object = SetByID ( ID_Section )
WndTree ( Temp_Object , a_LinkType )
кстати нам самим - очень понравилось это дело
не забудьте дать доступ к этой процедуре пользователям Party

и еще - расширенный импорт иногда убивает значения отвязанного атрибута - но это дело поправимое - ведь импорт делаем не каждый день


