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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2010, 22:28   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Длина строки range - 250, 1000 или больше
Добрый день всем.

При написании модификаций обратил внимание на странную особенность работы querybuildRange - при задании фильтра из формы SysQueryForm длина строки критерия ограничена 250 символами, что в общем понятно, так как длина соответствующего поля RangeValue во временной табличке TmpSysQuery как раз 250 символов. Но если задавать критерий из X++ то можно задать строки большей длины, например 1000 символов. Правда если потом открыть редактирование этого Query формой SysQueryForm, то критерий усекается до 250 символов, что неприятно.

Есть какие-нить ограничения в языке X++ на длину критерия ? Или магическая цифра 250 символов выбрана неспроста...
Старый 16.09.2010, 22:30   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
О!
Пропустил нужную тему
Длина Range
но вопрос все равно остается.
Старый 17.09.2010, 08:48   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Вроде бы в X++ ограничений на количество символов нет, но учтите что сколько бы вы не передали символов из кода, в запросе в итоге будут участвовать только первые 250 сам наступал на эти грабли
Лучше разбивать на несколько range (но это не всегда возможно из-за определения какое условие подставлять И или ИЛИ. если писать в одном range, тогда в запросе будет условие И, а если в нескольких, то ИЛИ. и на эти грабли наступал ).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: mazzy (2).
Старый 17.09.2010, 09:04   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от lev Посмотреть сообщение
...(но это не всегда возможно из-за определения какое условие подставлять И или ИЛИ. если писать в одном range, тогда в запросе будет условие И, а если в нескольких, то ИЛИ. и на эти грабли наступал ).
забыл добавить главный нюанс! так работает при добавлении отрицания в условие запроса, т.е. "!" или SysQuery::valueNot().

вот джобик для наглядности:
X++:
Query                   query;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    InventTable             inventTable;
    str                     filter;
    int                     i;
    ;
    // вариант №1 создаем один range и в него через запятую записываем условие -->
    query   = new Query();
    qbds    = query.addDataSource(tableNum(InventTable));
    qbr     = qbds.addRange(fieldNum(InventTable, ItemId));

    while select inventTable
    {
        i++;

        if (filter != '')
            filter += ', ';

        filter += '!' + inventTable.ItemId;

        if (i == 3)
            break;
    }

    qbr.value(filter);

    info('1-ый вариант -->');
    info(query.dataSourceTable(tableNum(InventTable)).toString());
    info('1-ый вариант <--');
    // <--------------------------------------------------------------------------

    i = 0;

    // вариант №2 для каждой номенклатуры добавляем range -->
    query   = new Query();
    qbds    = query.addDataSource(tableNum(InventTable));

    while select inventTable
    {
        i++;

        qbds.addRange(fieldNum(InventTable, ItemId)).value(SysQuery::valueNot(inventTable.ItemId));

        if (i == 3)
            break;
    }

    info('2-ой вариант -->');
    info(query.dataSourceTable(tableNum(InventTable)).toString());
    info('2-ой вариант <--');
    // <-----------------------------------------------------
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: Logger (3).
Старый 17.09.2010, 09:25   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от lev Посмотреть сообщение
Вроде бы в X++ ограничений на количество символов нет, но учтите что сколько бы вы не передали символов из кода, в запросе в итоге будут участвовать только первые 250 сам наступал на эти грабли
Погорячился! Посыпаю голову пеплом
При формировании запроса в X++ в условие range можно добавлять сколько угодно символов, и запрос нормально отработает. Но, соответственно, если это условие добавить потом, например, в фильтр на форме (диалоге), то оно обрежется до 250 сомволов (потому как там используется TmpSysQuery ).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 17.09.2010, 09:42   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Уточню вопрос. Строка фильтра обрезается до 250 символов, потому что, соответствующее поле во временной табличке, которая используется для отображения критериев на форме SysQueryForm, имеет как раз 250 символов. Если увеличить длину поля, то можно сделать и 1000 символов, что по-моему удобнее в использовании, но неясно будут ли какие либо побочные эффекты.
Старый 17.09.2010, 09:47   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Не думаю, что возникнут какие то проблемы.
Если из кода запрос с условием более 250-ти символов отрабатывает нормально, то и на формах (диалогах) он должен отрабатывать нормально.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 17.09.2010, 10:23   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Нет, ничего ужасного в увеличении длины нету.
Но, учтите, что рано или поздно вы наткнетесь на максимальную длину значения в where выражении SQL Server (она равно около 2000 символов на какой-то из версий, если мне память не изменяет).
То есть, если вам нужен фильтр по 300 символов, то да, все ОК. Но если вы собираетесь генерировать очень длинные фильтры - возможно exist join подойдет больше.
На форуме обсуждалась эта проблема, к слову, поэтому можете попробывать поискать конкретные детали.
За это сообщение автора поблагодарили: Logger (3), aidsua (2).
Старый 17.09.2010, 10:52   #9  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
как и говорил Иван, вот такой джобик через некоторое время валится с ошибкой SQL (слишком длинный запрос)
X++:
static void JobRangeLength(Args _args)
{
    InventTable     inventTable, inventTableQr;
    int             i;
    Query           q = new Query();
    QueryRun        qr;
    QueryBuildDataSource    qbDS;
    QueryBuildRange         qRange;
    ;

    qbDS = q.addDataSource(tableNum(InventTable));
    qbDS.fields().clearFieldList();
    qbDS.addSelectionField(fieldNum(InventTable, ItemId));
    qbDS.addSortField(fieldNum(InventTable, ItemId), SortOrder::Descending);

    qRange = qbDS.addRange(fieldNum(InventTable, ItemId));
    qRange.value("null");

    qr = new QueryRun(q);

    while select ItemId from inventTable
        order by ItemId ASC
    {
        i++;
        qRange.value(qRange.value() + ',' + inventTable.ItemId);
        qr.query(q);
        qr.reset();
        qr.next();

        inventTableQr = qr.getNo(1);
        if(inventTable.ItemId != inventTableQr.ItemId)
        {
            info(strFmt("%1 %2 %3", i, inventTable.ItemId, strLen(qRange.value())));
            warning(qRange.value());
            break;
        }
    }
}
За это сообщение автора поблагодарили: Logger (3), aidsua (2).
Старый 17.09.2010, 10:52   #10  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
2Logger
Паш, я когда давно крутил эту проблему, и решил, что луше создавать временную табличку с критериями и джойнить, как Иван предложил. Как то на мой взгляд это выглядит посимпотнее.
__________________
Axapta book for developer
За это сообщение автора поблагодарили: Logger (3).
Старый 17.09.2010, 11:10   #11  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
есть еще магическая константа 475 - максимальный уровень вложенности в WHERE. Что может быть критично, поскольку Axapta каждое условие добавляемое по ИЛИ оборачивает в новый уровень (это если добавлять много Range).

У нас бывают запросы с размером WHERE больше 10000 символов - проходит, если бы не такая вложенность (Ax4, SQL2005).

Вышеприведенный джоб валится как раз на значении счетчика 476, при этом длина запроса 12500 символов.

Последний раз редактировалось vanokh; 17.09.2010 в 11:17.
За это сообщение автора поблагодарили: sukhanchik (3), Logger (3), lev (3), aidsua (2), gl00mie (2).
Старый 17.09.2010, 12:43   #12  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
В продолжение темы
Выборка произвольных записей одним запросом
Старый 19.09.2010, 01:31   #13  
AX2009
Гость
 
n/a
ребята вы кажется неправильно используете аксапту
почему я, программируя уже лет 8, ни разу не сталкивался с такими проблемами?
Старый 19.09.2010, 14:36   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AX2009 Посмотреть сообщение
ребята вы кажется неправильно используете аксапту. почему я, программируя уже лет 8, ни разу не сталкивался с такими проблемами?
Железная логика! Вспомнилась в связи с этим тема Какими качествами ОБЯЗАН обладать ОПЫТНЫЙ консультант:
Цитата:
Сообщение от Vals Посмотреть сообщение
Представьте, что у вас работает специалист в течение двадцати лет. Он опытный человек? Но ведь все эти двадцать лет он мог делать всё неправильно!
Теги
query, querybuildrange, range

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передвижка фаз при выборе больше чем одной строки. Форма SMAServiceOrderTable Dima_Dima DAX: Программирование 22 30.04.2009 16:29
Длина строки leshy DAX: Программирование 6 19.03.2008 15:32
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Длина Range Владимир Максимов DAX: Программирование 18 05.03.2004 08:57

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

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

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