26.04.2011, 17:10 | #1 |
Участник
|
Ошибка расширенного диапазона запроса: stTable2.ItemId не является корректной парой datasource.field рядом с 24.
Коллеги, помогите пожалуйста!
Ax2009RU4 vs Ax2009RU5 Создаю две таблицы, добавляю связь у второй к первой. Кидаю эти таблицы на форму, вторую таблицу цепляю к первой через inner join. В executQuery первой пишу следущее: X++: QueryBuildRange qbr; ; qbr = this.query().dataSourceName(this.name()).findRange(fieldnum(stTable1, RecId)); if (!qbr) { qbr = this.query().dataSourceName(this.name()).addRange(fieldnum(stTable1, RecId)); } qbr.value(strfmt('( %1.ItemId like "%2" )', stTable2_ds.name(), strlen(StringEdit.text()) ? strfmt('*%1*', StringEdit.text()) : "*" )); super(); info(this.query().dataSourceName(this.name()).toString()); Цитата:
Ошибка расширенного диапазона запроса: stTable2.ItemId не является корректной парой datasource.field рядом с 24.
SELECT FIRSTFAST * FROM stTable1 WHERE ((( stTable2.ItemId like "*" ))) JOIN FIRSTFAST * FROM stTable2 WHERE stTable1.ItemId = stTable2.ItemId Цитата:
SELECT * FROM stTable1 WHERE ((( stTable2.ItemId like "*" ))) JOIN * FROM stTable2 WHERE stTable1.ItemId = stTable2.ItemId
Куда копать? Подобные запросы используются на нескольких формах, поведение всех форм аналогично. Проектик приложил. |
|
26.04.2011, 18:36 | #2 |
Axapta
|
RU4 посмотреть не могу, но в RU3 и RU6 тоже не работает. При этом в Ax2012 работает.
|
|
26.04.2011, 19:32 | #3 |
Member
|
Код не смотрел но нечто похожее делал через пользовательский интерфейс (в расширенном фильтре). Сработало если не указывать название таблицы и точку. Только поле.
LIKE через пользовательский интерфейс не делается. Через код — не помню (или не знаю).
__________________
С уважением, glibs® |
|
26.04.2011, 20:04 | #4 |
Участник
|
Цитата:
Цитата:
Using wildcards and comma-separated range values
Again, the previous example here was using standard syntax, not the special syntax using expressions. It's not possible to modify the above examples to work with wildcards. The above statement applies to AX versions < 5.0 AX 5.0 introduced solution to wildcards - while you still cannot directly use wildcards in ranges, now it supports the 'LIKE' keyword. X++: (AccountNum LIKE "*AA*" || Name LIKE "*AA*") |
|
|
За это сообщение автора поблагодарили: glibs (1). |
26.04.2011, 20:47 | #5 |
Участник
|
Если не указывать таблицу, то ищется не там, где нужно.
|
|
26.04.2011, 21:59 | #6 |
----------------
|
поясните, люди добрые, глубокий смысл подобного написания запроса в данном примере.
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
26.04.2011, 22:02 | #7 |
Участник
|
А такой код работает в RU4,5,6... ?
X++: stTable stTable1; stTable stTable2; ; select stTable1 where stTable2.ItemId like "*" // stTable1.ItemId like "*" join stTable2 where stTable1.ItemId == stTable2.ItemId |
|
26.04.2011, 22:24 | #8 |
Участник
|
Цитата:
При этом пользователь задает искомое в специальное поле, а система ищет это значение или в полях первой таблицы или второй. Должно получиться что-то типа: X++: stTable1 stTable1; stTable2 stTable2; ; while select stTable1 join stTable2 where stTable1.ItemId == stTable2.ItemId && (stTable2.Field1 == "A" || stTable1.Field1 == "A") Последний раз редактировалось uchenik; 26.04.2011 в 22:37. |
|
26.04.2011, 23:01 | #9 |
Участник
|
Т.е. загвоздка в том чтобы в одном условии использовать поля из разных таблиц?
Возможно проблема возникает из-за того что вы пытаетесь подсунуть нужное условие в первую таблицу. Попробуйте тоже самое условие переместить в подчинённый датасорс. Так будет работает? X++: QueryBuildRange qbr; ; qbr = this.query().dataSourceName(stTable2_ds.name()).findRange(fieldnum(stTable2, RecId)); if (!qbr) { qbr = this.query().dataSourceName(stTable2_ds.name()).addRange(fieldnum(stTable2, RecId)); } qbr.value(strfmt('( %1.ItemId like "%2" )', this.name(), strlen(StringEdit.text()) ? strfmt('*%1*', StringEdit.text()) : "*" )); super(); info(this.query().dataSourceName(this.name()).toString()); |
|
26.04.2011, 23:45 | #10 |
Axapta
|
Так ошибки не должно быть, так как теперь это обычная ситуация с like в расширенном рендже, а это вроде работает во всех роллапах. Тут интересно то, что некий код в некотором ролапе не работал, потом заработал, затем опять "сломался", а в новой AX 2012 вдруг "починился". Очередное подтверждение того, что надо стараться избегать нестандартного кода, так как поведение системы может неоднократно меняться даже с соседних билдах.
|
|
27.04.2011, 07:24 | #11 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Т.е. загвоздка в том чтобы в одном условии использовать поля из разных таблиц?
Возможно проблема возникает из-за того что вы пытаетесь подсунуть нужное условие в первую таблицу. Попробуйте тоже самое условие переместить в подчинённый датасорс. Так будет работает? X++: QueryBuildRange qbr; ; qbr = this.query().dataSourceName(stTable2_ds.name()).findRange(fieldnum(stTable2, RecId)); if (!qbr) { qbr = this.query().dataSourceName(stTable2_ds.name()).addRange(fieldnum(stTable2, RecId)); } qbr.value(strfmt('( %1.ItemId like "%2" )', this.name(), strlen(StringEdit.text()) ? strfmt('*%1*', StringEdit.text()) : "*" )); super(); info(this.query().dataSourceName(this.name()).toString()); Да и потом если прикрепленных таблиц несколько? Работает если вызвать executeQuery для ВСЕХ источников в ОБРАТНОМ ПОРЯДКЕ. Как костыль сошло бы, но как же быть в случае нескольких дочерних источников? Последний раз редактировалось uchenik; 27.04.2011 в 07:36. |
|
28.04.2011, 13:05 | #12 |
Участник
|
|
|
28.04.2011, 15:27 | #13 |
Участник
|
|
|
29.04.2011, 20:50 | #14 |
Участник
|
|
|
05.05.2011, 08:47 | #15 |
Участник
|
В результате фильтр накладывается в коде крайнего источника данных, а executeQuery необходимо дернуть для всех источников, задействованных в запросе.
В трешке можно было запрос задавать именно в родительском источнике и executeQuery дергать только для него, в 2009RU4 аналогично. А еще если вывести запрос в приложениях, где метод через основной источник данных не работает, то в нем можно увидеть "FIRSTFAST", отключение соответствующих опций у источников правда ничего не меняют. Всем спасибо, особенно С.Кускову. |
|