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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.01.2009, 08:10   #1  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 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)

Помогите пожалуйста...
Старый 16.01.2009, 08:18   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Возможности Ranges
Надеюсь ссылка поможет Возможности Ranges

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

Последний раз редактировалось SRF; 16.01.2009 в 08:23.
Старый 16.01.2009, 10:18   #3  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 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.
Старый 16.01.2009, 10:33   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от hated8 Посмотреть сообщение
Не помогло!

...
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
Старый 16.01.2009, 11:18   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от ZVV Посмотреть сообщение
А "равно" разве не "==" пишется в аксапте?
Это, наверное, будет следующей обнаруженной ошибкой
А пока, судя по позиции "64", похоже, компилятор хочет, чтобы внутренние сравнения, которые соединяются по ||, взяли в скобки.
X++:
"((RAssetTransferTable.NewLocation==RAssetLocation.Location)|| 
(RAssetTransferTable.OldLocation==RAssetLocation.Location))"
Старый 16.01.2009, 11:21   #6  
DAX is offline
DAX
Участник
 
28 / 18 (1) ++
Регистрация: 03.12.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
А "равно" разве не "==" пишется в аксапте?
Расширенные ренджи также буквально вчера обсуждались: Расширенный фильтр в запрос или как то так

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

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

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

надо
"((RAssetTransferTable.NewLocation = RAssetLocation.Location) || (RAssetTransferTable.OldLocation = RAssetLocation.Location))"
За это сообщение автора поблагодарили: Gustav (3).
Старый 16.01.2009, 11:25   #7  
hated8 is offline
hated8
Участник
Аватар для hated8
Злыдни
 
133 / 18 (1) ++
Регистрация: 27.06.2008
Фсё перепробоваал!!!
Фанарь!

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

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как преобразовать запрос в 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, время: 08:28.