Поиск по описаниям и примечаниям документов и версий

Обсуждение технических вопросов работы с системами управления базами данных (СУБД), работе с языком SQL и скриптовыми языками.
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

Эта тема является развитием http://www.lplm.ru/phpBB2/viewtopic.php?f=18&t=584
При помощи средств собственного поиска объектов (LSQuery) реализовал поиск объектов по описанию и примечанию подключенных к ним документов.
1. Создал три строковых атрибута:
- Описание документа (поиск)
- Примечание документа (поиск)
- Примечание версии (поиск)
2. Для каждого из этих атрибутов написал отдельный поиск в SQL-процедуре
3. Добавил три индекса на таблицы БД:
- для file1 один индекс для description, второй для note
- для file_ver индекс для поля note

Для поиска по описаниям и примечаниям документов указываем в окне выбора любые условия для атрибутов из п.1.
Особенно удобно добавлять эти атрибуты на формы поиска.

При желании можно расширить номенклатуру поисковых характеристик документов. Например, можно загнуть поиск по типу документа или приложения.
В принципе, можно сделать поиск не только по характеристикам документа - никто не мешает и по работам Workflow поискать. Или еще по чему-нибудь - в зависимости от потребностей и фантазии...
И все это в рамках стандартного окна поиска!

Далее исходники.
Тест поискового макроса:

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

Option Explicit
Sub Search()
  dim SearchDS,Cond,i,iOpen,iClose,attr_cnt,doc_attr,lAttribID
  dim iLO,cLO,rValue
  if LSQuery.IsCustomSet("LsObjByAttrib") then
    set SearchDS=LSQuery.CustomParam("LsObjByAttrib")
      attr_cnt=0
      doc_attr=0
      iLO=0
      iOpen=0
      For i=1 To SearchDS.Count
        Set Cond=SearchDS.Item(i)
        if Cond.lType="A" then
          attr_cnt=attr_cnt+1
          if CStr(Cond.lAttribID)="100037395200001" or CStr(Cond.lAttribID)="100037395300001" or CStr(Cond.lAttribID)="100037395400001" then
            doc_attr=1
          end if
        end if
        if attr_cnt=0 then
          iLO=i
          iOpen=iOpen+Cond.bOpen-Cond.bClose
        end if
      Next
      if attr_cnt>1 and iLO>0 and iOpen=0 then
        For i=1 to ILO
          set Cond=SearchDS.Item(i)
          rValue=PrepareStrValue(Cond.rValue)
          if (Cond.Oper="like" or Cond.Oper="not like") and right(rValue,1)<>"%" then rValue=rValue+"%"
          Select Case Cond.lValue
            Case "D"              
              Select Case Cond.Oper
                Case "exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_reference_view.description > '' "+_
                    +String(Cond.bClose,")")
                Case "not exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_reference_view.description = '' "+_
                    +String(Cond.bClose,")")
                Case Else
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_reference_view.description "+Cond.Oper+" '"+_
                    rValue+"' "+String(Cond.bClose,")")
              End Select
            Case "T"
              Select Case Cond.Oper
                Case "exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.description > '' "+_
                    +String(Cond.bClose,")")
                Case "not exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.description = '' "+_
                    +String(Cond.bClose,")")
                Case Else
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.description "+Cond.Oper+" '"+_
                    rValue+"' "+String(Cond.bClose,")")
              End Select
            Case "M"
              Select Case Cond.Oper
                Case "exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.mnemo > '' "+_
                    +String(Cond.bClose,")")
                Case "not exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.mnemo = '' "+_
                    +String(Cond.bClose,")")
                Case Else
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.mnemo "+Cond.Oper+" '"+_
                    rValue+"' "+String(Cond.bClose,")")
              End Select
            Case "C"
              Select Case Cond.Oper
                Case "exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.object_type > '' "+_
                    +String(Cond.bClose,")")
                Case "not exists"
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.object_type = '' "+_
                    +String(Cond.bClose,")")
                Case Else
                  cLO=cLO+String(Cond.bOpen,"(")+_
                    "lsdbo.object_type_view.object_type "+Cond.Oper+" '"+_
                    rValue+"' "+String(Cond.bClose,")")
              End Select            
          End Select
          cLO=cLO+" "+Cond.Logic+" "
        Next
      else
        iLO=0
      end if
      iLO=iLO+1
      if attr_cnt>1 or doc_attr=1 then
        LSTransaction.Execute("DELETE FROM lsdbo.aln_misc_LSQueryCond")
        For i=iLO To SearchDS.Count
          Set Cond=SearchDS.Item(i)
          if i=iLO then iOpen=1 else iOpen=0
          if i=SearchDS.Count then iClose=1 else iClose=0
          if IsEmpty(Cond.lAttribID) then lAttribID=0 else lAttribID=Cond.lAttribID
          LSTransaction.Execute(_
            "INSERT INTO lsdbo.aln_misc_LSQueryCond(sNum,bOpen,lType,lValue,lAttribID,Oper,rValue,bClose,Logic,DataType)"+_
            " VALUES("+CStr(i*1000)+","+CStr(Cond.bOpen+iOpen)+",'"+Cond.lType+"','"+Cond.lValue+"',"+_
            CStr(lAttribID)+",'"+Cond.Oper+"','"+PrepareStrValue(Cond.rValue)+"',"+_
            CStr(Cond.bClose+iClose)+",'"+Cond.Logic+"','"+Chr(Cond.DataType)+"')")
        Next
        call LSQuery.CustomWhere("LsObjByAttrib",_
          cLO+"lsdbo.object_reference_view.id in(SELECT id FROM lsdbo.aln_misc_LSQuery())")
      end if
  end if
End Sub
Function PrepareStrValue(str_val)
  str_val=replace(str_val,"'","''")
  str_val=replace(str_val,vbnewline,"\x0D\x0A")
  PrepareStrValue=str_val
End Function
Тексты 2-х поисковых процедур на WatcomSQL:

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

ALTER PROCEDURE "LSDBO"."aln_misc_LSQuery"()
RESULT(id numeric(18))
BEGIN
	declare local temporary table #res(
		sNum integer,
		id numeric(18),
	)not transactional;
	declare @cnt integer;
	declare @sNum1 integer;
	declare @sNum2 integer;
	declare @SNum_res integer;
	declare @lType1 char(1);
	declare @lType2 char(1);
	declare @Logic varchar(20);
	declare @Logic_res varchar(20);
	declare @bOpen_res integer;
	declare @bClose_res integer;
	declare @lAttribID1 numeric(18);
	declare @lAttribID2 numeric(18);
	declare @lValue1 char(1);
	declare @lValue2 char(1);
	declare @rValue1 varchar(255);
	declare @rValue2 varchar(255);
	declare @Oper1 varchar(20);
	declare @Oper2 varchar(20);
	declare @DataType1 char(1);
	declare @DataType2 char(1);

	create index aln_misc_LSQuery_1_ndx on #res(sNum);

select count() into @cnt from lsdbo.aln_misc_LSQueryCond;
if @cnt=1 then
	select max(sNum) into @SNum_res from lsdbo.aln_misc_LSQueryCond;
	select first bOpen,lType,lValue,lAttribID,Oper,rValue,Logic,DataType
			into @bOpen_res,@lType1,@lValue1,@lAttribID1,@Oper1,@rValue1,@Logic,@DataType1
			from lsdbo.aln_misc_LSQueryCond where sNum=@SNum_res;
	insert into #res(sNum,id)
		select @sNum_res,dt1.id from aln_misc_LSQuerySingleSet(@lType1,@lValue1,
						@lAttribID1,@Oper1,@rValue1,@DataType1) as dt1
else
	//Убираем избыточные скобки
	update lsdbo.aln_misc_LSQueryCond set
		bOpen=bOpen-(if bOpen<bClose then bOpen else bClose endif),
		bClose=bClose-(if bOpen<bClose then bOpen else bClose endif)
		where bOpen>0 and bClose>0;
	while exists(select sNum from lsdbo.aln_misc_LSQueryCond where bClose>0)loop
		//Определяем номера условий/множеств
		select min(sNum) into @sNum2 from lsdbo.aln_misc_LSQueryCond where bClose>0;
		select max(sNum) into @sNum1 from lsdbo.aln_misc_LSQueryCond where sNum<@sNum2;		
		set @sNum_res=@sNum1-1;
		select first bOpen,lType,lValue,lAttribID,Oper,rValue,Logic,DataType
			into @bOpen_res,@lType1,@lValue1,@lAttribID1,@Oper1,@rValue1,@Logic,@DataType1
			from lsdbo.aln_misc_LSQueryCond where sNum=@sNum1;
		select first bClose,lType,lValue,lAttribID,Oper,rValue,Logic,DataType
			into @bClose_res,@lType2,@lValue2,@lAttribID2,@Oper2,@rValue2,@Logic_res,@DataType2
			from lsdbo.aln_misc_LSQueryCond where sNum=@sNum2;
		//Обрабатываем связку @cur_sNum и @prev_sNum
		case @Logic
			when 'and' then
				insert into #res(sNum,id)
				  select @sNum_res,dt1.id from
					(select id from aln_misc_LSQuerySingleSet(@lType1,@lValue1,
						@lAttribID1,@Oper1,@rValue1,@DataType1)) as dt1(id)
					join
					(select id from aln_misc_LSQuerySingleSet(@lType2,@lValue2,
						@lAttribID2,@Oper2,@rValue2,@DataType2)) as dt2(id)
					on dt1.id=dt2.id;
			when 'or' then
				insert into #res(sNum,id)
					select @sNum_res,id from aln_misc_LSQuerySingleSet(@lType1,@lValue1,
						@lAttribID1,@Oper1,@rValue1,@DataType1)
					union all
					select @sNum_res,id from aln_misc_LSQuerySingleSet(@lType2,@lValue2,
						@lAttribID2,@Oper2,@rValue2,@DataType2);
			when 'and not' then
				insert into #res(sNum,id)
 				  select @sNum_res,dt1.id from
					(select id from aln_misc_LSQuerySingleSet(@lType1,@lValue1,
						@lAttribID1,@Oper1,@rValue1,@DataType1)) as dt1(id)
					left outer join
					(select id from aln_misc_LSQuerySingleSet(@lType2,@lValue2,
						@lAttribID2,@Oper2,@rValue2,@DataType2)) as dt2(id)
					on dt1.id=dt2.id
					where dt2.id is null;
			when 'or not' then
				insert into #res(sNum,id)
					select @sNum_res,id from aln_misc_LSQuerySingleSet(@lType1,@lValue1,
						@lAttribID1,@Oper1,@rValue1,@DataType1)
					union all
					select @sNum_res,id from object_reference
						where id not in(select id from aln_misc_LSQuerySingleSet(@lType2,@lValue2,@lAttribID2,@Oper2,@rValue2,@DataType2));
		end case;
		//Заменяем обработанные условия/множества полученным результаттом
		insert into lsdbo.aln_misc_LSQueryCond(sNum,lType,lAttribID,bOpen,bClose,Logic)
			values(@sNum_res,'_',@sNum_res,@bOpen_res,@bClose_res,@Logic_res);
		delete from lsdbo.aln_misc_LSQueryCond where sNum in(@sNum1,@sNum2);
		//Убираем избыточные скобки
		update lsdbo.aln_misc_LSQueryCond set
			bOpen=bOpen-(if bOpen<bClose then bOpen else bClose endif),
			bClose=bClose-(if bOpen<bClose then bOpen else bClose endif)
			where bOpen>0 and bClose>0;
	end loop;
end if;
select id from #res where sNum=@sNum_res;
END

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

ALTER PROCEDURE "LSDBO"."aln_misc_LSQuerySingleSet"(in @lType char(1),in @lValue char(1),in @lAttribID numeric(18),
	in @Oper varchar(20),in @rValue varchar(255),in @DataType char(1))
RESULT (id numeric(18))
BEGIN
declare @doc_desc_a numeric(18);
declare @doc_note_a numeric(18);
declare @doc_ver_note_a numeric(18);
set @doc_desc_a=100037395200001;
set @doc_note_a=100037395300001;
set @doc_ver_note_a=100037395400001;

case @lType	
	When 'A' then
	  	case
			When @lAttribID=@doc_desc_a Then
				case @Oper
					when 'exists' then
						select object_reference_id from lsdbo.file1;
					when 'not exists' then
						select o.id from object_reference as o
							left outer join file1 as f on o.id=f.object_reference_id
							where f.object_reference_id is null; 
					when 'like'	then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select object_reference_id from lsdbo.file1 where description like @rValue;
					when 'not like'	Then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select object_reference_id from lsdbo.file1 where description not like @rValue;
					when '=' Then
						select object_reference_id from lsdbo.file1 where description = @rValue;
					when '>' Then
						select object_reference_id from lsdbo.file1 where description > @rValue;
					when '<' Then
						select object_reference_id from lsdbo.file1 where description < @rValue;
					when '>=' Then
						select object_reference_id from lsdbo.file1 where description >= @rValue;
					when '<=' Then
						select object_reference_id from lsdbo.file1 where description <= @rValue;
					when '<>' Then
						select object_reference_id from lsdbo.file1 where description not in(@rValue);
				end case;
			When @lAttribID=@doc_note_a Then
				case @Oper
					when 'exists' then
						select object_reference_id from lsdbo.file1 where note is not null;
					when 'not exists' then
						select object_reference_id from lsdbo.file1 where note is null;
					when 'like'	then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select object_reference_id from lsdbo.file1 where note like @rValue;
					when 'not like'	Then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select object_reference_id from lsdbo.file1 where note not like @rValue;
					when '=' Then
						select object_reference_id from lsdbo.file1 where note = @rValue;
					when '>' Then
						select object_reference_id from lsdbo.file1 where note > @rValue;
					when '<' Then
						select object_reference_id from lsdbo.file1 where note < @rValue;
					when '>=' Then
						select object_reference_id from lsdbo.file1 where note >= @rValue;
					when '<=' Then
						select object_reference_id from lsdbo.file1 where note <= @rValue;
					when '<>' Then
						select object_reference_id from lsdbo.file1 where note not in(@rValue);
				end case;
			When @lAttribID=@doc_ver_note_a Then
				case @Oper
					when 'exists' then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note is not null;
					when 'not exists' then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note is null;
					when 'like'	then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note like @rValue;
					when 'not like'	Then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note not like @rValue;
					when '=' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note = @rValue;
					when '>' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note > @rValue;
					when '<' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note < @rValue;
					when '>=' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note >= @rValue;
					when '<=' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note <= @rValue;
					when '<>' Then
						select f.object_reference_id
							from file_ver as fv join lsdbo.file1 as f on fv.file_id=f.id
							where fv.note not in(@rValue);
				end case;
			Else
				case @Oper
					when 'exists' then
						SELECT object_id as id FROM lsdbo.attrib_value force index(attrib_key1) WHERE attrib_id=@lAttribID;
					when 'not exists' then
						SELECT id FROM lsdbo.object_reference
							WHERE id NOT IN(SELECT object_id FROM lsdbo.attrib_value force index(attrib_key1) WHERE attrib_id=@lAttribID);
					when 'like'	then
						case @DataType
							when 'S' Then
								set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value like @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value like cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value like convert(datetime,@rValue,104);
						end case;
					when 'not like'	Then
						case @DataType
							when 'S' Then
								set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not like @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not like cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not like convert(datetime,@rValue,104);
						end case;
					when '=' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value = @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value = cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value = convert(datetime,@rValue,104);
						end case;
					when '>' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value > @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value > cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value > convert(datetime,@rValue,104);
						end case;
					when '>=' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value >= @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value >= cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value >= convert(datetime,@rValue,104);
						end case;
					when '<' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value < @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value < cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value < convert(datetime,@rValue,104);
						end case;
					when '<=' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value <= @rValue;
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value <= cast(@rValue as double);
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value <= convert(datetime,@rValue,104);
						end case;
					when '<>' Then
						case @DataType
							when 'S' Then
								SELECT av.object_id as id
									FROM lsdbo.value_string as vt force index(attrib_ndx3) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not in(@rValue);
							when 'N' Then
								SELECT av.object_id as id
									FROM lsdbo.value_numeric as vt force index(attrib_ndx7) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not in(cast(@rValue as double));
							when 'T' Then
								SELECT av.object_id as id
									FROM lsdbo.value_datetime as vt force index(attrib_ndx4) JOIN lsdbo.attrib_value as av force index(attrib_value_av_ndx)
										on vt.attrib_id=av.attrib_id and vt.id=av.value_id
									WHERE vt.attrib_id=@lAttribID and vt.value not in(convert(datetime,@rValue,104));
						end case;
				end case;
		end case;
	when 'O' then
		case @lValue
			when 'D' then
				case @Oper
					when 'exists' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description>'';
					when 'not exists' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description='';;
					when 'like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description like @rValue;
					when 'not like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description not like @rValue;
					when '=' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description = @rValue;
					when '>' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description > @rValue;
					when '>=' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description >= @rValue;
					when '<' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description < @rValue;
					when '<=' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description <= @rValue;
					when '<>' then
						SELECT id FROM lsdbo.object_reference force index(object_reference_desc_ndx) where description not in(@rValue);
				end case;
			when 'T' then
				case @Oper
					when 'exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description > '';
					when 'not exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description='';;
					when 'like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description like @rValue;
					when 'not like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description not like @rValue;
					when '=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description = @rValue;
					when '>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description > @rValue;
					when '>=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description >= @rValue;
					when '<' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description < @rValue;
					when '<=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description <= @rValue;
					when '<>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.description not in(@rValue);
				end case;
			when 'M' then
				case @Oper
					when 'exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo > '';
					when 'not exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo='';;
					when 'like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo like @rValue;
					when 'not like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo not like @rValue;
					when '=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo = @rValue;
					when '>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo > @rValue;
					when '>=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo >= @rValue;
					when '<' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo < @rValue;
					when '<=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo <= @rValue;
					when '<>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.mnemo not in(@rValue);
				end case;
			when 'C' then
				case @Oper
					when 'exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type > '';
					when 'not exists' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type='';;
					when 'like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type like @rValue;
					when 'not like' then
						set @rValue=(if coalesce(right(@rValue,1),'')<>'%' then @rValue+'%' else @rValue endif);
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type not like @rValue;
					when '=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type = @rValue;
					when '>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type > @rValue;
					when '>=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type >= @rValue;
					when '<' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type < @rValue;
					when '<=' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type <= @rValue;
					when '<>' then
						SELECT o.id	FROM lsdbo.object_type as ot JOIN lsdbo.object_reference as o force index(object_reference)
							on ot.id=o.type_id where ot.object_type not in(@rValue);
				end case;
		end case;
	when '_' then
		select id from #res where sNum=@lAttribID;
end case;
END
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Поиск по описаниям и примечаниям документов и версий

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

Слушай -если не трудно - покажи картинку - как выглядит это самое стандартное окно поиска - применительно к твоему поиску.
Мы никогда не использовали - но что то подсказывает что в этом что-то есть быть может :wink:
хочу просто понять по картинке - в чем преимущества стандартного окна поиска - против альтернативного поиска на отчетах...
в плане того
- это поиск в текущем дереве проекта? или по всей базе?
- этот поиск вызывается кнопкой Лоции 'Найти' или чем то другим?
- этот поиск подсвечивает найденные дочерние элементы в дереве? или нет?
- насколько этот поиск быстрый ... или медленный... ?

если не трудно... просто для информации

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

Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

Вот пример:
Поиск по примечанию документа.PNG
Поиск по примечанию документа.PNG (20.01 КБ) 48931 просмотр
Будут отобраны объекты по значению атрибута "Первичное применение" и по примечаниям подключенным к этим объектам документов.

Ресурсоемкость поиска зависит от количества документов и указываемых значений.
У нас сейчас в базе меньше 100 тыс. документов (пока немного), отрабатывает очень быстро (для того и добавлял индексы).

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

Re: Поиск по описаниям и примечаниям документов и версий

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

понятно, спасибо...
я просто подумал что твой поиск нарисован на Cтандартной пользовательской форме поиска Лоции - отсюда и были вопросы
т.е. интересовал 'дружественный' интерфейс поиска средствами Лоции (диалоговое окно, с выпадающими списками, полями, переключателями и т.д.)...
ясно - для наших юзеров это не прокатит - слишком сложно по части интерфейса для нашей политики работы по 'одной кнопке'

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

Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

Во-первых можно и так:
Поиск по примечанию документа (форма).PNG
Поиск по примечанию документа (форма).PNG (15.99 КБ) 48923 просмотра
Во-вторых в действии над объектами можно слепить любую форму в которой указываются поисковые значения, а потом на следующем шаге запустить стандартный поиск (не забыв правильно настроить условия отбора для объектной переменной).
В свое время я тоже баловался поиском через отчеты, но уж больно трудоемкий это процесс (создание отчетов)...
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Александр
Активный участник
Сообщения: 1652
Зарегистрирован: 24 авг 2006, 08:06
Используемое ПО: Lotsia PDM PLUS
Откуда: 55.745578,37.665825

Re: Поиск по описаниям и примечаниям документов и версий

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

убедил!
тогда такой вопрос - итоговую форму с найденными данными можно ли показать в 'приличном' виде
- в виде выпадающего списка формы действия
- в виде отдельного окна выпадающего списка действия с возвратом на шаг критериев
в плане того чтобы юзер на следующем шаге после ввода критериев - увидел 'чистое' окно данных:
- с нужными колонками, без лишних закладок и правых кнопок?
это с одной стороны для Patry
а с другой для вызова из меню
можно ли это оформить - как на твоей картинке но опять же без лишних закладок и правых кнопок - т.е. вызывается чистое окно критериев и по 'ок' получаем чистое окно данных (как в отчетах но уже с нормальными габаритами формы как я понял)

я просто смотрю на лишние элементы интерфейса - а так вроде все круто

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

Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

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

Re: Поиск по описаниям и примечаниям документов и версий

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

ну в общем да все так, просто хотел понять визуальные возможности Лоции в этом плане, про сами скрипты вопросов нет.

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

Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Старик Крупский »

to Disillusioned: я сам далек от программирования и составления сложных SQL-запросов. Но, по-моему, у вас проделана колоссальная работа по настройке поиска. Браво, маэстро!
"Лучше меньше, да лучше" (C)
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

Недавно расширил возможности поиска объектов. Добавил поиск по диапазону значений.
Вложения
r_search.GIF
r_search.GIF (36.56 КБ) 47779 просмотров
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Старик Крупский »

Поле "До" - это фиктивный атрибут только для поиска?
"Лучше меньше, да лучше" (C)
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

При поиске по диапазону используются 3 атрибута (все фиктивные для поиска).
В первом указываем код атрибута для которого ищем по диапазону. В двух других указываем границы диапазона. Потом в настройках поиска подменяем для границ диапазона код атрибута и условия ><. Затем условиe, где задан код атрибута удаляем.
З.Ы. Такой поиск можно настроить только через действие над объектами.
З.З.Ы. Аналогично реализуется поиск на принадлежность искомого значения диапазону, определенному двумя атрибутами.
Вложения
r_search.PNG
r_search.PNG (17.78 КБ) 47777 просмотров
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Старик Крупский »

Ух ты... Настоящее ноу-хау! Я тоже так попробую!
"Лучше меньше, да лучше" (C)
Аватара пользователя
Disillusioned
Активный участник
Сообщения: 420
Зарегистрирован: 15 июл 2004, 15:12
Используемое ПО: Lotsia PDM PLUS
Откуда: Подольск
Контактная информация:

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Disillusioned »

Ноу-хау - это информация, которую скрывают. Если выложили на форуме - это уже не ноу-хау... :D
Ах и с ними невозможно
И без них никак нельзя
Аватара пользователя
Старик Крупский
Активный участник
Сообщения: 803
Зарегистрирован: 27 июл 2006, 22:17
Откуда: Москва

Re: Поиск по описаниям и примечаниям документов и версий

Сообщение Старик Крупский »

:wink:
"Лучше меньше, да лучше" (C)
Ответить