|
|
#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)) Подчеркивал плохож место красным . Что я здесь плохо делаю ? Спасибо заранее за помощь ! С уважением , Римантас |
|
|
|
|
#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))
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#3 |
|
Ищущий знания...
|
и ещё вопросик, а полученный Вами query из метода qInvSum2 в дальнейшем нигде не изменяется в коде? может ExistsJoin подставляется ещё где нибудь?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
|
|
#4 |
|
Участник
|
Цитата:
Просто qBSSum показывает EXIST JOIN .... |
|
|
|
|
#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))
|
|
|
|
|
#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 ); Теперь резултат хороший . Спасибо Вам ! :-) |
|
|
|
|
#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 );
}Спасибо !
|
|
|
|
|
#8 |
|
Гость
|
Простите, что я не по теме, но меня вымораживают такие сокращения в названии табличных переменных, как у вас,
p.s. не получается пишется раздельно и без мягкого знака |
|
|
|
|
#9 |
|
Участник
|
Цитата:
А из-за названии переменных - зачем писать custInvoiceTrans если custInvTrns и понятно и покороче ... . Ну в форум , наверно , буду постараться писать полное - обещяю ... . Теперь так быстро copy/paste вышло ...
|
|
|
|
|
#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 );
} |
|
|
|
|
#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; |
|
|