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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2011, 15:28   #1  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Запускаю отчет. В Параметрах отчета программно формируется фильтр "все склады".

Нав почти сразу выдает сообщение об ошибке:
"Фильтр
BAS7|SAS7|SRT4|TTR4|БРАК04|РВОЗВРАТ|БУТИК01|БУТИК16|БУТИК20|БУТИК22|БУТИК23|БУТИК25|БУТИК26|БУТИК27|БУТИК28|БУТИК29|БУТИК37|БУТИК38|БУТИК39|БУТИК44|БУТИК54|БУТИК61|БУТИК75|БУТИК77|БУТИК80|БУТИК82|БУТИК97|БУТИК98|БУТИК102|БУТИК111|БУТИК112|БУТИК123|БУРННГ01|БУТИК36|БУРРОС01|БУТИК42|БУРПЕТ03|БУРННГ02|БУРПЕТ07|БУРЕКБ01|БУРПЕТ04|БУРСАМ01|БУРКРАСН02|БУРКАЗ03|БУРПЕТ06|БУРПЕТ05|БУРСАМ03|БУРНСБ01|БУРРОС02|БУРЯРЛ01|БУРКЕМ01|БУРПЕТ08|БУРАЛМ01|БУРСАМ02|БУРНЧЛ01|БУРКРАСН03|БУРИЖ01|БУРКРК01|БУРКОС01|БУРИЖ02|БУРЕКБ02|БУРОМСК01|БУРРОС03|БУРКРАСН04|БУРЕКБ03|БУРПЕТ09|БУРНВР01|БУРПЕТ11|БУРБЛГ01|БУРВОЛ02|БУРСАР01|БУРПЕТ10|БУРВРЖ01|БУРНСБ02|БУРВРЖ02|БУРЛИП01|БУРОРБ01|БУРСРГ01

Фильтр в поле Location Filter в таблице Группа Товара слишком большой"

Вот этот большой текст "BAS7|SAS7|SRT4|TTR4|БРАК04...." это переменная типа Текст длиной 1024. В этом отчете ее значение имеет длину 688. Если убирам один склад, то отчет не выдает ошибку. Поле Location Filter типа FlowFilter. Версия Нава 3.10, 5 сервиспак.

Есть предположение, что для фильтров есть ограничение длины. Прежде чем переделывать наши отчеты (тихий ужас) хотелось бы узнать: действительно есть такое ограничение? В доках по Наву ничего на эту тему не нашла.
Старый 07.02.2011, 15:33   #2  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Ограничение совершенно точно есть, но вот точную цифру не скажу. Да и она может зависеть от версии.
Старый 07.02.2011, 15:38   #3  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
А как можно принципиально переделать механизм фильтрации?

У нас все отчеты по такому принципу. И количество магазинов растет. Я создала два очередных магазина в системе и ..получила ошибку.

Ведь если число магазинов растет, то и фильтр будет расти

Хочется определиться с методами возможной переделки, прежде чем начинать переписывать отчеты.
Старый 07.02.2011, 15:44   #4  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
ну можно оптимизировать коды и саму строку фильтра
например БУТИК25|БУТИК26|БУТИК27|БУТИК28|БУТИК29| можна заменить на БУТИК25..БУТИК29
Отсортируйте коды и старайтесь работать с диапазонами.
__________________
Want to believe...
Старый 07.02.2011, 15:50   #5  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Оптимизировать строку фильтра не получится (только частично если), потому что не везде коды БУТИК.. Таковы принципы формирвоания кода в карточке. Это ненадолго нас спасет. И учитывая, что все равно переделывать ...

Надо оптимизировать код отчета.

Наверняка, есть какой-то подход к решению этой проблемы.
Старый 07.02.2011, 15:59   #6  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Цитата:
Сообщение от mira Посмотреть сообщение
Запускаю отчет. В Параметрах отчета программно формируется фильтр "все склады".
Ну если ВСЕ склады то тогда фильтр то не надо ставить думаю???? Просто пустое поле

Возможен вариант исключающего фильтра если склады почти все кроме некоторых
Старый 07.02.2011, 16:06   #7  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Склады НЕ ВСЕ, а в соответсвии с некоторыми условиями. Вернее, для пользователя "все".

В таблице складов по сути есть склады и магазины. Но некоторые склады и магазины закрыты, а некоторые уже созданы, но не открыты. Магазин открывается, смотрится его прибыльность, магазин закрывается ... Нормальная ситуация.
Поэтому фильтр - список магазинов зависит от периода отчета. В фильтр попадают только те склады, которые работали в период отчета. Те, которые еще не открылись (а у нас по году открываются) или уже закрылись в фильтр не попадают.

Еще один признак при программном формировании фильтра: только склады или только магазины. Фильтр "только магазины" .. через 6 месяцев станет длиннее 680 символов.

Исключающий фильтр - вариант!
Но пользователь имееет возможность изменить фильтр. Т.е. программное формирование фильтра - это сервис. А если делать исключающий фильтр, то у пользователя придется отобрать право редактировать фильтр отчета. Это не очень хорошо - придется потом с юзерами няньчится и вникать, какие фильтры им нужны сегодня.
Старый 07.02.2011, 16:12   #8  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Цитата:
Сообщение от mira Посмотреть сообщение
Склады НЕ ВСЕ, а в соответсвии с некоторыми условиями. Вернее, для пользователя "все".

Еще один признак при программном формировании фильтра: только склады или только магазины. Фильтр "только магазины" .. через 6 месяцев станет длиннее 680 символов.
Я бы добавил в таблицу складов галочку - магазин и обходил бы по циклу
Старый 07.02.2011, 16:14   #9  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
А что у вас за поле Location Filter в таблице Группа Товара? Какой оно длины? При наложении фильтра вы пишете SETFILTER или SETRANGE?
Старый 07.02.2011, 16:35   #10  
Romul is offline
Romul
Участник
 
186 / 11 (1) +
Регистрация: 26.12.2007
Цитата:
Сообщение от mira Посмотреть сообщение
А как можно принципиально переделать механизм фильтрации?

У нас все отчеты по такому принципу. И количество магазинов растет. Я создала два очередных магазина в системе и ..получила ошибку.

Ведь если число магазинов растет, то и фильтр будет расти

Хочется определиться с методами возможной переделки, прежде чем начинать переписывать отчеты.
Я в подобных случаях использую темповые рекорды. Там, где наложение гигантского фильтра неприемлемо и можно немного потерять на производительности посредством прямого сравнения обрабатываемого в данный момент кода склада с массивом складом в темповом рекорде (этих массивов может быть много, в зависимости от того, какой из них отвечает тем или иным условиям) - используйте эту технику. Не слишком эстетично, не спорю, но спасало много-много раз...
Не формируйте фильтр в параметрах отчета. Попробуйте использовать FILTERGROUP в период выполнения...
Старый 07.02.2011, 17:00   #11  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Цитата:
Сообщение от Orwell Посмотреть сообщение
Я в подобных случаях использую темповые рекорды. Там, где наложение гигантского фильтра неприемлемо и можно немного потерять на производительности посредством прямого сравнения обрабатываемого в данный момент кода склада с массивом складом в темповом рекорде (этих массивов может быть много, в зависимости от того, какой из них отвечает тем или иным условиям) - используйте эту технику. Не слишком эстетично, не спорю, но спасало много-много раз...
Не формируйте фильтр в параметрах отчета. Попробуйте использовать FILTERGROUP в период выполнения...
Orwell, пжл, скажите пару слов о логике такого решения. Темповые рекорды используем. Даже многомерные.
Но я не соображу сходу как их "скрестить" с фильтрами ...
Как темповый рекорд позволяет обойти использование длинного фильтра? Возможно, где-то это описывалось?

Наверно, ваше предложение это то, что надо.
Старый 07.02.2011, 17:03   #12  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Цитата:
Сообщение от Milk Посмотреть сообщение
А что у вас за поле Location Filter в таблице Группа Товара? Какой оно длины? При наложении фильтра вы пишете SETFILTER или SETRANGE?
Поле Location Filter типа FlowFilter. Location Code типа Code длина 10.

Ошибка возникает на операторе
IF txtLocFilter<>'' THEN
"Item Group".SETFILTER("Item Group"."Location Filter",txtLocFilter);

где txtLocFilter тот самый длинный фильтр.
Старый 07.02.2011, 17:07   #13  
Romul is offline
Romul
Участник
 
186 / 11 (1) +
Регистрация: 26.12.2007
Цитата:
Сообщение от mira Посмотреть сообщение
Orwell, пжл, скажите пару слов о логике такого решения. Темповые рекорды используем. Даже многомерные.
Но я не соображу сходу как их "скрестить" с фильтрами ...
Как темповый рекорд позволяет обойти использование длинного фильтра?
Temp1: Белый, Синий, Зеленый, Голубой, Оранжевый..... и так еще 100 складов - склады, по которым оборот 3 млн.
Temp2: Черный, Красный, Белый..... и так еще 150 складов, которые вполне пересекаются с Temp1, но составляют свой массив складов - оборот по которым минимум 2 млн.
Предварительно выполнив выборку нужных складов по разным кейсам, можете составить десяток-другой таких темповых "массивов". И используйте их в дальнейше логике, сравнивая с обрабатываемыми данными. Ибо фильтр из 150 складов вам выдаст ошибку. А сравнение с предварительным набором складов, отобранных по той же самой логике, ошибки не выдаст.
Я может что-то недопонял в вашей проблеме, но вы filtergroup использовать не пробовали?
Старый 07.02.2011, 17:08   #14  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Цитата:
Сообщение от IGHG Посмотреть сообщение
Цитата:
Сообщение от mira Посмотреть сообщение
Склады НЕ ВСЕ, а в соответсвии с некоторыми условиями. Вернее, для пользователя "все".

Еще один признак при программном формировании фильтра: только склады или только магазины. Фильтр "только магазины" .. через 6 месяцев станет длиннее 680 символов.
Я бы добавил в таблицу складов галочку - магазин и обходил бы по циклу
Есть такая галочка. Но это не спасет ни сейчас, ни в дальнейшем.
Пользователь может выбрать для отчета любой набор складов (складов и \или магазинов)для отчета. И максимальное их количество (условно "все") для ежемесячной отчетности уже за пределами ограничения 680 символов.

Тут надо менять подход. Любые временные меры - только временные затраты.
Старый 07.02.2011, 17:13   #15  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Цитата:
Сообщение от Orwell Посмотреть сообщение
Я может что-то недопонял в вашей проблеме, но вы filtergroup использовать не пробовали?
Я не совсем поняла, как его использовать. Ведь он используется для ограничения снятия фильтров пользователем?
Т.е. я программно накладываю фильтры (например, в целях безопасности) и юзер не может их отменить и заглянуть дальше, чем ему разрешено... Например.. Так?
Т.е. filtergroup испольуется если есть иерархия фильтров: фильтра разработчика, фильтры юзера ...

А как мне это поможет? У меня один "одноранговый" длииииииинный фильтр
Как я его по группам раскидаю? И зачем?
Старый 07.02.2011, 17:18   #16  
mira is offline
mira
Участник
Аватар для mira
 
140 / 25 (1) +++
Регистрация: 18.03.2007
Адрес: Москва
Цитата:
Сообщение от Orwell Посмотреть сообщение
Temp1: Белый, Синий, Зеленый, Голубой, Оранжевый..... и так еще 100 складов - склады, по которым оборот 3 млн.
Temp2: Черный, Красный, Белый..... и так еще 150 складов, которые вполне пересекаются с Temp1, но составляют свой массив складов - оборот по которым минимум 2 млн.
Предварительно выполнив выборку нужных складов по разным кейсам, можете составить десяток-другой таких темповых "массивов". И используйте их в дальнейше логике, сравнивая с обрабатываемыми данными. Ибо фильтр из 150 складов вам выдаст ошибку. А сравнение с предварительным набором складов, отобранных по той же самой логике, ошибки не выдаст.
Я может что-то недопонял в вашей проблеме, но вы filtergroup использовать не пробовали?
Т.е. я разделяю фильтр пользователя на куски длинной меньше 680 символов.
Отрабатываю каждый "подфильтр" и запихиваю результаты в темпы.
Потом из разных темпов сливаю в отчет.
Так?

Orwell, это непохоже на какое-то принципиально иное решение, которое "не видит" длины фильтра. А я надеялась))) Получается, у нас болезнь роста. Надо делать тоже самое, что делали раньше, только два раза..потом три раза ..

Спасибо за совет!
Старый 07.02.2011, 22:40   #17  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от mira Посмотреть сообщение
Ошибка возникает на операторе
IF txtLocFilter<>'' THEN
"Item Group".SETFILTER("Item Group"."Location Filter",txtLocFilter);

где txtLocFilter тот самый длинный фильтр.
Попробуйте:
Код:
"Item Group".SETFILTER("Location Filter",STRSUBSTNO('%1',txtLocFilter));
На вид одно и то же, но я по опыту знаю, что SETFILTER иногда совсем необъяснимо глючит и меня часто выручал STRSUBSTNO.
Старый 07.02.2011, 23:22   #18  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
решение с filtergroup - респектище!

filtergroup(2);
setrange("Location Filter",txtFilter[1]);
filtergroup(3);
setrange("Location Filter",txtFilter[2]);
filtergroup(4);
setrange("Location Filter",txtFilter[3]);
filtergroup(5);
setrange("Location Filter",txtFilter[4]);
...

в каждом txtFilter набор складов длинной не более 500 символов, например.
сначала создаете тексты разного набора складов, потом по очереди разным группам их скармливаете как фильтр!
на ближайшие лет 5 такого решения хватит...
Старый 07.02.2011, 23:26   #19  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
а более грамотно будет, имхо, найти какой-то определяющий признак для каждого склада: это будет опшн (склад/магазин/прочее) или код на основе интежера (10 - склады, 20 - магазины, 25 - магазины без склада, например) и этот признак протащить в ОПЕРАЦИИ. вы же операции фильтруете?
Старый 08.02.2011, 03:06   #20  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Sancho Посмотреть сообщение
а более грамотно будет, имхо, найти какой-то определяющий признак для каждого склада: это будет опшн (склад/магазин/прочее) или код на основе интежера (10 - склады, 20 - магазины, 25 - магазины без склада, например) и этот признак протащить в ОПЕРАЦИИ. вы же операции фильтруете?
Или попытаться ввести "группировку" типа "группового кода".
 


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

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

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