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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.01.2009, 12:31   #1  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
//SELECT * FROM RAssetTransferTable USING INDEX DateIdx

qbds.addDataSource(tablenum(RAssetLocation));
//SELECT * FROM RAssetTransferTable USING INDEX DateIdx JOIN * FROM RAssetLocation

qbds.addRange(fieldNum(RAssetTransferTable, recid)).value('(RAssetTransferTable.NewLocation==RAssetLocation.Location)');
//SELECT * FROM RAssetTransferTable USING INDEX DateIdx WHERE (((RAssetTransferTable.NewLocation==RAssetLocation.Location))) JOIN * FROM RAssetLocation

Уже пробовал убрать RAssetLocation ошибка почти та же!
dataSourceTable на addDataSource тоже безрезультатно!

Последний раз редактировалось hated8; 16.01.2009 в 12:37.
Старый 16.01.2009, 12:38   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
а добавлять этот рэндж ко второму датасорсу пробовали?

X++:
qbds.addDataSource(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, recid)).value(....
__________________
Zhirenkov Vitaly
Старый 16.01.2009, 12:42   #3  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Картинка не изменилась!
Те же ошибки!
Старый 16.01.2009, 12:46   #4  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
->
Возможно дело в названии ичточников данных, попробуйте использовать QueryBuildDataSource.name() при формировании связки.
Набросал тут упрощенную версию запроса по RAssetLocation:

X++:
static void jbRAssetLocationOR(Args _args)
{
    RAssetLocation          rAssetLocation      ;
    RAssetTransferTable     rAssetTransferTable ;
    
    QueryBuildDataSource    qbdsRAssetLocation  ;
    QueryBuildDataSource    qbdsRAssetTransfer  ;

    Range                   rangeRAsset         ;
    RAssetLocationId        rAssetLocationId    ;
 
    Query                   query               ;
    QueryRun                queryRun            ;
    ;
    
    rAssetLocationId = '1 01 01 11 00' ;
    info( 'From X++ Select:' ) ;
    while select rAssetLocation
        where   rAssetLocation.Location ==  rAssetLocationId
        join rAssetTransferTable
        where   rAssetTransferTable.NewLocation ==  rAssetLocation.Location ||
                rAssetTransferTable.OldLocation ==  rAssetLocation.Location
    {
        info( rAssetTransferTable.JournalNum ) ;
    }
        
    query = new Query() ;
    qbdsRAssetLocation = query.addDataSource( tableNum( RAssetLocation ) ) ;
    qbdsRAssetTransfer = qbdsRAssetLocation.addDataSource( tableNum( RAssetTransferTable ) ) ;
    qbdsRAssetTransfer.relations( false ) ;
    
    rangeRAsset = strfmt(   '((%1.%2 == %4.%5) || (%1.%3 == %4.%5))'    ,
                            qbdsRAssetTransfer.name()   ,
                            fieldStr( RAssetTransferTable, NewLocation ),
                            fieldStr( RAssetTransferTable, OldLocation ),
                            qbdsRAssetLocation.name()   ,
                            fieldStr( RAssetTable, Location ) ) ;
                            
    findOrCreateRange_W( qbdsRAssetLocation, fieldNum( RAssetLocation, Location ), SysQuery::value( rAssetLocationId ) ) ;
    findOrCreateRange_W( qbdsRAssetTransfer, fieldNum( RAssetTransferTable, RecId ), rangeRAsset ) ;
    
    info( 'From QueryRun:' ) ;
    info( qbdsRAssetLocation.toString() ) ;
    queryRun = new QueryRun( query ) ;
    while( queryRun.next() )
    {
        rAssetTransferTable = queryRun.get( tableNum( RAssetTransferTable ) ) ;
        info( rAssetTransferTable.JournalNum ) ;
    }
}
Миниатюры
Нажмите на изображение для увеличения
Название: Query_OR.JPG
Просмотров: 431
Размер:	39.5 Кб
ID:	4161  
За это сообщение автора поблагодарили: Gustav (7).
Старый 16.01.2009, 13:05   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от petergunn Посмотреть сообщение
Возможно дело в названии ичточников данных, попробуйте использовать QueryBuildDataSource.name() при формировании связки.
Вот же ёлки! Получается, суффикс "_1" всегда добавляется. Даже если таблица встречается в запросе один раз, то все равно имя ее датасорса модифицируется...
X++:
"((RAssetTransferTable_1.NewLocation==RAssetLocation_1.Location)|| 
(RAssetTransferTable_1.OldLocation==RAssetLocation_1.Location))"
Да, вот что значит не иметь практики в ручном создании запросов! Всё программно норовим... А при ручном создании сразу видно добавление "_1" к названию датасорса по умолчанию.
Старый 16.01.2009, 13:25   #6  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от Gustav Посмотреть сообщение
Вот же ёлки! Получается, суффикс "_1" всегда добавляется. Даже если таблица встречается в запросе один раз, то все равно имя ее датасорса модифицируется...
По умолчанию, возможно так и есть...
При желании, можно и явно задать имя синонима источника данных при добавлении:
X++:
     ...
    qbdsRAssetLocation = query.addDataSource( tableNum( RAssetLocation ), "SampleLocation" ) ;
    qbdsRAssetTransfer = qbdsRAssetLocation.addDataSource( tableNum( RAssetTransferTable ), "SampleTransfer" ) ;
    ...
Результат:
Цитата:
SELECT * FROM RAssetLocation WHERE ((Location = N'1 01 01 11 00')) JOIN * FROM RAssetTransferTable WHERE ((((SampleTransfer.NewLocation == SampleLocation.Location) || (SampleTransfer.OldLocation == SampleLocation.Location))))
Старый 16.01.2009, 13:35   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от petergunn Посмотреть сообщение
По умолчанию, возможно так и есть...
Вот-вот! Тоже не уверены?
А оно так и есть. Понятно, что можно исправить имя на любое, но кто об этом специально заботится без особой нужды?

Вот создал картинку, дабы запомнить навсегда про эту "_1":

Нажмите на изображение для увеличения
Название: query_1.jpg
Просмотров: 421
Размер:	61.9 Кб
ID:	4162

Ну, и теперь, раз уж пошла успешно дифференциальная диагностика, то можно и другие выводы закрепить:
Цитата:
Сообщение от DAX Посмотреть сообщение
я как то тестил, вроде именно в рендже было всёравно и так и так работало) вот нашел 1 рабочий пример, там тоже "=".
да, тоже проверил, и =, и == работают.


hated8, ну, а у Вас-то заработало наконец с _1??
Старый 16.01.2009, 14:05   #8  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Наканецта!!!!!!!!
Ларчик просто открывался!

qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
qbds.addDataSource(tablenum(RAssetLocation));
this.query().dataSourceTable(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, recid)).value('((RAssetTransferTable.NewLocation==Location) || (RAssetTransferTable.OldLocation==Location))');
this.query().dataSourceTable(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, userGroupId)).value(
(select groupId from UserGroupList
where UserGroupList.UserId == currentUserId).groupId
);

Спасиб огромное всем за помощь!!!
Старый 16.01.2009, 14:11   #9  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Не очень понял... так про "убрать RAssetLocation" мы давно уже говорили и вроде не помогало?... А суффикс "_1" , смотрю, так и не понадобился?
Старый 16.01.2009, 14:44   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Gustav Посмотреть сообщение
Вот же ёлки! Получается, суффикс "_1" всегда добавляется. Даже если таблица встречается в запросе один раз, то все равно имя ее датасорса модифицируется...
Именно поэтому, как я уже вчера и говорил, я предпочитаю использовать "qbds.name()". По умолчанию всегда так, единички подставляются, но если данная таблица только одна в запросе, то и без единички Аксапта нормально хавает.
Но с qbds.name() как-то уверенности больше!
__________________
Zhirenkov Vitaly
Старый 16.01.2009, 15:43   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от ZVV Посмотреть сообщение
По умолчанию всегда так, единички подставляются, но если данная таблица только одна в запросе, то и без единички Аксапта нормально хавает.
Да вот не хавает
По крайней мере, в AX 3.0 SP4. Может, в 4-ке хавает? У меня же в 3-ке вот так - только с "_1":
X++:
static void Job129(Args _args)
{
    Query                   query = new Query();
    QueryBuildDatasource    qbds = new QueryBuildDatasource() ;
    QueryRun                qr;
    ;
    qbds = query.addDataSource(tablenum(RAssetTransferTable));
    // НЕ РАБОТАЕТ
    // qbds.addRange(fieldnum(RAssetTransferTable,RecId))
    //  .value(@'(RAssetTransferTable.TransDate==29\12\2008)');
    // РАБОТАЕТ - c _1
    qbds.addRange(fieldnum(RAssetTransferTable,RecId))
        .value(@'(RAssetTransferTable_1.TransDate==29\12\2008)');

    qr = new QueryRun(query);
    qr.userUpdate(false);
    qr.prompt();
    box::info(strFmt('Кол-во записей: %1', sysQuery::countLoops(qr)));
}
Старый 16.01.2009, 16:33   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от hated8 Посмотреть сообщение
вся проблема была в том что я делал:
qbds.addDataSource(tablenum(RAssetLocation));
qbds.addRange(fieldNum(RAssetLocation, recid)).value('((RAssetTransferTable.NewLocation==Location) || (RAssetTransferTable.OldLocation==Location))');
поменял qbds на this.query().dataSourceTable(tablenum(RAssetLocation)) и стало счастье!)
Вся проблема была в том, что range сначала помещался не в тот датасорс. Вызов fieldNum(RAssetLocation, recid) вносил визуальную путаницу и казалось, что range строится для датасорса от таблицы RAssetLocation. Но в параметрах функции fieldNum для поля RecId можно было бы указать совершенно произвольную таблицу, хоть LedgerTable - все равно датасорс, к которому добавлялся это range определялся бы текущим состоянием переменной qbds, а в ней в тот момент был датасорс от таблицы RAssetTransferTable. Поэтому использование просто "Location" без квалификатора датасорса от RAssetLocation вызывало ошибку, так как в таблице RAssetTransferTable поле Location отсутствует.

Оператор this.query().dataSourceTable(tablenum(RAssetLocation)).addRange(...) добавлял диапазон уже к датасорсу от RAssetLocation, в которой поле Location присутствует и поэтому счастье стало возможным и без имени датасорса.

Если же сейчас то попробовать "==Location" с именем датасорса, то, почти уверен, что "==RAssetLocation.Location" вызовет ошибку, а "==RAssetLocation_1.Location" отработает нормально. Попробуете? (для завершенности эксперимента).

Вы меня спросите, а почему же работает без _1 имя RAssetTransferTable? Я отвечу: "Она приезжала в Москву в командировку!" (шутка!) Я отвечу: потому что, вероятно, имя датасорса от таблицы RAssetTransferTable было исправлено на "без _1" в том таинственном this.query(), к которому всё пристраивается. Либо это датасорс формы, в котором _1 не добавляется при перетаскивании в него таблицы (первого экземпляра! а ко второму (!) уже добавляется "единичка", но без подчеркинания).

Впрочем, если это 4-ка и там всё не так, как я думаю про _1, и прав ZVV - про "одну таблицу", то два предыдущих абзаца нужно будет воспринять с точностью до наоборот. P.S. Ну вот и выяснили
За это сообщение автора поблагодарили: ZVV (1).
Старый 16.01.2009, 16:34   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Gustav Посмотреть сообщение
Да вот не хавает
По крайней мере, в AX 3.0 SP4. Может, в 4-ке хавает? У меня же в 3-ке вот так - только с "_1":
X++:
static void Job129(Args _args)
{
    Query                   query = new Query();
    QueryBuildDatasource    qbds = new QueryBuildDatasource() ;
    QueryRun                qr;
    ;
    qbds = query.addDataSource(tablenum(RAssetTransferTable));
    // НЕ РАБОТАЕТ
    // qbds.addRange(fieldnum(RAssetTransferTable,RecId))
    //  .value(@'(RAssetTransferTable.TransDate==29\12\2008)');
    // РАБОТАЕТ - c _1
    qbds.addRange(fieldnum(RAssetTransferTable,RecId))
        .value(@'(RAssetTransferTable_1.TransDate==29\12\2008)');

    qr = new QueryRun(query);
    qr.userUpdate(false);
    qr.prompt();
    box::info(strFmt('Кол-во записей: %1', sysQuery::countLoops(qr)));
}
гм... почему-то думал что хавает... ну а нет так и лучше даже, будет повод лишний писать нормально...
я с такими проблемами не сталкивался, всё по той же причине - всегда использую qbds.name(), для надёжности.
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как преобразовать запрос в SQL-инструкцию Oloops DAX: Программирование 7 07.07.2008 20:38
Поймать SQL запрос при формировании отчета Qaz Qwerty DAX: Программирование 7 12.06.2008 01:46
SQL мониторинг + прямой запрос к SQL Alex_KD DAX: Программирование 17 29.05.2007 03:58
SQL Запрос Александр Костоусов DAX: Программирование 5 24.09.2004 12:15
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

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

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

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