Показать сообщение отдельно
Старый 08.06.2006, 13:45   #44  
sparur is offline
sparur
Участник
 
334 / 25 (1) +++
Регистрация: 19.05.2006
Цитата:
Сообщение от Sada
Покажите ваш ужасный запрос (если конечно это не секрет). А мы посмотрим, что там не так или так
ну раз Вы так просите то получите:

q = new Query();
qbdsISum = q.addDataSource(tableNum(InventSum));
qbdsITable = qbdsISum.addDataSource(tableNum(InventTable));
qbdsITable.fetchMode(QueryFetchMode::One2One);
qbdsITable.relations(true);
qbdsIDim = qbdsISum.addDataSource(tableNum(InventDim));
qbdsIDim.fetchMode(QueryFetchMode::One2One);
qbdsIDim.relations(true);

//указываем поля, необходимые нам в результате запроса
qbdsISum.addSelectionField(fieldnum(InventSum,LastUpdDatePhysical),SelectionField::Max);
qbdsISum.addSelectionField(fieldnum(InventSum,InventDimId),SelectionField:database);
qbdsISum.addSelectionField(fieldnum(InventSum,ItemId),SelectionField:database);
qbdsISum.addSelectionField(fieldnum(InventSum,PostedQty),SelectionField::Sum);
qbdsISum.addSelectionField(fieldnum(InventSum,Received),SelectionField::Sum);
qbdsISum.addSelectionField(fieldnum(InventSum,Deducted),SelectionField::Sum);
qbdsISum.addSelectionField(fieldnum(InventSum,Picked),SelectionField::Sum);
qbdsISum.addSelectionField(fieldnum(InventSum,Registered),SelectionField::Sum);
qbdsISum.addSelectionField(fieldnum(InventSum,PostedValue),SelectionField::Sum);
//добавляем ограничение по таблице InventSum
qbdsISum.addRange(fieldnum(InventSum,LastUpdDatePhysical)).value(".."+Fdate.valueStr());
//добавляем ограничение по таблице InventTable
qbdsITable.addRange(fieldnum(InventTable,ItemId));
qbdsITable.addRange(fieldnum(InventTable,ItemGroupId));
//добавляем ограничение по таблице InventDim
qbdsIDim.addRange(fieldnum(Inventdim, InventLocationId));
qbdsIDim.addRange(fieldnum(Inventdim, InventMOLId));
qbdsIDim.addRange(fieldnum(Inventdim, InventBatchId));
//забиваем значение ограничений(фильтров)
if (TMC.valueStr()!="")
qbdsITable.FindRange(fieldnum(InventTable,ItemId)).value(TMC.valueStr());
if (GroupTMC.valueStr()!="")
qbdsITable.FindRange(fieldnum(InventTable,ItemGroupId)).value(GroupTMC.valueStr());
if (Sklad.valueStr()!="")
qbdsIDim.FindRange(fieldnum(InventDim,InventLocationId)).value(Sklad.valueStr());
if (MOL.valueStr()!="")
qbdsIDim.FindRange(fieldnum(InventDim,InventMOLId)).value(MOL.valueStr());
if (Batch.valueStr()!="")
qbdsIDim.FindRange(fieldnum(InventDim,InventBatchId)).value(Batch.valueStr());
qbdsISum.addSortField(fieldnum(InventSum,ItemId));
qbdsISum.orderMode(OrderMode::GroupBy);
//делаем группировку
for (i=LevelСount-1;i>=0;i--)
//for (i=0;i<LevelСount;i++)
{
level=SelList.getItem(i).data();
[tableid,fieldid]=conpeek(groupfields,level);
switch (tableid)
{
case tableNum(InventTable):
switch (fieldid)
{
case fieldNum(InventTable,ItemId):
qbdsITable.addSortField(fieldid);
qbdsITable.orderMode(OrderMode::GroupBy);
//qbdsITable.addSortIndex(indexnum(InventTable,ItemIdx));
break;
case fieldNum(InventTable,ItemGroupId):
qbdsITable.addSortField(fieldid);
qbdsITable.orderMode(OrderMode::GroupBy);
//qbdsITable.addSortIndex(indexnum(InventTable,GroupItemIdx));
break;
}
break;
case tablenum(InventDim) :
qbdsISum.addSortField(fieldNum(InventSum,InventDimId));
qbdsISum.orderMode(OrderMode::GroupBy);
switch (fieldId)
{
case fieldNum(InventDim,InventLocationId):
qbdsIDim.addSortField(fieldid);
qbdsIDim.orderMode(OrderMode::GroupBy);
//qbdsIDim.addSortIndex(indexnum(InventDim,LocationIdIdx));
break;
case fieldNum(InventDim,InventMOLId):
qbdsIDim.addSortField(fieldid);
qbdsIDim.orderMode(OrderMode::GroupBy);
//qbdsIDim.addSortIndex(indexnum(InventDim,InventMOLIdIdx));
break;
case fieldNum(InventDim,InventBatchId):
qbdsIDim.addSortField(fieldid);
qbdsIDim.orderMode(OrderMode::GroupBy);
//qbdsIDim.addSortIndex(indexnum(InventDim,BatchIdIdx));
break;
}
break;
}
}

здесь ситуация следующая: есть список (ListView) в котором хранятся поля, по которым надо группировать, в каждом элементе ListView в поле data хранится контейнер с идентификатором Таблицы и идентификатором поля. Собственно конструкции switch и обеспечивают вытягивание из data этого контейнера и точно определяют по каким полям и из каких таблиц надо делать группировки!!
вот такие пироги... смотрите