Пример отчета в сильно упрощенном виде
Таблица 1: Названия точек.
- Point_ID int not null
- PointName varchar(max)
Таблица 2: Суммы по точкам за период отчета
- Point_ID int not null
- Сумма1 double
- Статус1 int
- ДополнительныйСтатус1 int
- Сумма2 double
- Статус2 int
- ДополнительныйСтатус2 int
- Сумма3 double
- Статус3 int
- ДополнительныйСтатус3 int
Таблица 3: Детальные данные по точкам за период отчета
- Point_ID int not null
- DT DateTime not null
- Значение1 double
- Статус1 int
- ДополнительныйСтатус1 int
- Значение2 double
- Статус2 int
- ДополнительныйСтатус2 int
- Значение3double
- Статус3 int
- ДополнительныйСтатус3 int
Надо вывести сначала таблицу с суммами по точкам, а потом графики с детальными данными.
У каждого значения 2 статуса. Каждый статус - битовая маска. Причем если в основном статусе не ноль, то значение дополнительного статуса неважно.
Если основной статус не ноль, то значение должно быть нарисовано красным цветом, а если дополнительный статус не ноль - то желтым цветом.
Поэтому перед отчетом надо написать легенду "Красные значения наверняка некорректные, а желтые - требуют повышенного внимания".
Причем легенду надо спрятать, если все значения корректные, как обычно и бывает.
И такая логика со статусами есть во многих отчетах, потому хочется написать одну функцию, которая сможет взять таблицу, пробежать по ней и сказать:
"В данной таблице результат OR над всеми плохими статусами == 0xXXXXX, а результат OR над всеми подозрительными статусами = 0xXXXX". Причем дополнительные статусы надо вычислять, только если основные статусы не ноль.
Произвести данное вычисление на сервере не получится.
Сейчас я для этих целей вызываю функцию
Totals.MaxI, и передаю ей callback, который для каждой строки источника данных проверяет поля статусов и накапливает из в локальной переменной класса. Т.е. мое вычисление является "побочным эффектом" по отношении к функции
Max. Так как на функцию
MaxI я не нашел описания на уровне "для программиста", я решил уточнить, корректно ли мое предположение, что ее можно использовать как аналог оператора
ForEach