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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.04.2011, 17:10   #1  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Ошибка расширенного диапазона запроса: 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());
в результате при запуске на RU5:
Цитата:
Ошибка расширенного диапазона запроса: stTable2.ItemId не является корректной парой datasource.field рядом с 24.
SELECT FIRSTFAST * FROM stTable1 WHERE ((( stTable2.ItemId like "*" ))) JOIN FIRSTFAST * FROM stTable2 WHERE stTable1.ItemId = stTable2.ItemId
при запуске на RU4:
Цитата:
SELECT * FROM stTable1 WHERE ((( stTable2.ItemId like "*" ))) JOIN * FROM stTable2 WHERE stTable1.ItemId = stTable2.ItemId
в итоге на RU5 не работает, на RU4 работает.
Куда копать?

Подобные запросы используются на нескольких формах, поведение всех форм аналогично.

Проектик приложил.
Вложения
Тип файла: xpo SharedProject_selectionTest.xpo (6.8 Кб, 327 просмотров)
Старый 26.04.2011, 18:36   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
RU4 посмотреть не могу, но в RU3 и RU6 тоже не работает. При этом в Ax2012 работает.
Старый 26.04.2011, 19:32   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Код не смотрел но нечто похожее делал через пользовательский интерфейс (в расширенном фильтре). Сработало если не указывать название таблицы и точку. Только поле.

LIKE через пользовательский интерфейс не делается. Через код — не помню (или не знаю).
__________________
С уважением,
glibs®
Старый 26.04.2011, 20:04   #4  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от glibs Посмотреть сообщение
LIKE через пользовательский интерфейс не делается. Через код — не помню (или не знаю).
http://www.axaptapedia.com/Expressio...d_range_values
Цитата:
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  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Если не указывать таблицу, то ищется не там, где нужно.
Старый 26.04.2011, 21:59   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
поясните, люди добрые, глубокий смысл подобного написания запроса в данном примере.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 26.04.2011, 22:02   #7  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А такой код работает в RU4,5,6... ?
X++:
stTable stTable1;
stTable stTable2;
;

select stTable1 
where
    stTable2.ItemId like "*"  // stTable1.ItemId like "*"
join stTable2 
where 
    stTable1.ItemId == stTable2.ItemId
И вообще, в чём сокральный смысл помещения условия фильтрации второго курсора в секцию where первого?
Старый 26.04.2011, 22:24   #8  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от Wamr Посмотреть сообщение
поясните, люди добрые, глубокий смысл подобного написания запроса в данном примере.
Есть самопальная таблица, в которой есть ItemId, к ней цепляем InventTable, по полям которого можно найти нужную строку в самопальной таблице.
При этом пользователь задает искомое в специальное поле, а система ищет это значение или в полях первой таблицы или второй.

Должно получиться что-то типа:
X++:
stTable1 stTable1;
stTable2 stTable2;
;

while select stTable1
join stTable2
where
    stTable1.ItemId == stTable2.ItemId
    && (stTable2.Field1 == "A" || stTable1.Field1 == "A")
Это в RU5 работает.

Последний раз редактировалось uchenik; 26.04.2011 в 22:37.
Старый 26.04.2011, 23:01   #9  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Т.е. загвоздка в том чтобы в одном условии использовать поля из разных таблиц?
Возможно проблема возникает из-за того что вы пытаетесь подсунуть нужное условие в первую таблицу. Попробуйте тоже самое условие переместить в подчинённый датасорс. Так будет работает?
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  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Так ошибки не должно быть, так как теперь это обычная ситуация с like в расширенном рендже, а это вроде работает во всех роллапах. Тут интересно то, что некий код в некотором ролапе не работал, потом заработал, затем опять "сломался", а в новой AX 2012 вдруг "починился". Очередное подтверждение того, что надо стараться избегать нестандартного кода, так как поведение системы может неоднократно меняться даже с соседних билдах.
Старый 27.04.2011, 07:24   #11  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от 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());
Этот вариант не накладывает ограничения на главную таблицу (RU4, RU5).
Да и потом если прикрепленных таблиц несколько?

Работает если вызвать executeQuery для ВСЕХ источников в ОБРАТНОМ ПОРЯДКЕ.
Как костыль сошло бы, но как же быть в случае нескольких дочерних источников?

Последний раз редактировалось uchenik; 27.04.2011 в 07:36.
Старый 28.04.2011, 13:05   #12  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
Этот вариант не накладывает ограничения на главную таблицу
А разве this.name() - это не главный датасорс?

Цитата:
Сообщение от uchenik Посмотреть сообщение
как же быть в случае нескольких дочерних источников?
Вешать все условия на последний датасорс.
Старый 28.04.2011, 15:27   #13  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А разве this.name() - это не главный датасорс?

Вешать все условия на последний датасорс.
this.name() - имя источника, в методах которого прописан код

если несколько таблиц цепляются непосредственно к одной - какой из них последний?
Старый 29.04.2011, 20:50   #14  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от uchenik Посмотреть сообщение
если несколько таблиц цепляются непосредственно к одной - какой из них последний?
Если вывести запрос в виде строки, то тот который будет приджойнен последним. Т.е наверное тот у которого порядковый номер больше.
Старый 05.05.2011, 08:47   #15  
uchenik is offline
uchenik
Участник
 
119 / 20 (1) +++
Регистрация: 15.12.2008
В результате фильтр накладывается в коде крайнего источника данных, а executeQuery необходимо дернуть для всех источников, задействованных в запросе.

В трешке можно было запрос задавать именно в родительском источнике и executeQuery дергать только для него, в 2009RU4 аналогично.

А еще если вывести запрос в приложениях, где метод через основной источник данных не работает, то в нем можно увидеть "FIRSTFAST", отключение соответствующих опций у источников правда ничего не меняют.

Всем спасибо, особенно С.Кускову.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: Fill Utility incorrectly updating a field in a form datasource Blog bot DAX Blogs 1 27.05.2010 23:05
Ошибка расширенного диапазона Yugene DAX: Программирование 1 21.04.2006 10:36
не является корректной парой datasource.field Omeo DAX: Программирование 1 09.04.2004 13:24
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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