Страница 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 :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"];

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 функций, в качестве первого параметра можно задать источник, по которому необходимо суммировать - либо бэнд, либо указать источник данных.
В вашем случае, так как суммирование происходит до построения отчета, необходимо указывать источник данных.

Спасибо.