15.09.2021, 21:18 | #1 |
Участник
|
Настройка структуры счета. Критерии
AX 2012 R3
В настройках для плана счетов есть форма из темы. Есть возможность задавать критерии с условием "начинается с". В итоге все это потом прилетает в запрос с участием таблицы DimensionConstraintNodeCriteria (\Classes\DimensionAttributeValueGroupValidation\findConstraintNodeByParentValue) Одно из условий в запросе: X++: (_displayValue like dimensionConstraintNodeCriteria.WildCardString) Наткнулся на то что запрос не возвращает то что должен бы был. Упростил, посмотрел трассировку. Первый запрос просто сделал чтобы показать, что есть на самом деле в таблице. Второй запрос возвращает строку. Третий не возвращает ничего: X++: SELECT * FROM DIMENSIONCONSTRAINTNODECRITERIA T1 WHERE ((PARTITION=5637144576) AND (RECID = 5637213979 OR RECID = 5637213968)) SELECT * FROM DIMENSIONCONSTRAINTNODECRITERIA T1 WHERE ((PARTITION=5637144576) AND ((N'48\_0000' LIKE WILDCARDSTRING ESCAPE '\' ) AND RECID = 5637213979)) SELECT * FROM DIMENSIONCONSTRAINTNODECRITERIA T1 WHERE ((PARTITION=5637144576) AND ((N'58\_0303040302' LIKE WILDCARDSTRING ESCAPE '\' ) AND RECID = 5637213968)) В _displayValue значение были без бэкслэша. Их аксапта сама подставляет. Это что так плохо реагирует like на подчеркивание в тексте кода? И что с этим собственно сделать малой кровью? |
|
16.09.2021, 08:02 | #2 |
Участник
|
Символ _ для like является символом шаблоном.
https://docs.microsoft.com/ru-ru/sql...l-server-ver15 Странно, что в where система экранирует значение _displayValue, а не в значении для like, ведь escape применяется к строке которая находится после like. Понятно почему в одном случае работает, а в другом нет шаблон 48_% - означает 48(любой символ)(любые символы) - для 48\_0000 в данном случае _ замещается на \ ну и % отрабатывает все нули. шаблон 58_030304% - 58(любой символ)030304% - а вот для значения 58\_0303040302 получаем, что _сравнивается уже с 0 и соответственно отваливается. Можно попробовать вот такие шаблоны : 58\\\_030304% 48\\\_% Без использования экранирования (когда в _displayValue нет бэкслэша), т.е. 48_0000 и 58_03030402 можно было бы использовать вот такие шаблоны 48[_]% 58[_]030304%
__________________
Sergey Nefedov |
|
|
За это сообщение автора поблагодарили: Perc (2). |
16.09.2021, 11:31 | #3 |
Участник
|
Хотел в коде до подстановки в запрос в _displayValue заменить все подчеркивание на знак вопроса. '58_0303040302' -> '58?0303040302'. Тогда аксапта подставляя в SQL меняет его обратно и бэкслеш соответственно тоже не пихает. Проверка проходит норм.
Но остается неоднозначность - на месте подчеркивание может пролезть какой-то другой знак. Чтения доки по Like и тест помогает) Поэтому рекомендовали набивать в шаблон 3 бэкслэша перед подчеркиванием. Без модификаций. Это работает и корректно как-будто)) |
|