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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.05.2008, 15:37   #1  
ivanovax is offline
ivanovax
Участник
 
3 / 10 (1) +
Регистрация: 01.03.2006
Здравствуйте.

Сначала хочу рассказать, как проявляется данная ошибка:

1. Берем стандартный Navision на SQL, версия любая. У нас 3.60.04, с клиентом 3.70, но это не имеет значения, пробовал и на 4.0 sp3. В таблице G/L Entry, у ключей должен быть включен MaintainSIFTIndex, т.е. должна быть включена поддержка SIFT (по умолчанию все включено).

2. Берем любое глобальное измерение и добавляем ему значения:
VALUE1
VALUE2
VALUE3
VALUE4
VALUE5
VALUE6

3. В фин. журнале делаем 2 проводки по 2-м любым фин. счетам, одну со значением измерения VALUE5, а другую с VALUE6.

4. Открываем план счетов и ставим по выбранному глобальному измерению следующий FlowFilter:
(VALUE4|VALUE1)&(VALUE5|VALUE2..VALUE3)
Согласно логике это выражение дает пустой результат, однако смотрим на план счетов. В нем присутствует сумма из нашей проводки с VALUE5.

5. Открываем план счетов и ставим по выбранному глобальному измерению следующий FlowFilter:
(VALUE4|VALUE1|VALUE6)&(VALUE6|VALUE5|VALUE2..VALUE3)
Согласно логике это выражение должно отобрать все фин. операции с о значением измерения VALUE6 однако смотрим на план счетов. В суммах учтены проводки со значениями VALUE6 и VALUE5.

Выяснилось что таких выражений FlowFilter, при которых в плане счетов показываются неверные суммы можно подобрать много, может быть очень много.
В файловой версии все работает правильно. Если в SQL версии в таблице G/L Entry у ключей отключить MaintainSIFTIndex то опять работает правильно, но очень медленно (если база большая). Перегенерация SIFT индексов ошибку не исправляет.
Оба правильно работающих варианта не устраивают, нужен полноценный SQL c поддержкой SIFT, поскольку нужна скорость вычислений и SQL для интеграции с другими системами.

Почему у нас используются такие выражения во FlowFilter:
У нас переписаны фин. отчеты, фильтры глобальных измерений можно задавать и в строках и в столбцах. Результат показываемый в ячейках, есть множество операций попадающих под пересечение фильтров строк и столбцов. Т.е. по сути дела для каждой ячейки динамически формируется собственный уникальный фильтр, в том числе он может оказаться и таким как в примере выше. Из-за данной ошибки, фрагментарно, в некоторых ячейках отчетов оказываются суммы, которых быть не должно вообще т.к. результат пересечения фильтров пустое множество (как в 4 пункте моего примера) или они добавляются к реально существующим суммам (как в 5 пункте моего примера).

Насколько я смог понять, когда SIFT технология используется в SQL версии, клиент Navision пытается проанализировать и вычислить результат логического выражения представленного в фильтре. Таким образом, создатели Navision видимо хотели упростить и сократить кол-во SQL запросов, которые клиент потом делает к базе данных. Так вот похоже, что решение логического выражения клиент Navision иногда находит неправильно, ошиблись ребята где-то.

Если посмотреть под MS SQL Profiler какой SQL запрос Navision делает к серверу, то можно понять что результатом выражения FlowFilter приведенного в 4 пункте моего примера он считает значение VALUE5, т.е. он выбирает все операции только с данным значением аналитики.
Для выражения из 5 пункта моего примера SQL запрос делается для аналитик VALUE6 и VALUE5.

СТАЛКИВАЛСЯ ЛИ КТО-НИБУДЬ С ПОДОБНОЙ ПРОБЛЕМОЙ? ЕСТЬ ЛИ ЕЕ РЕШЕНИЕ ИЛИ ПУТИ ОБХОДА? ЗАРАНЕЕ БАГОДАРЕН ЗА ПОМОЩЬ.
Старый 21.05.2008, 16:02   #2  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Ivanov Посмотреть сообщение
4. Открываем план счетов и ставим по выбранному глобальному измерению следующий FlowFilter:
(VALUE4|VALUE1)&(VALUE5|VALUE2..VALUE3)
Согласно логике это выражение дает пустой результат, однако смотрим на план счетов. В нем присутствует сумма из нашей проводки с VALUE5.
Согласно работе SQL мы получим VALUE5, так как он работает с "пересечением множеств", а не Логическому И.
Поэтому вполне правильно, по моему мнению, такой результат.
Цитата:
5. Открываем план счетов и ставим по выбранному глобальному измерению следующий FlowFilter:
(VALUE4|VALUE1|VALUE6)&(VALUE6|VALUE5|VALUE2..VALUE3)
Согласно логике это выражение должно отобрать все фин. операции с о значением измерения VALUE6 однако смотрим на план счетов. В суммах учтены проводки со значениями VALUE6 и VALUE5.
Правильно он выдает.
Цитата:
СТАЛКИВАЛСЯ ЛИ КТО-НИБУДЬ С ПОДОБНОЙ ПРОБЛЕМОЙ? ЕСТЬ ЛИ ЕЕ РЕШЕНИЕ ИЛИ ПУТИ ОБХОДА? ЗАРАНЕЕ БАГОДАРЕН ЗА ПОМОЩЬ.
Строить фильтрацию таким образом, чтобы избегать пересечений. Сам то такого не умею, но когда-то учили по купсу автоматики.
Старый 24.05.2008, 00:31   #3  
ivanovax is offline
ivanovax
Участник
 
3 / 10 (1) +
Регистрация: 01.03.2006
Цитата:
Сообщение от RedFox Посмотреть сообщение
Согласно работе SQL мы получим VALUE5, так как он работает с "пересечением множеств", а не Логическому И.
Поэтому вполне правильно, по моему мнению, такой результат.
В выражении (VALUE4|VALUE1)&(VALUE5|VALUE2..VALUE3) у нас два множества:
{VALUE4,VALUE1} и {VALUE5,VALUE2,VALUE3}. И c чего Вы решили что их пересечением является VALUE5?
Старый 29.05.2008, 01:14   #4  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Ivanov Посмотреть сообщение
В выражении (VALUE4|VALUE1)&(VALUE5|VALUE2..VALUE3) у нас два множества:
{VALUE4,VALUE1} и {VALUE5,VALUE2,VALUE3}. И c чего Вы решили что их пересечением является VALUE5?
Старый 03.07.2008, 15:08   #5  
ivanovax is offline
ivanovax
Участник
 
3 / 10 (1) +
Регистрация: 01.03.2006
Данная ошибка исправлена в Navision 5.0 SP1. Тема закрыта, всем спасибо.
 


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

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

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