15.09.2008, 10:45 | #1 |
Участник
|
Суммирование строк в таблице
Доброе день.Вот программа.Подскажите как прописать условие суммирования,
т.к есть одинаковые номенклатуры, забитые в один и тотже день, а суммы разные как суммировать. X++: { ProdJournalTable ProdJournalTable; ProdJournalRoute ProdJournalRoute; ProdJournalRoute ProdJournalRoute_1; ProdJournalRoute ProdJOurnalRoute_2; TmpProdJournalRouteOutTime tmpTable; ProdTable ProdTable; int nDay; SysOperationProgress sop; int cntItems; date fromDate = 01\09\2008; date toDate = 31\09\2008; ; delete_from tmpTable; select count (Recid)from Prodjournaltable exists join ProdJournalRoute where ProdJournalRoute.JournalId==ProdJournalTable.JournalId&& ProdJournalTable.Createddate >= fromDate && ProdJournalTable.createdDate <= toDate && (ProdJournalRoute.WrkCtrId == '113' || ProdJournalRoute.WrkCtrId == '135'); cntItems = ProdJournalTable.RecId; sop = SysOperationProgress::newGeneral('','',cntItems); // преоброзование шкалы while select createddate,journalid,posted,posteddate From ProdJournalTable exists join ProdJournalRoute where ProdJournalRoute.JournalId==ProdJournalTable.JournalId&& ProdJournalTable.Createddate >= fromDate && ProdJournalTable.createdDate <= toDate && (ProdJournalRoute.WrkCtrId == '113' || ProdJournalRoute.WrkCtrId == '135') { select ProdJournalRoute_1 order by oprnum desc where ProdJournalRoute_1.JournalId == ProdJournalTable.JournalId; select ProdTable where ProdTable.ProdId == ProdJournalRoute_1.ProdId; select ProdJournalRoute_2 where ProdJournalRoute_2.OprId like '045*' && ProdJournalRoute_2.JournalId == ProdJournalTable.JournalId; sop.incCount(); /* info ( strfmt("%1,%2,%3", ProdJournalTable.createdDate, ProdJournalTable.JournalId, toDay() - ProdJournalTable.createdDate) );*/ tmpTable.clear(); tmpTable.ITEMID =ProdTable.ItemId; tmpTable.WRKCTRID=ProdjournalRoute_1.WrkCtrId; tmpTable.Qty=ProdJournalRoute_1.QtyGood+ProdJournalRoute_1.QtyError; if(ProdJournalTable.Posted==noyes::No) { tmpTable.Days= (toDay() - ProdJournalTable.createdDate)+1; //toDay() - ProdjournalRoute_1.transDate; } else { tmpTable.Days=(ProdJournalTable.PostedDate - ProdJournalTable.createdDate)+1 ; } tmpTable.Normal=noYes::No; if ( tmpTable.WRKCTRID == '135') { nDay = 1; } if ( tmpTable.WRKCTRID == '113') { if (ProdJournalRoute_2 != NULL) { nDay=5; } else { nDay = 3; } } if (tmpTable.Days > nDay) tmpTable.Normal=NoYes::No; else tmpTable.Normal=NoYes::Yes ; tmpTable.insert(); } |
|
15.09.2008, 11:28 | #2 |
Программатор
|
select sum(Amount) from MyTable group by ItemId; Не то?
|
|
15.09.2008, 11:36 | #3 |
Участник
|
|
|
15.09.2008, 11:41 | #4 |
Программатор
|
не понимаю....
|
|
15.09.2008, 11:45 | #5 |
Участник
|
|
|
15.09.2008, 11:52 | #6 |
Программатор
|
select sum(Qty) from MyTable group by ItemId where всякие условия;
info(strfmt("%1", MyTable.qty)); Я настаиваю на этом |
|
|
За это сообщение автора поблагодарили: jeky (1). |
15.09.2008, 12:18 | #7 |
Участник
|
|
|
16.09.2008, 09:41 | #8 |
Участник
|
Доброе утро.Подскажите, как мне присоединить while select с остальными селектами которые внизу.
X++: while select sum(Qty) from tmpTable group by ItemId { select sum(Qty)from tmpTable_1 group by ItemId where tmpTable.Normal==noyes::Yes; select sum (Qty) from tmpTable_2 group by itemid where tmpTable.Normal==noYes::No; |
|
16.09.2008, 09:46 | #9 |
Программатор
|
X++: while select sum(Qty) from tmpTable group by ItemId, Normal { info(strFmt("%1, %2, %3", tmpTable.itemid, tmpTable.normal, tmpTable.qty)); } |
|
16.09.2008, 09:49 | #10 |
Участник
|
|
|
16.09.2008, 10:30 | #11 |
Участник
|
Вот что я прописал.Но ни чего не получилось,номенклатуры повторяются а суммы не складываются , может надо указать поле складов (WRKCTRID '113','115' ) .
X++: { tmpProdJournalRouteOutTime tmpTable; tmpProdJournalRouteOutTime tmpTable_1; tmpProdJournalRouteOutTime tmpTable_2; while select sum(Qty) from tmpTable group by ItemId,Normal { select sum(Qty)from tmpTable_1 group by ItemId where tmpTable.Normal==noyes::Yes; select sum (Qty) from tmpTable_2 group by itemid where tmpTable.Normal==noYes::No; info(strfmt("%1,2%,3%,4%", tmpTable.ITEMID, tmpTable.WRKCTRID, tmpTable.Qty, tmpTable.Normal)); } } |
|
16.09.2008, 10:37 | #12 |
Программатор
|
Зачем селекты внутри while??? Куда вы смотрите? Какой склад? Я ничо не понимаю. Вам нужно сложить количества в разрезе ITEMID/NORMAL или как? Qty - это не СУММА это Количество.
Последний раз редактировалось Sada; 16.09.2008 в 10:40. |
|
16.09.2008, 10:52 | #13 |
Участник
|
Цитата:
Есть таблица, содержащая поля Itemid,Wrkctrid(склады 113,135),Qty(сумма),Normal(поле содержит условие либо да, либо нет ). Тавк вот допустим есть повторяющиеся наменклатуры со складом 113, с разной суммой, и Normal( да ) 005.40.0443 113 1 416.000000000000 1 005.40.0443 113 1 127.000000000000 1 так же и со складом 135 МБ.01.004.2 135 1 100.000000000000 1 МБ.01.004.2 135 1 100.000000000000 1 как мне сделать чтоб получилось вот так 005.40.0443 113 1 543.000000000000 1 МБ.01.004.2 135 1 200.000000000000 1 X++: while select sum(Qty) from tmpTable group by ItemId,Normal { select sum(Qty)from tmpTable_1 group by ItemId where tmpTable.Normal==noyes::Yes; select sum (Qty) from tmpTable_2 group by itemid where tmpTable.Normal==noYes::No; |
|
16.09.2008, 11:03 | #14 |
Программатор
|
X++: while select sum(Qty) from tmpTable group by ItemId,Normal,Wrkctrid { info(strfmt("%1,2%,3%,4%", tmpTable.ITEMID, tmpTable.WRKCTRID, tmpTable.Qty, tmpTable.Normal)); } |
|
16.09.2008, 11:32 | #15 |
Участник
|
Нет нет вы были правы, мне нужно сложить количества в разрезе ITEMID/WRKCTRID
вот что мне надо.Как мне дописать условие.Еще раз Извините X++: while select tmpTable group by ItemId,Wrkctrid { select sum(Qty)from tmpTable_1 group by ItemId where tmpTable.Normal==noyes::Yes; select sum (Qty) from tmpTable_2 group by itemid where tmpTable.Normal==noYes::No; |
|
16.09.2008, 11:42 | #16 |
Программатор
|
забутьте про Ваши селекты в цикле. Мой пост выше сложит количества как надо.
|
|
16.09.2008, 12:33 | #17 |
Участник
|
Цитата:
Вот вся программа посмотрите, что не так. X++: ProdJournalTable ProdJournalTable; ProdJournalRoute ProdJournalRoute; ProdJournalRoute ProdJournalRoute_1; ProdJournalRoute ProdJOurnalRoute_2; TmpProdJournalRouteOutTime tmpTable; tmpprodjournalrouteouttime tmpTable_1; tmpprodjournalrouteouttime tmpTable_2; ProdTable ProdTable; int nDay; SysOperationProgress sop; int cntItems; date fromDate = 01\09\2008; date toDate = 31\09\2008; ; delete_from tmpTable; select count (Recid)from Prodjournaltable exists join ProdJournalRoute where ProdJournalRoute.JournalId==ProdJournalTable.JournalId&& ProdJournalTable.Createddate >= fromDate && ProdJournalTable.createdDate <= toDate && (ProdJournalRoute.WrkCtrId == '113' || ProdJournalRoute.WrkCtrId == '135'); cntItems = ProdJournalTable.RecId; sop = SysOperationProgress::newGeneral('','',cntItems); // преоброзование шкалы while select createddate,journalid,posted,posteddate From ProdJournalTable exists join ProdJournalRoute where ProdJournalRoute.JournalId==ProdJournalTable.JournalId&& ProdJournalTable.Createddate >= fromDate && ProdJournalTable.createdDate <= toDate && (ProdJournalRoute.WrkCtrId == '113' || ProdJournalRoute.WrkCtrId == '135') { select ProdJournalRoute_1 order by oprnum desc where ProdJournalRoute_1.JournalId == ProdJournalTable.JournalId; select ProdTable where ProdTable.ProdId == ProdJournalRoute_1.ProdId; select ProdJournalRoute_2 where ProdJournalRoute_2.OprId like '045*' && ProdJournalRoute_2.JournalId == ProdJournalTable.JournalId; sop.incCount(); /* info ( strfmt("%1,%2,%3", ProdJournalTable.createdDate, ProdJournalTable.JournalId, toDay() - ProdJournalTable.createdDate) );*/ tmpTable.clear(); tmpTable.ITEMID =ProdTable.ItemId; tmpTable.WRKCTRID=ProdjournalRoute_1.WrkCtrId; tmpTable.Qty=ProdJournalRoute_1.QtyGood+ProdJournalRoute_1.QtyError; if(ProdJournalTable.Posted==noyes::No) { tmpTable.Days= (toDay() - ProdJournalTable.createdDate)+1; //toDay() - ProdjournalRoute_1.transDate; } else { tmpTable.Days=(ProdJournalTable.PostedDate - ProdJournalTable.createdDate)+1 ; } tmpTable.Normal=noYes::No; if ( tmpTable.WRKCTRID == '135') { nDay = 1; } if ( tmpTable.WRKCTRID == '113') { if (ProdJournalRoute_2 != NULL) { nDay=5; } else { nDay = 3; } } if (tmpTable.Days > nDay) tmpTable.Normal=NoYes::No; else tmpTable.Normal=NoYes::Yes ; tmpTable.insert(); } X++: while select sum(Qty) from tmpTable group by ItemId,Normal { select sum(Qty)from tmpTable_1 group by ItemId where tmpTable.Normal==noyes::Yes; select sum (Qty) from tmpTable_2 group by itemid where tmpTable.Normal==noYes::No; |
|
16.09.2008, 12:40 | #18 |
Программатор
|
я пас....
|
|
16.09.2008, 13:07 | #19 |
Ищущий знания...
|
может:
X++: while select tmpTable group by ItemId { select sum(Qty)from tmpTable_1 where tmpTable_1.Normal==noyes::Yes && tmpTable_1.ItemId == tmpTable.ItemId; select sum (Qty) from tmpTable_2 where tmpTable_2.Normal==noYes::No && tmpTable_2.ItemId == tmpTable.ItemId;
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
16.09.2008, 13:28 | #20 |
Участник
|
Нет, все равно не складывается количество,вот так получается
10.4.2003 135 1 1000.000000000000 1 10.4.2003 135 1 1000.000000000000 1 Я что думаю может есть проблема с Wrkctrid и Itemid. Может их как совместить, или что нибудь типа этого. Не знаю голова кругом |
|