Страница 1 из 1
Totals.Sum в коде события
Добавлено: 26 сен 2017, 14:13
Леонид
Добрый день!
Коротко суть проблемы. В событии объекта отчёта BeginRender() пишем:
Код: Выделить всё
qrMain.Connect(); -- коннект к БД Oracle
bool isDemandVoucher = (qrMain.N_TOTAL_SUM == 0);
Подключаемся к БД Oracle, qrMain - объект DataSource (от StiOracleDatabase), колонка N_TOTAL_SUM is Decimal. Возвращает
значение первой строки DataTable

, а не всех строк указанной колонки.
Пока мы прописали во всех отчётах такой код вместо Sum:
Код: Выделить всё
decimal nTotalSum = 0;
foreach (Stimulsoft.Report.Dictionary.StiRow row in qrMain.Rows)
nTotalSum += (decimal)row["N_TOTAL_SUM"];
То есть, после коннекта к БД данные уже есть, их остаётся только просуммировать (или вызвать любую другую агрегирующую функцию).
Пожалуйста, почините функцию Totals.Sum().
Выяснился ещё один неприятный нюанс. Когда в запросе возвращается одна строка, то foreach() не срабатывает ни разу, поэтому workaround выглядит так:
Код: Выделить всё
decimal nTotalSum = (qrMain.Rows.Count == 1) ? (decimal)qrMain.Rows[0]["N_TOTAL_SUM"] : 0;
foreach (Stimulsoft.Report.Dictionary.StiRow row in qrMain.Rows)
nTotalSum += (decimal)row["N_TOTAL_SUM"];
Re: Totals.Sum в коде события
Добавлено: 28 сен 2017, 21:21
Aleksey
Здравствуйте,
Есть особенности при работает с StiRow. Не рекомендуем его для прохода по таблицам. Вы можете использовать NET-овский DataRow для этих целей:
Код: Выделить всё
foreach (System.Data.DataRow row in qrMain.DataTable.Rows)
> Подключаемся к БД Oracle, qrMain - объект DataSource (от StiOracleDatabase), колонка N_TOTAL_SUM is Decimal. Возвращает значение первой строки
Не совсем понятно в какой момент возвращается значение. Проверили Totals.Sum(DataSorce, Column) - работает корректно.
Спасибо.
Re: Totals.Sum в коде события
Добавлено: 29 сен 2017, 10:41
Леонид
В самом начале я написал, что Totals.Sum() не работает в событии BeginRender() самого отчёта, т.е. не Page1 например, а именно объекта отчёта,
сразу после коннекта к БД, при этом данные там есть. Можете проверить на любой базе, например на SQLite, думаю особой разницы не будет.
Переделали все отчёты, вместо:
Код: Выделить всё
decimal nTotalSum = (qrMain.Rows.Count == 1) ? (decimal)qrMain.Rows[0]["N_TOTAL_SUM"] : 0;
foreach (Stimulsoft.Report.Dictionary.StiRow row in qrMain.Rows)
nTotalSum += (decimal)row["N_TOTAL_SUM"];
на
Код: Выделить всё
decimal nTotalSum = 0;
foreach (System.Data.DataRow row in qrMain.DataTable.Rows)
nTotalSum += (decimal)row["N_TOTAL_SUM"];
Re: Totals.Sum в коде события
Добавлено: 29 сен 2017, 11:00
Aleksey
Здравствуйте,
Не получается воспроизвести проблему с Totals.Sum().
Спасибо.
Re: Totals.Sum в коде события
Добавлено: 29 сен 2017, 11:21
Леонид
Ясно. Но вопрос на какой вы базе тестировали?
К сожалению не сможем вам прислать пример, т.к. в любом случае нужно подключение к базе Oracle.
Если у вас есть возможность, проверьте, пожалуйста тоже самое, но именно через Stimulsoft.Report.Dictionary.StiOracleDatabase.
Re: Totals.Sum в коде события
Добавлено: 02 окт 2017, 10:19
Aleksey
Здравствуйте,
Проверили на Oracle. Работает корректно.
Спасибо.
Re: Totals.Sum в коде события
Добавлено: 02 окт 2017, 11:31
Леонид
Интересно.
Провели ещё некоторые эксперименты, и наконец заработало, разница была вот в чём. Мы делали так:
Код: Выделить всё
decimal nTotalSum = Totals.Sum(qrMain.N_TOTAL_SUM);
а надо было так
Код: Выделить всё
decimal nTotalSum = Totals.Sum(qrMain, qrMain.N_TOTAL_SUM);
Но честно говоря, не понимаю разницы, поясните, пожалуйста.
В любом случае проблема решена, спасибо!
Re: Totals.Sum в коде события
Добавлено: 02 окт 2017, 15:58
Aleksey
Здравствуйте,
При использовании Totals функций, в качестве первого параметра можно задать источник, по которому необходимо суммировать - либо бэнд, либо указать источник данных.
В вашем случае, так как суммирование происходит до построения отчета, необходимо указывать источник данных.
Спасибо.