AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 16.01.2009, 08:10   #1  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 27.06.2008
:( переделать запрос sql
Здравствуйте!
Помогите плз. новичку!

столкнулся со следующей проблемой:

есть запрос,
select * from RAssetLocation join UserGroupList join RAssetTransferTable
where RAssetLocation.userGroupId == UserGroupList.GroupId &&
UserGroupList.UserId == currentUserId &&
(RAssetTransferTable.NewLocation == RAssetLocation.Location || RAssetTransferTable.OldLocation == RAssetLocation.Location)

мне необходимо добавить его к this.query() я делаю примерно следующее:

qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
qbds = qbds.addDataSource(tablenum(RAssetLocation));
qbds.addLink(fieldNum(RAssetTransferTable,NewLocation),fieldNum(RAssetLocation,Location));
qbds.joinMode(JoinMode::InnerJoin);
qbds = qbds.addDataSource(tablenum(UserGroupList));
qbds.addLink(fieldNum(RAssetLocation,userGroupId),fieldNum(UserGroupList,groupId));
qbds.joinMode(JoinMode::InnerJoin);
qbds.addRange(fieldnum(UserGroupList, UserId)).value(currentUserId);

Но здесь идет связь по
RAssetTransferTable.NewLocation == RAssetLocation.Location,
а мне необходимо сделать:
(RAssetTransferTable.NewLocation == RAssetLocation.Location || RAssetTransferTable.OldLocation == RAssetLocation.Location)

Помогите пожалуйста...
Old 16.01.2009, 08:18   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Join Date: 08.08.2007
Blog Entries: 1
Возможности Ranges
Надеюсь ссылка поможет Возможности Ranges

update: еще можно посмотреть вот эту ссылку http://www.axaptapedia.com/Expressions_in_query_ranges

Last edited by SRF; 16.01.2009 at 08:23.
Old 16.01.2009, 10:18   #3  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 27.06.2008
:(
Не помогло!

...
qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
qbds.addDataSource(tablenum(RAssetLocation));
qbds.addRange( FieldNum( RAssetTransferTable, recId) ).value( "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))" );
...

Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 64.
Old 16.01.2009, 10:33   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by hated8 View Post
Не помогло!

...
qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
qbds.addDataSource(tablenum(RAssetLocation));
qbds.addRange( FieldNum( RAssetTransferTable, recId) ).value( "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))" );
...

Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 64.
А "равно" разве не "==" пишется в аксапте?
Расширенные ренджи также буквально вчера обсуждались: Расширенный фильтр в запрос или как то так

+ Всегда можно сделать info(qbds.toString()) и посмотреть что за кверю вы там наваяли...
__________________
Zhirenkov Vitaly
Old 16.01.2009, 11:18   #5  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by ZVV View Post
А "равно" разве не "==" пишется в аксапте?
Это, наверное, будет следующей обнаруженной ошибкой
А пока, судя по позиции "64", похоже, компилятор хочет, чтобы внутренние сравнения, которые соединяются по ||, взяли в скобки.
X++:
"((RAssetTransferTable.NewLocation==RAssetLocation.Location)|| 
(RAssetTransferTable.OldLocation==RAssetLocation.Location))"
Old 16.01.2009, 11:21   #6  
DAX is offline
DAX
Участник
 
28 / 18 (1) ++
Join Date: 03.12.2008
Quote:
Originally Posted by ZVV View Post
А "равно" разве не "==" пишется в аксапте?
Расширенные ренджи также буквально вчера обсуждались: Расширенный фильтр в запрос или как то так

+ Всегда можно сделать info(qbds.toString()) и посмотреть что за кверю вы там наваяли...
я как то тестил, вроде именно в рендже было всёравно и так и так работало) вот нашел 1 рабочий пример, там тоже "=".

А по теме, не пробуя, мне кажется проблема в скобках

вместо "((RAssetTransferTable.NewLocation = RAssetLocation.Location || RAssetTransferTable.OldLocation = RAssetLocation.Location))"

надо
"((RAssetTransferTable.NewLocation = RAssetLocation.Location) || (RAssetTransferTable.OldLocation = RAssetLocation.Location))"
This post has been rated by: Gustav (3).
Old 16.01.2009, 11:25   #7  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 27.06.2008
Фсё перепробоваал!!!
Фанарь!

У меня почему-то даже
qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));
qbds.addRange(fieldNum(RAssetTransferTable, recid)).value("((RAssetTransferTable.NewLocation == '1 01 01 00 12'))" );

возращает ошибку!

Last edited by hated8; 16.01.2009 at 11:39.
Old 16.01.2009, 11:28   #8  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by hated8 View Post
("((RAssetTransferTable.NewLocation == '1 01 01 00 12'))" );
Кавычки внутри выражения должны быть обязательно двойные. Меняйте наоборот. И скобок достаточно одних:
X++:
...value.('(RAssetTransferTable.NewLocation=="1 01 01 00 12")');
Old 16.01.2009, 11:30   #9  
DAX is offline
DAX
Участник
 
28 / 18 (1) ++
Join Date: 03.12.2008
;)
2 человека уже написали рабочий вариант... почему бы его не попробовать?
Old 16.01.2009, 11:36   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by DAX View Post
2 человека уже написали рабочий вариант... почему бы его не попробовать?
Это слишком лёгкий путь...
А так всё перепробует и запомнит на всю жизнь (надеюсь).
__________________
Zhirenkov Vitaly
Old 16.01.2009, 11:57   #11  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 27.06.2008
да не в том дело!

Все примеры работают с
qbds = query.addDataSource(tablenum(RAssetTransferTable));
, а мне необходимо
qbds = this.query().dataSourceTable(tablenum(RAssetTransferTable));!

как только меняешь одно на другое сразу получаеш:
Ошибка расширенного диапазона запроса: RAssetLocation.Location не является корректной парой datasource.field рядом с 60.
Old 16.01.2009, 12:15   #12  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
А в this.query() -то у вас что сидит перед добавлением в него чего-либо?
Old 16.01.2009, 12:19   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Если нужно именно добавить к существующей квери, то вероятно надо
X++:
qbds = this.query().addDataSource(tablenum(RAssetTransferTable));
Или она там уже есть? И вообще что уже есть в this.query()?
Может вам лучше привести сюда весь код?
__________________
Zhirenkov Vitaly
Old 16.01.2009, 12:24   #14  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
А уберите-ка RAssetLocation, оставьте так:
X++:
"((RAssetTransferTable.NewLocation==Location)||
(RAssetTransferTable.OldLocation==Location))"
Old 16.01.2009, 12:31   #15  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 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 тоже безрезультатно!

Last edited by hated8; 16.01.2009 at 12:37.
Old 16.01.2009, 12:38   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
а добавлять этот рэндж ко второму датасорсу пробовали?

X++:
qbds.addDataSource(tablenum(RAssetLocation)).addRange(fieldNum(RAssetLocation, recid)).value(....
__________________
Zhirenkov Vitaly
Old 16.01.2009, 12:42   #17  
hated8 is offline
hated8
Участник
hated8's Avatar
Злыдни
 
133 / 18 (1) ++
Join Date: 27.06.2008
Картинка не изменилась!
Те же ошибки!
Old 16.01.2009, 12:46   #18  
petergunn is offline
petergunn
Участник
 
118 / 279 (10) ++++++
Join Date: 30.08.2005
Location: 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 ) ;
    }
}
Attached Thumbnails
Click image for larger version

Name:	Query_OR.JPG
Views:	431
Size:	39.5 KB
ID:	4161  
This post has been rated by: Gustav (7).
Old 16.01.2009, 13:05   #19  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by petergunn View Post
Возможно дело в названии ичточников данных, попробуйте использовать QueryBuildDataSource.name() при формировании связки.
Вот же ёлки! Получается, суффикс "_1" всегда добавляется. Даже если таблица встречается в запросе один раз, то все равно имя ее датасорса модифицируется...
X++:
"((RAssetTransferTable_1.NewLocation==RAssetLocation_1.Location)|| 
(RAssetTransferTable_1.OldLocation==RAssetLocation_1.Location))"
Да, вот что значит не иметь практики в ручном создании запросов! Всё программно норовим... А при ручном создании сразу видно добавление "_1" к названию датасорса по умолчанию.
Old 16.01.2009, 13:25   #20  
petergunn is offline
petergunn
Участник
 
118 / 279 (10) ++++++
Join Date: 30.08.2005
Location: Tyumen
Quote:
Originally Posted by Gustav View Post
Вот же ёлки! Получается, суффикс "_1" всегда добавляется. Даже если таблица встречается в запросе один раз, то все равно имя ее датасорса модифицируется...
По умолчанию, возможно так и есть...
При желании, можно и явно задать имя синонима источника данных при добавлении:
X++:
     ...
    qbdsRAssetLocation = query.addDataSource( tableNum( RAssetLocation ), "SampleLocation" ) ;
    qbdsRAssetTransfer = qbdsRAssetLocation.addDataSource( tableNum( RAssetTransferTable ), "SampleTransfer" ) ;
    ...
Результат:
Quote:
SELECT * FROM RAssetLocation WHERE ((Location = N'1 01 01 11 00')) JOIN * FROM RAssetTransferTable WHERE ((((SampleTransfer.NewLocation == SampleLocation.Location) || (SampleTransfer.OldLocation == SampleLocation.Location))))
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Как преобразовать запрос в 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 11:25.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.