07.02.2011, 15:28 | #1 |
Участник
|
Запускаю отчет. В Параметрах отчета программно формируется фильтр "все склады".
Нав почти сразу выдает сообщение об ошибке: "Фильтр 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 |
Участник
|
Ограничение совершенно точно есть, но вот точную цифру не скажу. Да и она может зависеть от версии.
|
|
07.02.2011, 15:38 | #3 |
Участник
|
А как можно принципиально переделать механизм фильтрации?
У нас все отчеты по такому принципу. И количество магазинов растет. Я создала два очередных магазина в системе и ..получила ошибку. Ведь если число магазинов растет, то и фильтр будет расти Хочется определиться с методами возможной переделки, прежде чем начинать переписывать отчеты. |
|
07.02.2011, 15:44 | #4 |
Участник
|
ну можно оптимизировать коды и саму строку фильтра
например БУТИК25|БУТИК26|БУТИК27|БУТИК28|БУТИК29| можна заменить на БУТИК25..БУТИК29 Отсортируйте коды и старайтесь работать с диапазонами.
__________________
Want to believe... |
|
07.02.2011, 15:50 | #5 |
Участник
|
Оптимизировать строку фильтра не получится (только частично если), потому что не везде коды БУТИК.. Таковы принципы формирвоания кода в карточке. Это ненадолго нас спасет. И учитывая, что все равно переделывать ...
Надо оптимизировать код отчета. Наверняка, есть какой-то подход к решению этой проблемы. |
|
07.02.2011, 15:59 | #6 |
Участник
|
|
|
07.02.2011, 16:06 | #7 |
Участник
|
Склады НЕ ВСЕ, а в соответсвии с некоторыми условиями. Вернее, для пользователя "все".
В таблице складов по сути есть склады и магазины. Но некоторые склады и магазины закрыты, а некоторые уже созданы, но не открыты. Магазин открывается, смотрится его прибыльность, магазин закрывается ... Нормальная ситуация. Поэтому фильтр - список магазинов зависит от периода отчета. В фильтр попадают только те склады, которые работали в период отчета. Те, которые еще не открылись (а у нас по году открываются) или уже закрылись в фильтр не попадают. Еще один признак при программном формировании фильтра: только склады или только магазины. Фильтр "только магазины" .. через 6 месяцев станет длиннее 680 символов. Исключающий фильтр - вариант! Но пользователь имееет возможность изменить фильтр. Т.е. программное формирование фильтра - это сервис. А если делать исключающий фильтр, то у пользователя придется отобрать право редактировать фильтр отчета. Это не очень хорошо - придется потом с юзерами няньчится и вникать, какие фильтры им нужны сегодня. |
|
07.02.2011, 16:12 | #8 |
Участник
|
Я бы добавил в таблицу складов галочку - магазин и обходил бы по циклу
|
|
07.02.2011, 16:14 | #9 |
Участник
|
А что у вас за поле Location Filter в таблице Группа Товара? Какой оно длины? При наложении фильтра вы пишете SETFILTER или SETRANGE?
|
|
07.02.2011, 16:35 | #10 |
Участник
|
Цитата:
Сообщение от mira
А как можно принципиально переделать механизм фильтрации?
У нас все отчеты по такому принципу. И количество магазинов растет. Я создала два очередных магазина в системе и ..получила ошибку. Ведь если число магазинов растет, то и фильтр будет расти Хочется определиться с методами возможной переделки, прежде чем начинать переписывать отчеты. Не формируйте фильтр в параметрах отчета. Попробуйте использовать FILTERGROUP в период выполнения... |
|
07.02.2011, 17:00 | #11 |
Участник
|
Цитата:
Сообщение от Orwell
Я в подобных случаях использую темповые рекорды. Там, где наложение гигантского фильтра неприемлемо и можно немного потерять на производительности посредством прямого сравнения обрабатываемого в данный момент кода склада с массивом складом в темповом рекорде (этих массивов может быть много, в зависимости от того, какой из них отвечает тем или иным условиям) - используйте эту технику. Не слишком эстетично, не спорю, но спасало много-много раз...
Не формируйте фильтр в параметрах отчета. Попробуйте использовать FILTERGROUP в период выполнения... Но я не соображу сходу как их "скрестить" с фильтрами ... Как темповый рекорд позволяет обойти использование длинного фильтра? Возможно, где-то это описывалось? Наверно, ваше предложение это то, что надо. |
|
07.02.2011, 17:03 | #12 |
Участник
|
Цитата:
Ошибка возникает на операторе IF txtLocFilter<>'' THEN "Item Group".SETFILTER("Item Group"."Location Filter",txtLocFilter); где txtLocFilter тот самый длинный фильтр. |
|
07.02.2011, 17:07 | #13 |
Участник
|
Цитата:
Temp2: Черный, Красный, Белый..... и так еще 150 складов, которые вполне пересекаются с Temp1, но составляют свой массив складов - оборот по которым минимум 2 млн. Предварительно выполнив выборку нужных складов по разным кейсам, можете составить десяток-другой таких темповых "массивов". И используйте их в дальнейше логике, сравнивая с обрабатываемыми данными. Ибо фильтр из 150 складов вам выдаст ошибку. А сравнение с предварительным набором складов, отобранных по той же самой логике, ошибки не выдаст. Я может что-то недопонял в вашей проблеме, но вы filtergroup использовать не пробовали? |
|
07.02.2011, 17:08 | #14 |
Участник
|
Есть такая галочка. Но это не спасет ни сейчас, ни в дальнейшем.
Пользователь может выбрать для отчета любой набор складов (складов и \или магазинов)для отчета. И максимальное их количество (условно "все") для ежемесячной отчетности уже за пределами ограничения 680 символов. Тут надо менять подход. Любые временные меры - только временные затраты. |
|
07.02.2011, 17:13 | #15 |
Участник
|
Цитата:
Т.е. я программно накладываю фильтры (например, в целях безопасности) и юзер не может их отменить и заглянуть дальше, чем ему разрешено... Например.. Так? Т.е. filtergroup испольуется если есть иерархия фильтров: фильтра разработчика, фильтры юзера ... А как мне это поможет? У меня один "одноранговый" длииииииинный фильтр Как я его по группам раскидаю? И зачем? |
|
07.02.2011, 17:18 | #16 |
Участник
|
Цитата:
Сообщение от Orwell
Temp1: Белый, Синий, Зеленый, Голубой, Оранжевый..... и так еще 100 складов - склады, по которым оборот 3 млн.
Temp2: Черный, Красный, Белый..... и так еще 150 складов, которые вполне пересекаются с Temp1, но составляют свой массив складов - оборот по которым минимум 2 млн. Предварительно выполнив выборку нужных складов по разным кейсам, можете составить десяток-другой таких темповых "массивов". И используйте их в дальнейше логике, сравнивая с обрабатываемыми данными. Ибо фильтр из 150 складов вам выдаст ошибку. А сравнение с предварительным набором складов, отобранных по той же самой логике, ошибки не выдаст. Я может что-то недопонял в вашей проблеме, но вы filtergroup использовать не пробовали? Отрабатываю каждый "подфильтр" и запихиваю результаты в темпы. Потом из разных темпов сливаю в отчет. Так? Orwell, это непохоже на какое-то принципиально иное решение, которое "не видит" длины фильтра. А я надеялась))) Получается, у нас болезнь роста. Надо делать тоже самое, что делали раньше, только два раза..потом три раза .. Спасибо за совет! |
|
07.02.2011, 22:40 | #17 |
Участник
|
Цитата:
Код: "Item Group".SETFILTER("Location Filter",STRSUBSTNO('%1',txtLocFilter)); |
|
07.02.2011, 23:22 | #18 |
Administrator
|
решение с 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 |
Administrator
|
а более грамотно будет, имхо, найти какой-то определяющий признак для каждого склада: это будет опшн (склад/магазин/прочее) или код на основе интежера (10 - склады, 20 - магазины, 25 - магазины без склада, например) и этот признак протащить в ОПЕРАЦИИ. вы же операции фильтруете?
|
|
08.02.2011, 03:06 | #20 |
Участник
|
Цитата:
|
|