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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.03.2012, 13:00   #1  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
SysQuery
DAX 2009 Rollup7

Добрый день!
Сталкнулся с такой проблеммой. Если обработать накладную по закупке указав в номере накладной например так (< N123). То после обработки не не получится напечатать накладную.
Посмотрел в чем дело, оказывается символ больше или меньше не икранируется когда попадает в SysQuery.Value при создании отчета. И соответственно запрос возвращает неправильные данные.
Подскажите может кто то сталкивался с данной проблеммой, и как решали?
Можно конечно поправить метод value но я не смотрел на что это ещё может повлиять.
За это сообщение автора поблагодарили: S.Kuskov (5), samolalex (1).
Старый 02.03.2012, 13:58   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Действительно не экранируются! Посмотрел в коде метода SysQuery::Value() экранируются только: пробел, звёздочка, запятая, точка, круглые скобки и обратный слеш.
X++:
str quotableStr = ' *",.()\\';
Не экранируются знаки больше/меньше, восклицательный знак, вопросительный знак...
Очень странно. Почему?

Исправить можно добавив недостающие спец символы в строку quotableStr. Но перед этим нужно подумать ни повлияет ли это на работу остальных мест системы. Очень странно что это раньше не всплыло. А как с этим дела обстоят в предыдущих версиях?
Старый 02.03.2012, 14:15   #3  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Интересно. В тройке экранируются лишь следующие символы:
X++:
boolean quotable (str 1 s1)
    {
        if (s1 == ' ' || s1 == '*' ||  s1 == '"' || s1 == ',' || s1 == '.')
            return TRUE;
        return FALSE;
    }
Видимо, в последующих версиях не все символы учли или "так задумано"...?
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 02.03.2012 в 14:17.
Старый 02.03.2012, 14:20   #4  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Я думаю что так задумано, так как бывает что в Query надо передать <100 если делат выборку по количеству меньше 100. Если это закрыть то условие неправильно отработает. Может я ошибаюсь?
Старый 02.03.2012, 14:26   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Но ведь точно так же в range.value можно передать и "*100", а символ "*" в свою очередь экранируется.
Как я понял, строка quotableStr должна содержать все символы, задействованные как служебные при формировании фильтра запроса, которые должны восприниматься как обычный символ. Но так как эта строка не содержит все символы, а лишь их часть, значит в этом должен быть смысл, хотя... кому должен?)
__________________
С уважением, Александр.
Старый 02.03.2012, 14:42   #6  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Да я согласен, что передают и * и , и т.д. Возможно что дело именно в использовании SysQuery::value();
Вот если делать так то получатся совсем разные вещи.

X++:
queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value(SysQuery::value("123,124");
 
queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value("123,124");
В первом случае получим просто сравнение ItemId со значением "123,124", а во втором как 123 OR 124

Хотя нет, если сделать так то итог одинаковый будет

X++:
queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value(SysQuery::value("< 123"));
 
queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value("< 123");
Получается что если в SysQuery.Value добавить <> в quotableStr, то получится если передавать значения в range через SysQuery::value() эти символы будут экранироваться, а если стандартным фильтром то все останется как раньше.

Последний раз редактировалось maldini; 02.03.2012 в 14:53.
Старый 02.03.2012, 14:47   #7  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Да, в первом случае будет выбираться значение ItemId="123,124", а во втором - значения ItemId="123" и ItemId="124".
Все же, видимо, разработчики, посчитали нужным оставить символы "!?<>" зарезервированными, т.е. использующимися для задания критериев фильтрации.
__________________
С уважением, Александр.
Старый 02.03.2012, 14:55   #8  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Хотя нет, если сделать так то итог одинаковый будет

queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value(SysQuery::value("< 123"));

queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId)).value("< 123");
Правильно, в обоих случаях символ "<" не экранируется, поэтому используется как операция сравнения.

Цитата:
Получается что если в SysQuery.Value добавить <> в quotableStr, то получится если передавать значения в range через SysQuery::value() эти символы будут экранироваться, а если стандартным фильтром то все останется как раньше.
Да.
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 02.03.2012 в 15:01.
Старый 02.03.2012, 14:59   #9  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Зачем строковое значение сравнивать используя <>
Старый 02.03.2012, 15:08   #10  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
Цитата:
Сообщение от maldini Посмотреть сообщение
Зачем строковое значение сравнивать используя <>
Это вопрос?
Если да, то по стандарту SQL для операции сравнения "не равно", используется 2 последовательности - <> и != , а ! это чисто аксаптовское изобрЕтиние!
__________________
Axapta 3.0 sp - хз какой, kr2
Старый 02.03.2012, 16:17   #11  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Я не имел ввиду <> не как не равенство, я имелл ввиду зачем сравнивать ItemId > "Текст" или ItemId < "Текст". Ну хотя это только в данном случае. Вобщем вопрос который хочется как то решить, что бы избежать в будущем более серьезных проблемм, например при обновлении по условию кто нибудь укажет такое условие что обновится не одна запись а куча, а все из за ><.
Старый 02.03.2012, 17:42   #12  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Цитата:
Зачем строковое значение сравнивать используя <>
ИМХО
Например, в случае c большым количеством номенклатур с числовым ключом, необходимо отобрать номенклатуры с номером больше "50000". В этом случае, можно использовать данную конструкцию:
X++:
queryBuildDataSource.addRange(fieldNum(InventTable,ItemId)).value(">50000")
Можно, конечно, сделать и так:
X++:
queryBuildDataSource.addRange(fieldNum(InventTable,ItemId)).value("50000..")
Либо можно использовать знаки сравнения в случае, если нам необходимо отобрать строки больше/меньше заданной, ведь строки тоже можно сравнивать - пример тому функция strcmp() для сравнения пары строк.
Пример:
X++:
queryBuildDataSource.addRange(fieldNum(1, 1)).value(">ABC")
Но это, опять таки, мое субъективное мнение.
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 02.03.2012 в 17:51.
Старый 05.03.2012, 00:17   #13  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Да я полностью согласен, но вопрос так и остался открытым, как бороться с этим? Ведь никто не знает что пользователь завтра придумает в именах или номерах, что приведет к ошибкам, которые могут очень сильно навредить.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
daxline: SysQuery::findOrCreateRange() - A better way to create dynamic query ranges Blog bot DAX Blogs 0 28.01.2011 23:14
QueryRun и два Join'а Roman N. Krivov DAX: Программирование 15 16.07.2010 14:17
SysQuery::range(): ловушка в AX2009 EE EVGL DAX: Программирование 11 29.06.2009 14:30
Не получается сформировать lookup по запросу с outer join dawl DAX: Программирование 6 05.12.2008 15:12
Есть ли альтернатива SysQuery::countLoops(_queryRun) Beast-L DAX: Программирование 16 06.11.2007 12:56
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:05.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.