Отправляет email-рассылки с помощью сервиса Sendsay

Navision - советы и секреты

  Все выпуски  

Navision - советы и секреты


Добрый день!

Сегодняшний выпуск - ваши отклики. В одном из выпусков я писал про SQL+ADO как адекватную замену громоздким конструкциям навижн. Вот что мне пишут:

Андрей все замечательно расписано!

К сказаному хочется добавить одну фичу:

1. Иногда запрос возвращает достаточно большое количество записей. В этом случае копирование во временную таблицу достаточно ресурсоемкая и долгая процедура. Выход есть - выводить источником формы пустую таблицу и "обманывать" Нав на триггерах Find и Next формы. Более того - в этом случае достаточно просто отследить наложение фильтров на таблицу Нав и преобразовать их в Having или Where условие SQL-запроса.

Это очень ценное замечание. Приведенный вариант еще более гибок + не тратится время на первоначальный запрос и заполнение временной таблицы. Обратным эффектом можно считать смещение ставшего уже классическим баланса времени между работой пользователя и работой системы.
Т.е. в предложенном решении время заполнения таблицы "размазывается" по времени работы пользователя.

Каким должен быть баланс - зависит от конкретной задачи, тяжести базы, сложности запросов. Среди минусов решения можно назвать невозможность редактирования таблицы (для дальнейшей обработки, например), сложности с наложением марков по Ctrl+F1.

Решать Вам :)

По поводу преобразования фильтра поля в условие SQL-запроса - Петр "grif" Иванов (grif@bk.ru) любезно разрешил нам опубликовать его собственную функцию по преобразованию фильтра NAV в SQL. Вот она:

CREATE FUNCTION dbo.Fn_Filter_Convert (@variable  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);
  DECLARE @var varchar(100)

  IF @cd = '' RETURN @variable + ' LIKE ''%'''      
  
  SET @var = '[#VAR#]'
  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

  SET @str = REPLACE(@str, '#VAR#', @variable)
  
  RETURN(@str)
END

Ах, да, еще один неочевидный плюс - это единственная схема работы с SQL, когда на форме имеется MatrixBox. Так что его обязательно надо освоить и уметь применить.

P.S. Хотите поделиться своими знаниями? Всегда Welcome! Любые статьи, Q & A, FAQ, советы - все опубликуем, обязательно укажем автора и дадим линк на сайт :-)

С наилучшими пожеланиями,
Андрей Стрельников.

Группа «Technologies like Art».
Разработки в сфере Navision. Скоростные и суперскоростные оптимизации, системная интеграция.
e-mail: likeart@mail.ru.

Технологии как искусство.
----
Что такое главное?


В избранное