Totals.Sum в коде события

Обсуждение Stimulsoft Reports.NET
Ответить
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Totals.Sum в коде события

Сообщение Леонид »

Добрый день!

Коротко суть проблемы. В событии объекта отчёта BeginRender() пишем:

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

  qrMain.Connect(); -- коннект к БД Oracle
  bool isDemandVoucher = (qrMain.N_TOTAL_SUM == 0);
Подключаемся к БД Oracle, qrMain - объект DataSource (от StiOracleDatabase), колонка N_TOTAL_SUM is Decimal. Возвращает значение первой строки DataTable :shock:, а не всех строк указанной колонки.

Пока мы прописали во всех отчётах такой код вместо 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"];
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Totals.Sum в коде события

Сообщение 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) - работает корректно.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Totals.Sum в коде события

Сообщение Леонид »

В самом начале я написал, что 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"];
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Totals.Sum в коде события

Сообщение Aleksey »

Здравствуйте,

Не получается воспроизвести проблему с Totals.Sum().

Спасибо.
Вложения
Capture.PNG
Capture.PNG (57.83 КБ) 5026 просмотров
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Totals.Sum в коде события

Сообщение Леонид »

Ясно. Но вопрос на какой вы базе тестировали?

К сожалению не сможем вам прислать пример, т.к. в любом случае нужно подключение к базе Oracle.
Если у вас есть возможность, проверьте, пожалуйста тоже самое, но именно через Stimulsoft.Report.Dictionary.StiOracleDatabase.
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Totals.Sum в коде события

Сообщение Aleksey »

Здравствуйте,

Проверили на Oracle. Работает корректно.

Спасибо.
Вложения
Capture.PNG
Capture.PNG (63.53 КБ) 5007 просмотров
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Totals.Sum в коде события

Сообщение Леонид »

Интересно.

Провели ещё некоторые эксперименты, и наконец заработало, разница была вот в чём. Мы делали так:

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

decimal nTotalSum = Totals.Sum(qrMain.N_TOTAL_SUM);
а надо было так

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

decimal nTotalSum = Totals.Sum(qrMain, qrMain.N_TOTAL_SUM);
Но честно говоря, не понимаю разницы, поясните, пожалуйста.
В любом случае проблема решена, спасибо!
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Totals.Sum в коде события

Сообщение Aleksey »

Здравствуйте,

При использовании Totals функций, в качестве первого параметра можно задать источник, по которому необходимо суммировать - либо бэнд, либо указать источник данных.
В вашем случае, так как суммирование происходит до построения отчета, необходимо указывать источник данных.

Спасибо.
Ответить