Скрипт: Альтернативный поиск/выбор объектов в Party

Обсуждение технических вопросов работы с системами управления базами данных (СУБД), работе с языком SQL и скриптовыми языками.
Ответить
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Скрипт: Альтернативный поиск/выбор объектов в Party

Сообщение Александр »

Андрей! - твоя мечта сбылась... :wink: :wink:
основываясь на процедуре 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
поиск идет мгновенный :wink: :wink: :wink: единственное что нужно учитывать -что при увеличении вариантов запросов - быстродействие данной хп будет снижаться :?

а что самое интересное вы можете сами не заморачиваясь созданием массива - просто создать атрибут - забить туда 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 )
а то что Лоция в 4.20 добавила скрытие значений атрибута- это вообще упростило жизнь (т.е. массив 25 элементов - найдено 4 - и именно эти 4 и будут показаны)(правда тем кто использовал filial_id - больше ловить нечего - но наверно Лоция знала что делала)
кстати нам самим - очень понравилось это дело
не забудьте дать доступ к этой процедуре пользователям Party :wink:
и еще - расширенный импорт иногда убивает значения отвязанного атрибута - но это дело поправимое - ведь импорт делаем не каждый день :wink: :wink: :wink:

Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный

Ответить