Страница 1 из 2

Подсчет суммы из источника

Добавлено: 17 май 2007, 07:02
Валерий В. Шинкевич
вы как то писали, что вычислить сумму по полю в источнике можно следующим образом:
Используйте, пожалуйста в BeforePrint страницы следующий код:
Code:
Data1.First();
while (!Data1.IsEof)
{
MySum += Data1.Val;
Data1.Next();
}

я попробовал применить такой код, но ....
из источника выбирается только первая запись, хотя их там несколько....

проверял таким образом

Код: Выделить всё

Data1.First();
while (!Data1.IsEof)
{
Console.WriteLine("получил");
MySum += Data1.Val;
Data1.Next();
}
выводит "получил" один раз.

вопрос: Что я делаю не так ? При каких условиях этот код будет работать (, ведь я уже как-то раньше попробовал использовать такой способ подсчета и оно работало)?


Подсчет суммы из источника

Добавлено: 17 май 2007, 07:28
Edward
Подскажите, пожалуйста, каким образом в Data1 попадают данные (SQL запрос, XML, бизнес объект).

Спасибо.

Подсчет суммы из источника

Добавлено: 17 май 2007, 07:32
Валерий В. Шинкевич
Edward писал(а):Подскажите, пожалуйста, каким образом в Data1 попадают данные (SQL запрос, XML, бизнес объект).

Спасибо.
список бизнес объктов - реализует IList
передается через RegData

Подсчет суммы из источника

Добавлено: 17 май 2007, 08:08
Валерий В. Шинкевич
у меня в отчете несколько страниц...

попробовал перенести код в событие Before_Print первой страницы - (до этого было на второй, т.е. там где и нужно было использовать результат, но что только я не делал - и добавлял бенды с этим источником и в разные события вставлял и т.п. - не работало)

и вроде как заработало, но с какого то момента я заметил, что BeforePrint вызывается дважды!!! ( я проверил - на других страницах, бендах, у всего отчета события пустые)

и такой код

Код: Выделить всё

Data1.First();
while (!Data1.IsEof)
{
Console.WriteLine(Data1.Owner.View);
MySum += Data1.Summ;
Data1.Next();
};
стал выдавать
Операция №0000001 от 16.05.2007
Операция №0000002 от 16.05.2007
Операция №0000001 от 16.05.2007
Операция №0000002 от 16.05.2007
и сумма естественно удвоенная

Подсчет суммы из источника

Добавлено: 17 май 2007, 09:25
Edward
wash_ai писал(а):и вроде как заработало, но с какого то момента я заметил, что BeforePrint вызывается дважды!!! ( я проверил - на других страницах, бендах, у всего отчета события пустые)
BeforePrint может действительно вызываться 2 раза, если все компоненты поместились на одной странице, кроме последнего, и он был перенесен на следующую страницу. В этом случае BeforePrint будет вызвано второй раз. Для расчетов лучше использовать событие BeginRender.
Еще лучше и проще для расчета сумм использовать Totals:

Код: Выделить всё

Totals.Sum(DataSource,Expression)
Спасибо.

Подсчет суммы из источника

Добавлено: 17 май 2007, 13:44
Валерий В. Шинкевич
Edward писал(а): BeforePrint может действительно вызываться 2 раза, если все компоненты поместились на одной странице, кроме последнего, и он был перенесен на следующую страницу. В этом случае BeforePrint будет вызвано второй раз.
Но у меня даже полстраницы не занято ...
Edward писал(а): Для расчетов лучше использовать событие BeginRender.
Еще лучше и проще для расчета сумм использовать Totals:

Код: Выделить всё

Totals.Sum(DataSource,Expression)
не нашел в ClassReference такого.... там только

Код: Выделить всё

public static decimal Sum(
   object data, 
   StiReport report, 
   string name
)
да и не подойдет оно мне, мне не все записи считать надо, а по условию, например

Код: Выделить всё

polist.First();
while (!polist.IsEof)
{
if (polist.Operation == (int) POpCodes.Repayment)
{
	RepaymentSum += polist.Insurance;
}
polist.Next();
}

Подсчет суммы из источника

Добавлено: 17 май 2007, 14:08
Vital
Можно так с использованием Totals:

Код: Выделить всё

Totals.Sum(polist, polist.Operation == (int) POpCodes.Repayment ? polist.Insurance : 0)
Пришлите Ваш отчет на суппорт мы посмотрим в чем проблема с BeforePrint.

Спасибо.

Подсчет суммы из источника

Добавлено: 17 май 2007, 14:17
Валерий В. Шинкевич
Ладно, поместил код

Код: Выделить всё

Console.WriteLine(polist.Count);
polist.First();
while (!polist.IsEof)
{
if (polist.Operation == (int) POpCodes.Repayment)
{
    RepaymentSum += polist.Insurance;
}
polist.Next();
}
в BeginRender первой страницы Page1_BeginRender() всё работает как требуется, без дубликатов, но почему при помещении этого кода в BeginRender второй страницы Page2_BeginRender() получаю только первую запись из polist ( а polist.Count = 1) ???

(также пробовал поместить этот код в Report_BeginRender() - вообще не получаю ни одной записи )

так чем же объясняется такое поведение ???

P.S. точно такое же поведение при использовании BeforePrint


Подсчет суммы из источника

Добавлено: 17 май 2007, 14:24
Валерий В. Шинкевич
Vital писал(а):Можно так с использованием Totals:

Код: Выделить всё

Totals.Sum(polist, polist.Operation == (int) POpCodes.Repayment ? polist.Insurance : 0)
Спасибо.
хорошо, запомню на будущее

Подсчет суммы из источника

Добавлено: 17 май 2007, 16:39
Vital
Ладно, поместил код

Код: Выделить всё

Console.WriteLine(polist.Count);
polist.First();
while (!polist.IsEof)
{
if (polist.Operation == (int) POpCodes.Repayment)
{
    RepaymentSum += polist.Insurance;
}
polist.Next();
}
в BeginRender первой страницы Page1_BeginRender() всё работает как требуется, без дубликатов, но почему при помещении этого кода в BeginRender второй страницы Page2_BeginRender() получаю только первую запись из polist ( а polist.Count = 1) ???
А polist источник данных где то используется еще?
(также пробовал поместить этот код в Report_BeginRender() - вообще не получаю ни одной записи )

так чем же объясняется такое поведение ???

P.S. точно такое же поведение при использовании BeforePrint
В событии BeginRender отчета данные еще не подсоеденены.

Спасибо.