|  23.01.2008, 16:02 | #1 | 
| Участник | 
			
			Всем доброго времени суток. Есть ли у кого нить функция на вход которой подаеться строка с фильтром в формате Nav (field1 3|6..10), а на выходе строка в формате SQL ( '(field1=(3) or field1=(6 between 10)' )? Заранее Огромное Спасибо! | 
|  | 
|  28.01.2008, 08:47 | #2 | 
| Участник | 
			
			Немного конечно через зад, но работает Код: ALTER					FUNCTION [dbo].[f_filter_convert]
   (@var	varchar(20),
	@cd		varchar(250))
 RETURNS varchar(1024)
AS BEGIN
  --функция преобразует фильтр Navision в операторы SQL для использования в WHERE
  DECLARE @str varchar(1024);
  DECLARE @i int, @pos int, @pos2 int;
  DECLARE @tmp varchar(250);
  IF @cd = '' RETURN @var+' LIKE ''%''';	
  SET @str = @cd;
  SET @str = REPLACE(@str,'%','[%]');
  SET @str = REPLACE(@str,'_','[_]');
  SET @str = REPLACE(@str,'*','%');
  SET @str = REPLACE(@str,'?','_');
  SET @str = REPLACE(@str,'|',''' OR '+@var+' LIKE ''')
  SET @str = REPLACE(@str,'&',''' AND '+@var+' LIKE ''')
  SET @str = @var+' LIKE '''+@str+''''
  SET @str = REPLACE(@str,')''',''')')
  WHILE CHARINDEX(@var+' LIKE ''(',@str) <> 0
	SET @str = REPLACE(@str,@var+' LIKE ''(','('+@var+' LIKE ''')
  SET @str = REPLACE(@str,'LIKE ''<>','NOT LIKE ''')
  --Заменяем NOT LIKE на <>, если нет масок % и _
  SET @i  = 1
  SET @pos = 0
  WHILE @i <> 0
  BEGIN
	SET @i = CHARINDEX('NOT LIKE ''',@str,@pos)
	IF @i <> 0
	BEGIN
	  SET @pos = CHARINDEX('''',@str,@i+10)
	  SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) 
	  IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0
	  BEGIN
		SET @str = STUFF(@str,@i,@pos-@i+1,STUFF(@tmp,1,9,'<>'))
	  END
	END
  END
  --Заменяем LIKE на =, если нет масок % и _
  SET @i  = 1
  SET @pos = 0
  WHILE @i <> 0
  BEGIN
	SET @i = CHARINDEX('LIKE ''',@str,@pos)
	IF @i <> 0
	BEGIN
	  SET @pos = CHARINDEX('''',@str,@i+6)
	  SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) 
	  IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0
	  BEGIN
		SET @str = STUFF(@str,@i,@pos-@i+1,STUFF(@tmp,1,5,'='))
	  END
	END
  END
  --Заменяем .. на BEETWEEN AND, если нет LIKE
  SET @i  = 1
  SET @pos = 0
  WHILE @i <> 0
  BEGIN
	SET @i = CHARINDEX(@var+' =''',@str,@pos)
	IF @i <> 0
	BEGIN
	  SET @pos = CHARINDEX('''',@str,@i+LEN(@var)+3)
	  SET @tmp = SUBSTRING(@str,@i,@pos-@i+1) 
	  SET @pos2 = CHARINDEX('..',@tmp)
	  IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 AND @pos2 <> 0
	  BEGIN
		SET @tmp = @var+' BETWEEN '+SUBSTRING(@tmp,LEN(@var)+3,@pos2-LEN(@var)-3)+''' AND '''+SUBSTRING(@tmp,@pos2+2,LEN(@tmp))
		SET @str = STUFF(@str,@i,@pos-@i+1,@tmp)
	  END
	END
  END
  RETURN(@str);
END | 
|  | 
|  29.01.2008, 22:00 | #3 | 
| Участник | 
			
			Спасибо, попробую!
		 | 
|  | 
|  12.02.2008, 17:43 | #4 | 
| Участник | 
			
			to grif все работает отлично, только одно НО. зачем в условии IF CHARINDEX('%',@tmp) = 0 AND CHARINDEX('_',@tmp) = 0 AND @pos2 <> 0, где заменяем ".." на between AND CHARINDEX('_',@tmp) = 0? Возникла ситуация, при которой я передаю первым параметром значение [G_L Account No_] и фильтр "10..12", при этом "between" не ставиться. | 
|  | 
|  13.02.2008, 08:56 | #5 | 
| Участник | 
			
			% Any string of zero or more characters.  _ (underscore) Any single character. '_' - это маска LIKE. Забыл сделать проверку на этот символ в имени переменной  Можно вместо @var везде в теле вставлять какой-то текст типа '[#VAR#]', а потом в самом конце только заменить это на то что в @var | 
|  |