|
![]() |
#1 |
Участник
|
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. |
|
![]() |
#2 |
MCITP
|
![]()
а добавлять этот рэндж ко второму датасорсу пробовали?
X++: qbds.addDataSource(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, recid)).value(....
__________________
Zhirenkov Vitaly |
|
![]() |
#3 |
Участник
|
Картинка не изменилась!
![]() Те же ошибки! |
|
![]() |
#4 |
Участник
|
![]()
Возможно дело в названии ичточников данных, попробуйте использовать 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 ) ; } } |
|
|
За это сообщение автора поблагодарили: Gustav (7). |
![]() |
#5 |
Moderator
|
Цитата:
![]() X++: "((RAssetTransferTable_1.NewLocation==RAssetLocation_1.Location)||
(RAssetTransferTable_1.OldLocation==RAssetLocation_1.Location))" |
|
![]() |
#6 |
Участник
|
Цитата:
При желании, можно и явно задать имя синонима источника данных при добавлении: 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))))
|
|
![]() |
#7 |
Moderator
|
Вот-вот! Тоже не уверены?
![]() А оно так и есть. Понятно, что можно исправить имя на любое, но кто об этом специально заботится без особой нужды? Вот создал картинку, дабы запомнить навсегда про эту "_1": Ну, и теперь, раз уж пошла успешно дифференциальная диагностика, то можно и другие выводы закрепить: Цитата:
hated8, ну, а у Вас-то заработало наконец с _1?? |
|
![]() |
#8 |
Участник
|
![]() Ларчик просто открывался! ![]() 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 ); ![]() ![]() |
|
![]() |
#9 |
Moderator
|
Не очень понял... так про "убрать RAssetLocation" мы давно уже говорили и вроде не помогало?... А суффикс "_1" , смотрю, так и не понадобился?
|
|
![]() |
#10 |
MCITP
|
![]() Цитата:
Но с qbds.name() как-то уверенности больше! ![]()
__________________
Zhirenkov Vitaly |
|
![]() |
#11 |
Moderator
|
Цитата:
![]() По крайней мере, в 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))); } |
|
![]() |
#12 |
Moderator
|
Цитата:
Сообщение от hated8
![]() вся проблема была в том что я делал:
qbds.addDataSource(tablenum(RAssetLocation)); qbds.addRange(fieldNum(RAssetLocation, recid)).value('((RAssetTransferTable.NewLocation==Location) || (RAssetTransferTable.OldLocation==Location))'); поменял qbds на this.query().dataSourceTable(tablenum(RAssetLocation)) и стало счастье!) Оператор this.query().dataSourceTable(tablenum(RAssetLocation)).addRange(...) добавлял диапазон уже к датасорсу от RAssetLocation, в которой поле Location присутствует и поэтому счастье стало возможным и без имени датасорса. Если же сейчас то попробовать "==Location" с именем датасорса, то, почти уверен, что "==RAssetLocation.Location" вызовет ошибку, а "==RAssetLocation_1.Location" отработает нормально. Попробуете? (для завершенности эксперимента). Вы меня спросите, а почему же работает без _1 имя RAssetTransferTable? Я отвечу: "Она приезжала в Москву в командировку!" (шутка!) Я отвечу: потому что, вероятно, имя датасорса от таблицы RAssetTransferTable было исправлено на "без _1" в том таинственном this.query(), к которому всё пристраивается. Либо это датасорс формы, в котором _1 не добавляется при перетаскивании в него таблицы (первого экземпляра! а ко второму (!) уже добавляется "единичка", но без подчеркинания). ![]() |
|
|
За это сообщение автора поблагодарили: ZVV (1). |
![]() |
#13 |
MCITP
|
![]() Цитата:
Сообщение от 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))); } я с такими проблемами не сталкивался, всё по той же причине ![]()
__________________
Zhirenkov Vitaly |
|