18.03.2010, 13:04 | #1 |
Участник
|
Помогите с 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 |
Ищущий знания...
|
а какая у Вас версия аксапты?
просто у меня 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))
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.03.2010, 13:23 | #3 |
Ищущий знания...
|
и ещё вопросик, а полученный Вами query из метода qInvSum2 в дальнейшем нигде не изменяется в коде? может ExistsJoin подставляется ещё где нибудь?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
18.03.2010, 13:34 | #4 |
Участник
|
Цитата:
Просто qBSSum показывает EXIST JOIN .... |
|
18.03.2010, 14:08 | #5 |
Участник
|
Цитата:
Сообщение от 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))
|
|
18.03.2010, 14:26 | #6 |
Участник
|
Цитата:
Из-за с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 |
Участник
|
Ещё одна просьба ...
Как можно перевести ето : Код: 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 ); } Спасибо ! |
|
18.03.2010, 15:04 | #8 |
Гость
|
Простите, что я не по теме, но меня вымораживают такие сокращения в названии табличных переменных, как у вас,
p.s. не получается пишется раздельно и без мягкого знака |
|
18.03.2010, 15:15 | #9 |
Участник
|
Цитата:
А из-за названии переменных - зачем писать custInvoiceTrans если custInvTrns и понятно и покороче ... . Ну в форум , наверно , буду постараться писать полное - обещяю ... . Теперь так быстро copy/paste вышло ... |
|
18.03.2010, 15:34 | #10 |
Участник
|
Цитата:
Сообщение от 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 ); } Код: nPrdSum += Currency::Amount(custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 )) Код: 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 |
Участник
|
Цитата:
Сообщение от S.Kuskov
если вы уверены, в том что вот здесь вам совершенно точно не нужно округление:
Код: nPrdSum += Currency::Amount(custInvTrns.LineAmount * ( custInvJrn.ExchRate ? custInvJrn.ExchRate / 100 : 1 )) Код: 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; |
|