Сегодняшний выпуск - ваши отклики. В одном из выпусков я писал про 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)
ASBEGIN-- Функция преобразует фильтр 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
ENDEND
-- Заменяем 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,'='))
ENDENDEND-- Заменяем .. на 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)
ENDENDEND
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.