20.07.2009, 12:42 | #1 |
Участник
|
lookup для ItemId iz InventTable + InventDim + InventSum
Здравствуйте, есть одна проблема может кто знает
для ItemId сделать lookup с выборкой по AvailPhysical из InventSum, я в коде в коментарии оставил вопрос на последнем этапе X++: queryBuildDataSource = query.addDataSource(tablenum(InventTable)); queryBuildRange = queryBuildDataSource.addRange(fieldnum(InventTable, ItemId)); queryBuildRange.value(Criteria1); //addn new data source queryBuildDataSource1 = queryBuildDataSource.addDataSource(tablenum(InventItemLocation)); queryBuildDataSource1.addLink(fieldnum(InventTable, ItemId),fieldnum(InventItemLocation,ItemId)); queryBuildDataSource1.joinMode(JoinMode::InnerJoin); queryBuildDataSource1.addRange(fieldnum(InventItemLocation, wMSPickingLocation)).value(criteria2); queryBuildDataSource2 = queryBuildDataSource1.addDataSource(tablenum(InventDim)); queryBuildDataSource2.addLink(fieldnum(InventItemLocation,InventDimId),fieldnum(InventDim,InventDimId)); queryBuildDataSource2.joinMode(JoinMode::InnerJoin); queryBuildDataSource2.addRange(fieldnum(InventDim, InventLocationId)).value(criteria3); //вот тут join получается тока для InventDim либо InventTable, а мне нужно что б брал //значение с 2 таблиц сразу InventDim.InventDimId i InventTable.ItemId queryBuildDataSource3 = queryBuildDataSource.addDataSource(tablenum(InventSum)); queryBuildDataSource3.addlink(fieldnum(InventTable, ItemId),fieldnum(InventSum,ItemId)); queryBuildDataSource3.addlink(fieldnum(InventDim, InventDimId),fieldnum(InventSum,InventDimId)); queryBuildDataSource3.joinMode(JoinMode::InnerJoin); queryBuildDataSource3.addRange(fieldnum(InventSum, AvailPhysical)).value(strfmt("%1",">0")); |
|
20.07.2009, 12:52 | #2 |
----------------
|
например, перестроить отчет так:
InventTable +ItemId InventItemLocation +ItemId +InventDimId InventSum +InventDimId InventDim |
|
|
За это сообщение автора поблагодарили: stalker25 (1). |
20.07.2009, 13:05 | #3 |
Участник
|
Вы верно заметили, но проблема, что в таком виде lookup работает в разы дольше! может всё таки есть спопсоб перетащить itemid в addlink в InventSum, см код выше?
|
|
20.07.2009, 13:58 | #4 |
Участник
|
Цитата:
X++: Range range; ; // ... range = strfmt( @"((%1.%2==%3.%4))", queryBuildDataSource2.name(), fieldstr(InventDim, InventDimId), queryBuildDataSource3.name(), fieldstr(InventSum, InventDimId) ); queryBuildDataSource3.addRange(fieldnum(InventSum, InventDimId)).value( range ); |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
20.07.2009, 14:14 | #5 |
Ищущий знания...
|
можно добавить FetchMode, мне помогало при линках... например:
X++: queryBuildDataSource3.FetchMode(QueryFetchMode::One2One);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
20.07.2009, 14:19 | #6 |
Ищущий знания...
|
проверил у себя, вот получился рабочий вариант построения запроса, подцепились все датасорсы
X++: queryBuildDataSource = query.addDataSource(tablenum(InventTable)); queryBuildRange = queryBuildDataSource.addRange(fieldnum(InventTable, ItemId)); queryBuildRange.value(Criteria1); //addn new data source queryBuildDataSource1 = queryBuildDataSource.addDataSource(tablenum(InventItemLocation)); queryBuildDataSource1.addLink(fieldnum(InventTable, ItemId),fieldnum(InventItemLocation,ItemId)); queryBuildDataSource1.joinMode(JoinMode::InnerJoin); queryBuildDataSource1.addRange(fieldnum(InventItemLocation, wMSPickingLocation)).value(criteria2); queryBuildDataSource1.fetchMode(QueryFetchMode::One2One); queryBuildDataSource2 = queryBuildDataSource1.addDataSource(tablenum(InventDim)); queryBuildDataSource2.addLink(fieldnum(InventItemLocation,InventDimId),fieldnum(InventDim,InventDimId)); queryBuildDataSource2.joinMode(JoinMode::InnerJoin); queryBuildDataSource2.addRange(fieldnum(InventDim, InventLocationId)).value(criteria3); queryBuildDataSource2.fetchMode(QueryFetchMode::One2One); //вот тут join получается тока для InventDim либо InventTable, а мне нужно что б брал //значение с 2 таблиц сразу InventDim.InventDimId i InventTable.ItemId queryBuildDataSource3 = queryBuildDataSource.addDataSource(tablenum(InventSum)); queryBuildDataSource3.addlink(fieldnum(InventTable, ItemId),fieldnum(InventSum,ItemId)); queryBuildDataSource3.addlink(fieldnum(InventDim, InventDimId),fieldnum(InventSum,InventDimId)); queryBuildDataSource3.joinMode(JoinMode::InnerJoin); queryBuildDataSource3.addRange(fieldnum(InventSum, AvailPhysical)).value(strfmt("%1",">0")); queryBuildDataSource3.fetchMode(QueryFetchMode::One2One);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: stalker25 (1). |
20.07.2009, 15:50 | #7 |
Участник
|
спасибо, проверил работают оба способа.
|
|