07.12.2004, 11:05 | #1 |
Участник
|
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание
Создал string EDT Type1 размером 10 символов. Создал табличку Table1 с двумя текстовыми полями Field1 и Field2 типа Type1. Добавил в табличку запись "1_2_3_4_5", "6_7_8".
Написал джобик: static void Job300(Args _args) { Table1 table; Query q = new Query(); QueryBuildDataSource qbds = q.addDataSource(tableNum(Table1)); QueryBuildRange qbr = qbds.addRange(fieldNum(Table1,Field1)); Type1 value = '1_2_3_4*'; Type1 value2 = '6_7_8'; QueryRun qr; ; qbr.value(value); qbr = qbds.addRange(fieldNum(Table1, Field2)); qbr.value(value2); select table where (table.Field1 like value) && (table.Field2 == value2); print table.Field1; pause; qr = new QueryRun(q); while (qr.next()) { print 'uraaaa'; } pause; } Поразился результатам - никакой записи мне возвращено не было ни в первом, ни во втором случае. Само собой, если на таблице я поставлю фильтр по двум полям с теми же значениями в том же порядке, то этот фильтр мне также не вернет искомую запись. Изменил значение value на "1_2_3_*" - все в порядке, джобик отрабатывает правильно в обоих случаях. Если же оставить value прежним и убрать вторую часть фильтра по полю Field2 - тоже все в порядке, если поменять местами фильтры(говорят от перемены мест слагаемых сумма не меняется) - опять будет хорошо отрабатывать. Решил посмотреть какие параметры приходят на sql server. Так вот символ подчеркивание "_" по какой-то причине аксаптой (именно в случае like) преобразуется в "\_" как будто это какой-то специальный символ (хотя нигде не слышал до сих пор, чтобы подчеркивание был каким-то спец символом). Когда приходит запрос, в котором стоит like со значением, в котором общее количество всех символов плюс число подчеркиваний превышает указанную длину поля(в нашем примере 10), а после like через "и"(через "или" - опять же все в порядке)присоединен еще какой-нибудь фильтр по другому полю, то происходит глюк - значение фильтра по первому полю обрезается максимальным числом символов в этом поле плюс один(при условии, что теперь в этом значении фильтра добавлены слэши) и к этому значению присоединяется значение следующего фильтра (то есть в приведенном выше примере - получаются параметры фильтра "1\_2\_3\_4%6_7_8", "6_7_8"). Если с учетом слэшей количество символов не превышает размер поля - то все в порядке. Баг мне кажется достаточно критичным - так как у нас широко используются символы "_" в кодах клиентов, кодах поставщиков, кодах номенклатуры(длина полей, которых составляет всего 20 символов) и в запросах, подобных приведенному выше по этим кодам может в каких-то случаях теряться информация. К сожалению нет под рукой трешки, чтобы проверить этот баг в ней. Сам имею в распоряжении: Axapta 2.5, sp6, Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4) |
|
07.12.2004, 12:02 | #2 |
Участник
|
Re: баг в 2.5. Будьте осторожнее с символом "_" подчеркивание
Цитата:
Изначально опубликовано levsha
Так вот символ подчеркивание "_" по какой-то причине аксаптой (именно в случае like) преобразуется в "\_" как будто это какой-то специальный символ (хотя нигде не слышал до сих пор, чтобы подчеркивание был каким-то спец символом). _ (underscore) Any single character. WHERE au_fname LIKE '_ean' finds all four-letter first names that end with ean (Dean, Sean, and so on). Предельно осторожно используйте в кодах также символы . , " ? * ! < > \ Поскольку их также надо экранировать См. также http://axapta.mazzy.ru/hints/search/ |
|
07.12.2004, 12:06 | #3 |
Участник
|
Re: баг в 2.5. Будьте осторожнее с символом "_" подчеркивание
Цитата:
Изначально опубликовано levsha
К сожалению нет под рукой трешки, чтобы проверить этот баг в ней. Да. ошибка переполнения. |
|
07.12.2004, 12:13 | #4 |
Участник
|
И еще. Баг не имеет никакого отношения к символу _.
Это типичная ошибка переполнения буфера. Попробуйте посмотреть в sql что происходит с фильтром value = "1_2_345'*"; |
|
07.12.2004, 12:20 | #5 |
Участник
|
Re: Re: баг в 2.5. Будьте осторожнее с символом "_" подчеркивание
Цитата:
Изначально опубликовано mazzy
http://msdn.microsoft.com/library/de...la-lz_115x.asp _ (underscore) Any single character. WHERE au_fname LIKE '_ean' finds all four-letter first names that end with ean (Dean, Sean, and so on). Цитата:
Изначально опубликовано mazzy
Предельно осторожно используйте в кодах также символы . , " ? * ! < > \ Поскольку их также надо экранировать См. также http://axapta.mazzy.ru/hints/search/ И еще. Баг не имеет никакого отношения к символу _. Это типичная ошибка переполнения буфера. Попробуйте посмотреть в sql что происходит с фильтром value = "1_2_345'*"; |
|
07.12.2004, 12:26 | #6 |
Участник
|
Тогда разрешите вас предупредить еще и о символе %
|
|