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