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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.03.2010, 13:04   #1  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Помогите с query ...
Здраствыйте ,

Никак немогу добиться резултата в одном query . В ручную ето выглядит так и работает хорошо :

Код:
      
      while select inventSum index hint LocateItemIdx where
      inventSum.InventLocationId == cInvLoc &&
      inventSum.PhysicalInvent
      notexists join firstonly invTrn index hint ItemIdx where
      invTrn.ItemId       == inventSum.ItemId      &&
      invTrn.inventDimId  == inventSum.InventDimId &&
      invTrn.DatePhysical >= dBgn
Хочу всё сделать рамотно и формирую вот так :
Код:
Query qInvSum2( Query qry )
{
   QueryBuildDataSource    qBSSum;
   QueryBuildDataSource    qBSTrn;
   ;
   qBSSum = qry.dataSourceTable( TableNum( InventSum ) );
   qBSSum.addSortIndex( indexnum( InventSum, LocateItemIdx ) );
   qBSSum.indexIsHint( true );
   qBSSum.addRange( fieldNum( InventSum, PhysicalInvent ) ).value( queryvalue( '!= 0' ) );

   qBSTrn = qBSSum.addDataSource( tableNum( InventTrans ) );
   qBSTrn.addLink( fieldNum( InventTrans, InventDimId ), fieldNum( InventSum, InventDimId ) );
   qBSTrn.addLink( fieldNum( InventTrans, ItemId ), fieldNum( InventSum, ItemId ) );
   qBSTrn.addSortIndex( indexNum( InventTrans, DimIdIdx ) );
   qBSTrn.indexIsHint( true );
   qBSTrn.addRange( fieldNum( InventTrans, DatePhysical ) ).value( SysQuery::range( dBgn, dateMax() ) );
   qBSTrn.joinMode( JoinMode::NoExistsJoin ); //  qBSTrn.firstOnly( true );
   //qBSTrn.fetchMode( QueryFetchMode::One2One );
   return qry;
}
Оно возвращает такой селект :

SELECT INDEXISHINT * FROM InventSum USING INDEX LocateItemIdx WHERE ((InventLocationId = LS)) AND ((ItemId = 1014c)) AND ((!PhysicalInvent= 0)) JOIN FIRSTONLY * FROM InventTable WHERE InventSum.ItemId = InventTable.ItemId AND ((ALNInventGroup1 = 200)) JOIN FIRSTONLY * FROM InventDim WHERE InventSum.InventDimId = InventDim.inventDimId EXISTS JOIN FIRSTONLY INDEXISHINT * FROM InventTrans USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventTrans.inventDimId AND InventSum.ItemId = InventTrans.ItemId AND ((DatePhysical>=2010.02.01 AND DatePhysical<=2153.12.31))

Подчеркивал плохож место красным . Что я здесь плохо делаю ?

Спасибо заранее за помощь ! С уважением , Римантас
Старый 18.03.2010, 13:20   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
а какая у Вас версия аксапты?
просто у меня Ax 3.0 SP3, джобик:
X++:
Query                   query;
    QueryBuildDataSource    qbdsInventSum, qbdsInventTrans;
    ;

    query   = new Query();

    qbdsInventSum = query.addDataSource(tableNum(InventSum));
    qbdsInventSum.addSortIndex(indexnum(InventSum, DimIdIdx));
    qbdsInventSum.indexIsHint(true);
    qbdsInventSum.addRange(fieldNum(InventSum, PhysicalInvent)).value(QueryValue('!= 0'));

    qbdsInventTrans = qbdsInventSum.addDataSource(tableNum(InventTrans));
    qbdsInventTrans.addLink(fieldNum(InventTrans, InventDimId), fieldNum(InventSum, InventDimId));
    qbdsInventTrans.addLink(fieldNum(InventTrans, ItemId), fieldNum(InventSum, ItemId));
    qbdsInventTrans.addSortIndex(indexNum(InventTrans, DimIdIdx));
    qbdsInventTrans.indexIsHint(true);
    qbdsInventTrans.addRange(fieldNum(InventTrans, DatePhysical)).value(SysQuery::range(dateNull(), dateMax()));
    qbdsInventTrans.joinMode(JoinMode::NoExistsJoin);

    info(qbdsInventSum.toString());
собрал вот такой запрос:
Цитата:
SELECT INDEXISHINT * FROM InventSum USING INDEX DimIdIdx WHERE ((!PhysicalInvent= 0)) NOTEXISTS JOIN INDEXISHINT * FROM InventTrans USING INDEX DimIdIdx WHERE InventSum.InventDimId = InventTrans.inventDimId AND InventSum.ItemId = InventTrans.ItemId AND ((DatePhysical<=31.12.2153))
как видно подставилось то что нужно, NOTEXISTS
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.03.2010, 13:23   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
и ещё вопросик, а полученный Вами query из метода qInvSum2 в дальнейшем нигде не изменяется в коде? может ExistsJoin подставляется ещё где нибудь?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 18.03.2010, 13:34   #4  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от lev Посмотреть сообщение
и ещё вопросик, а полученный Вами query из метода qInvSum2 в дальнейшем нигде не изменяется в коде? может ExistsJoin подставляется ещё где нибудь?
Нет , дальше он поддаеться на queryRun , ничего с ним дальше неделаю ... Версия у меня 3.0 #1951.4060/514-320 SP4/OPO23-196 ...

Просто qBSSum показывает EXIST JOIN ....
Старый 18.03.2010, 14:08   #5  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Код:
Query qInvSum2( Query qry )
{
   QueryBuildDataSource    qBSSum;
   QueryBuildDataSource    qBSTrn;
   ;
   qBSSum = qry.dataSourceTable( TableNum( InventSum ) );
   qBSSum.addSortIndex( indexnum( InventSum, LocateItemIdx ) );
   qBSSum.indexIsHint( true );
   qBSSum.addRange( fieldNum( InventSum, PhysicalInvent ) ).value( queryvalue( '!= 0' ) );

   qBSTrn = qBSSum.addDataSource( tableNum( InventTrans ) );
   qBSTrn.addLink( fieldNum( InventTrans, InventDimId ), fieldNum( InventSum, InventDimId ) );
   qBSTrn.addLink( fieldNum( InventTrans, ItemId ), fieldNum( InventSum, ItemId ) );
   qBSTrn.addSortIndex( indexNum( InventTrans, DimIdIdx ) );
   qBSTrn.indexIsHint( true );
   qBSTrn.addRange( fieldNum( InventTrans, DatePhysical ) ).value( SysQuery::range( dBgn, dateMax() ) );
   qBSTrn.joinMode( JoinMode::NoExistsJoin ); //  qBSTrn.firstOnly( true );
   //qBSTrn.fetchMode( QueryFetchMode::One2One );
   return qry;
}
Вы явно где-то еще модифицируете квери, т.к. в приведенном примере нет кода, который бы накладывал условия на запрос
Цитата:
WHERE ((InventLocationId = LS)) AND ((ItemId = 1014c))
Еще вариант, что Вы кверю сохраняете в sysLastValue и у Вас подгружается старая версия.
Старый 18.03.2010, 14:26   #6  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Вы явно где-то еще модифицируете квери, т.к. в приведенном примере нет кода, который бы накладывал условия на запрос


Еще вариант, что Вы кверю сохраняете в sysLastValue и у Вас подгружается старая версия.
Нашёл свою ошибку ....

Из-за сkорости я формирую 2 квери из основной . Одно с exist join , другое - notexist . Моя ошибка была , что в начяле в фетче я присваивал так :

qr1 = element.query();
qr2 = element.query();

а надо делать так :

qr1 = new Query( element.query() );
qr2 = new Query( element.query() );

Ето потому что дальше я поддаю ети квери на методы классы :

qr1 = mojaKlass.qInvSum1( qr1 );
...
qr2 = mojaKlass.qInvSum2( qr2 );

Теперь резултат хороший . Спасибо Вам ! :-)
Старый 18.03.2010, 15:01   #7  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Ещё одна просьба ...

Как можно перевести ето :

Код:
      while select custInvTrns index hint ItemIdIdx where
      custInvTrns.ItemId == invSum.ItemId &&
      custInvTrns.InvoiceDate >= dBgn        &&
      custInvTrns.InvoiceDate <= dEnd        &&
      custInvTrns.InventDimId == invSum.inventDimId
      join custInvJrn where custInvJrn.InvoiceId == custInvTrns.InvoiceId
      {
            nPrd    += custInvTrns.Qty;
            nPrdSum += custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 );
      }
на селект с sum( ) . Пробывал я по разному и с алиасами в селекте , но никак неполучаеться ...

Спасибо !
Старый 18.03.2010, 15:04   #8  
AX2009
Гость
 
n/a
Простите, что я не по теме, но меня вымораживают такие сокращения в названии табличных переменных, как у вас,
p.s. не получается пишется раздельно и без мягкого знака
Старый 18.03.2010, 15:15   #9  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AX2009 Посмотреть сообщение
Простите, что я не по теме, но меня вымораживают такие сокращения в названии табличных переменных, как у вас,
p.s. не получается пишется раздельно и без мягкого знака
Ну мой родной язык - литовский ...

А из-за названии переменных - зачем писать custInvoiceTrans если custInvTrns и понятно и покороче ... . Ну в форум , наверно , буду постараться писать полное - обещяю ... . Теперь так быстро copy/paste вышло ...
Старый 18.03.2010, 15:34   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Как можно перевести ето :
Код:
 while select custInvTrns index hint ItemIdIdx where
      custInvTrns.ItemId == invSum.ItemId &&
      custInvTrns.InvoiceDate >= dBgn        &&
      custInvTrns.InvoiceDate <= dEnd        &&
      custInvTrns.InventDimId == invSum.inventDimId
      join custInvJrn where custInvJrn.InvoiceId == custInvTrns.InvoiceId
      {
            nPrd    += custInvTrns.Qty;
            nPrdSum += custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 );
      }
на селект с sum( )
если вы уверены, в том что вот здесь вам совершенно точно не нужно округление:
Код:
nPrdSum += Currency::Amount(custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 ))
, то можно попытаться группировать по custInvJrn.ExchRate
Код:
     while select sum(Qty), sum(LineAmount) from custInvTrns 
      group by ExchRate
      index hint ItemIdIdx where
      custInvTrns.ItemId == invSum.ItemId &&
      custInvTrns.InvoiceDate >= dBgn        &&
      custInvTrns.InvoiceDate <= dEnd        &&
      custInvTrns.InventDimId == invSum.inventDimId
      join custInvJrn where custInvJrn.InvoiceId == custInvTrns.InvoiceId
      {
            nPrd    += custInvTrns.Qty;
            nPrdSum += custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 );
      }
, но сдаётся мне, что в общем случае без округления не обойтись
Старый 18.03.2010, 15:45   #11  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
если вы уверены, в том что вот здесь вам совершенно точно не нужно округление:
Код:
nPrdSum += Currency::Amount(custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 ))
, то можно попытаться группировать по custInvJrn.ExchRate
Код:
     while select sum(Qty), sum(LineAmount) from custInvTrns 
      group by ExchRate
      index hint ItemIdIdx where
      custInvTrns.ItemId == invSum.ItemId &&
      custInvTrns.InvoiceDate >= dBgn        &&
      custInvTrns.InvoiceDate <= dEnd        &&
      custInvTrns.InventDimId == invSum.inventDimId
      join custInvJrn where custInvJrn.InvoiceId == custInvTrns.InvoiceId
      {
            nPrd    += custInvTrns.Qty;
            nPrdSum += custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 );
      }
, но сдаётся мне, что в общем случае без округления не обойтись
Уверен , точное ненужное ...

Но я думал обо том , как сделать с одним select , то ето похоже так :

Код:
   select sum(Qty), sum(LineAmount ) from custInvTrns 
      group by ExchRate
      index hint ItemIdIdx where
      custInvTrns.ItemId == invSum.ItemId &&
      custInvTrns.InvoiceDate >= dBgn        &&
      custInvTrns.InvoiceDate <= dEnd        &&
      custInvTrns.InventDimId == invSum.inventDimId
      join custInvJrn where custInvJrn.InvoiceId == custInvTrns.InvoiceId;
Как то хочеться while избежать ... Попробую важе предложение ...
Теги
query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
jinx: Dynamics AX &ndash; Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Помогите с Query Vitali_i DAX: Программирование 22 21.11.2009 17:59
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Помогите новичку в создании Query lev DAX: Программирование 2 19.06.2006 10:29
Помогите с query 6apcyk DAX: Программирование 23 09.09.2005 13:50
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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