AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.01.2008, 16:02   #1  
ekya is offline
ekya
Участник
 
16 / 10 (1) +
Регистрация: 14.05.2007
Всем доброго времени суток.

Есть ли у кого нить функция на вход которой подаеться строка с фильтром в формате Nav (field1 3|6..10), а на выходе строка в формате SQL ( '(field1=(3) or field1=(6 between 10)' )?

Заранее Огромное Спасибо!
Старый 28.01.2008, 08:47   #2  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
Немного конечно через зад, но работает
Код:
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  
ekya is offline
ekya
Участник
 
16 / 10 (1) +
Регистрация: 14.05.2007
Спасибо, попробую!
Старый 12.02.2008, 17:43   #4  
ekya is offline
ekya
Участник
 
16 / 10 (1) +
Регистрация: 14.05.2007
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  
grif is offline
grif
Участник
Аватар для grif
 
236 / 10 (1) +
Регистрация: 31.08.2006
% Any string of zero or more characters.
_ (underscore) Any single character.

'_' - это маска LIKE. Забыл сделать проверку на этот символ в имени переменной
Можно вместо @var везде в теле вставлять какой-то текст типа '[#VAR#]', а потом в самом конце только заменить это на то что в @var
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:04.