В этом обновлении мы сосредоточились на ускорении вычислений, улучшении совместимости с .NET 9 и упрощении понимания изменений.
Переход на инвариантную математику – до 2 раз быстрее!
Одним из самых значительных улучшений стало отказ от типа "вариант" в пользу инвариантной математики. Это изменение привело к существенному ускорению построения и пересчета куба, в некоторых случаях – более чем в 2 раза!
Кроме того, теперь куб работает корректно в различных локализациях, включая нестандартные (отличные от латиницы), что расширяет его применение для международных пользователей.
Разделение изменений по продуктам
Теперь обновления FastCube .NET разделены на разные продукты (WinForms, Web, Mono и общий FastCube .NET). Это сделало процесс обновления более прозрачным – вы можете сразу понять, какие изменения затрагивают нужную версию.
Исправлена ошибка считывания потока из сжатого файла
Ранее в некоторых случаях происходила некорректная обработка сжатых файлов, из-за чего данные могли загружаться неправильно или вовсе не загружаться.
Теперь этот баг устранён, и механизм работы со сжатыми файлами полностью исправлен. Это означает:
Корректное чтение данных из архивных файлов.
Более стабильная работа при загрузке больших файлов.
Отсутствие ошибок в многопоточном режиме, что особенно важно для Web-приложений.
Если ваш проект активно использует сжатие данных, рекомендуем обновиться до версии 2025.2, чтобы избежать возможные проблемы.
Сигнатура файла для куба теперь неизменяемая (const вместо static)
Ранее сигнатура файла была объявлена как static, что позволяло менять её в ходе выполнения программы. В ряде случаев это могло привести к ошибкам, связанным с изменением структуры данных или даже повреждению файла.
В новой версии:
- Сигнатура теперь объявлена как const, что делает её неизменяемой на уровне кода.- Гарантирована целостность структуры файла, независимо от изменений в коде программы.- Повышена стабильность работы с файлами куба в разных средах, включая Web и Mono.
Это особенно важно для разработчиков, которые работают в многопользовательских и распределённых системах.
Совместимость с .NET 9
Одним из ключевых улучшений стало добавление поддержки .NET 9. Теперь FastCube .NET полностью совместим с последней версией платформы, что позволяет использовать новые возможности и улучшения, предложенные Microsoft. Это важное обновление для разработчиков, которые переходят на .NET 9 или планируют использовать его в своих проектах.
Отдельно отметим, что поддержка новых версий позволяет обеспечить стабильность работы продукта и интеграцию с последними технологиями.
Обновление поддерживаемых версий .NET
Основной версией теперь считается .NET 8, что соответствует текущим стандартам для большинства корпоративных проектов. Тем не менее, сохранена поддержка .NET 6, которая представляет собой долгосрочную версию с расширенной поддержкой.
Кроме того, как уже было упомянуто, добавлена поддержка .NET 9, что даёт вам гибкость при выборе платформы для работы с FastCube .NET, будь то стабильность (через .NET 6) или новейшие возможности и улучшения производительности (.NET 9).
Исправления и улучшения в демонстрационном примере
В демонстрационном примере для формата boolean была исправлена ошибка, из-за которой корректность отображения данных была нарушена. Теперь данный формат работает правильно и не вызывает ошибок, что улучшает опыт пользователей, работающих с демонстрационными примерами.
В демонстрационном кубе "Sales by months" ранее возникали ситуации, когда заголовки отображались некорректно. Теперь эта ошибка устранена, и названия полей выводятся корректно, обеспечивая точность и удобство работы с данными.
Улучшение сериализации данных
Одним из важных улучшений является оптимизация процесса сериализация данных. Были добавлены новые методы и установлены свойства, благодаря чему значения по умолчанию теперь реже сериализуются.
Снижение объема сериализуемых данных уменьшает нагрузку на систему при сохранении и загрузке информации. Кроме того, эти изменения способствует улучшению производительности, что будет особенно заметно при работе с большими наборами данных.
Список изменений
FastCube .NET WinForms
[Common]- исправлена ошибка, при которой поток из сжатого файла считывался некорректно;* сигнатура файла для куба теперь имеет модификатор const вместо static и не может быть изменена;
FastCube .NET Web
[Common]- исправлена ошибка, при которой поток из сжатого файла считывался некорректно;* сигнатура файла для куба теперь имеет модификатор const вместо static и не может быть изменена;
FastCube .NET Mono
[Common]- исправлена ошибка, при которой поток из сжатого файла считывался некорректно;* сигнатура файла для куба теперь имеет модификатор const вместо static и не может быть изменена;
FastCube .NET
[Common]+ добавлена совместимость с .NET 9;+ обновлены версии .NET, основной версией теперь считается .NET 8, а поддерживаемые целевые платформы включают .NET 6, .NET 8 и .NET 9;* скрыта часть свойств от пользователя в редакторе WinForms;* тип "вариант" был заменён на вариантную математику;* улучшена сериализация, добавлены методы и установлены свойства, благодаря чему значения по умолчанию реже сериализуются;- исправлено отображение названия поля в демонстрационном кубе "Sales by months";- исправлена ошибка в демонстрационном примере для boolean format.
Другие критические изменения
Общие изменения для FastCube Web, FastCube WinForms и FastCube Mono
Устаревшие делегаты. Были заменены на совместимые, т.к. был убран тип Variant теперь вместо него используется боксинг через Object:
Нажмите сюда, чтобы развернуть
FastReport.Olap.Slice.Value2Delegate(System.Int32, System.Int32, FastReport.Olap.Utils.Variant, FastReport.Olap.Utils.Variant, System.Int32)
FastReport.Olap.Slice.ValueDelegate(System.Int32, System.Int32, FastReport.Olap.Utils.Variant, System.Int32)
FastReport.Olap.Slice.SliceChartDataHandler(FastReport.Olap.Slice.Slice, FastReport.Olap.Slice.ChartParams, System.String[], System.String[], FastReport.Olap.Utils.Variant[], System.Int32)
Устаревшие поля. Следующие поля были заменены на соответствующие свойства:
Нажмите сюда, чтобы развернуть
FastReport.Olap.Types.BoolValue -> public System.Boolean Value
FastReport.Olap.Types.ByteValue -> public System.Byte Value
FastReport.Olap.Types.DateTimeValue -> public System.DateTime Value
FastReport.Olap.Types.DecimalValue -> public System.Decimal Value
FastReport.Olap.Types.DoubleValue -> public System.Double Value
FastReport.Olap.Types.FloatValue -> public System.Single Value
FastReport.Olap.Types.IntValue -> public System.Int32 Value
FastReport.Olap.Types.LongValue -> public System.Int64 Value
FastReport.Olap.Types.SByteValue -> public System.SByte Value
FastReport.Olap.Types.ShortValue -> public System.Int16 Value
FastReport.Olap.Types.StringValue -> public System.String Value
FastReport.Olap.Types.TimeSpanValue -> public System.TimeSpan Value
FastReport.Olap.Types.UIntValue -> public System.UInt32 Value
FastReport.Olap.Types.ULongValue -> public System.UInt64 Value
FastReport.Olap.Types.UShortValue -> public System.UInt16 Value
FastReport.Olap.Slice.MeasureCell -> public FastReport.Olap.Utils.Variant Value
Устаревшие методы. Были заменены на совместимые методы, но вместо типа Variant теперь используется боксинг данных через Object что позволяет передавать не значения с копированием памяти а ссылку на объект.
Нажмите сюда, чтобы развернуть
FastReport.Olap.Types.BoolDTP -> public FastReport.Olap.Types.BoolValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.ByteDTP -> public FastReport.Olap.Types.ByteValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.CommonDataTypeProcessor``2<T, T2> -> public System.Int32 AddNewVariantValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.CommonDataTypeProcessor``2<T, T2> -> public T VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.DateTimeDTP -> public FastReport.Olap.Types.DateTimeValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.DecimalDTP -> public FastReport.Olap.Types.DecimalValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.DoubleDTP -> public FastReport.Olap.Types.DoubleValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.FloatDTP -> public FastReport.Olap.Types.FloatValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.IntDTP -> public FastReport.Olap.Types.IntValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.LongDTP -> public FastReport.Olap.Types.LongValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.Range -> public System.Boolean Match(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.Ranges -> public System.Boolean Match(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.SByteDTP -> public FastReport.Olap.Types.SByteValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.ShortDTP -> public FastReport.Olap.Types.ShortValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.StringDTP -> public FastReport.Olap.Types.StringValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.TimeSpanDTP -> public FastReport.Olap.Types.TimeSpanValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.UIntDTP -> public FastReport.Olap.Types.UIntValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.ULongDTP -> public FastReport.Olap.Types.ULongValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Types.UShortDTP -> public FastReport.Olap.Types.UShortValue VariantToValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Slice.AxisContainer -> public FastReport.Olap.Utils.Variant GetValue(System.Int32, System.Int32)
FastReport.Olap.Slice.MeasuresContainer -> public FastReport.Olap.Utils.Variant GetMeasureValue(System.Int32, System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Slice.MeasuresContainer -> public FastReport.Olap.Utils.Variant GetSecondAdditionalTotalMeasureValue(System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Slice.Slice -> public System.Object Calc(FastReport.Olap.Types.Expression, FastReport.Olap.Utils.Variant)
FastReport.Olap.Slice.Slice -> public FastReport.Olap.Utils.Variant CalcFuncForSelectedArea(FastReport.Olap.Types.AggregateFunction, FastReport.Olap.Types.Selection)
FastReport.Olap.Slice.Slice -> public FastReport.Olap.Utils.Variant GetMeasureValue(System.Int32, System.Int32)
FastReport.Olap.Slice.SliceField -> public FastReport.Olap.Utils.Variant GetUniqueValue(System.Int32)
FastReport.Olap.Slice.SliceField -> public FastReport.Olap.Utils.Variant GetUniqueValueFromRecord(System.Int32)
FastReport.Olap.Slice.SliceField -> public System.Int32 GetUniqueValueIdAndVariantFromRecord(System.Int32, FastReport.Olap.Utils.Variant&)
FastReport.Olap.Slice.UniqueValuesFieldFilter -> public System.Void SetAllowedUniqueValueByValue(FastReport.Olap.Utils.Variant, System.Boolean)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValueFromParentValueByAppend(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 GetValueIdAtValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CommonUniqueValues -> public FastReport.Olap.Utils.Variant GetVariantByOrder(System.Int32)
FastReport.Olap.Cube.CommonUniqueValues -> public FastReport.Olap.Utils.Variant GetVariantByValueId(System.Int32)
FastReport.Olap.Cube.Cube -> public FastReport.Olap.Utils.Variant GetSourceValue(System.Int32, System.Int32)
FastReport.Olap.Cube.Cube -> public FastReport.Olap.Utils.Variant GetSourceValue(System.Int32, FastReport.Olap.Cube.CubeField)
FastReport.Olap.Cube.Cube -> public System.Int32 GetSourceValueIdAndVariant(System.Int32, System.Int32, FastReport.Olap.Utils.Variant&)
FastReport.Olap.Cube.Cube -> public System.Int32 GetSourceValueIdAndVariant(System.Int32, FastReport.Olap.Cube.CubeField, FastReport.Olap.Utils.Variant&)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean AddUniqueValue(System.Int32, FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean AddUniqueValue(FastReport.Olap.Cube.CubeField, FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean SetFieldValue(System.Int32, FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean SetFieldValue(FastReport.Olap.Cube.CubeField, FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.DatePartUniqueValues -> public System.DateTime GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.DayOfWeekPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.DayOfYearPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.DayPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.HalfYearPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.HourPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.MillisecondPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.MinutePartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.MonthPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.QuarterPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.SecondPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.TimePartUniqueValues -> public System.TimeSpan GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValueFromParentValueByAppend(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public T2 GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 GetValueIdAtValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public FastReport.Olap.Utils.Variant GetVariantByOrder(System.Int32)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public FastReport.Olap.Utils.Variant GetVariantByValueId(System.Int32)
FastReport.Olap.Cube.WeekNumberPartUniqueValues -> public System.Byte GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.YearMonthPartUniqueValues -> public System.Int32 GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Cube.YearPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetColOffsetTotalValueForDims(System.Int32, System.String)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetColOffsetValue(System.Int32)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetColOffsetValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetColRowOffsetValue(System.Int32, System.Int32)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetColRowOffsetWithLevelValue(System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetRowOffsetTotalValueForDims(System.Int32, System.String)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetRowOffsetValue(System.Int32)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetRowOffsetValue(FastReport.Olap.Utils.Variant)
FastReport.Olap.Code.Measure -> public FastReport.Olap.Utils.Variant GetTotalValueForDims(System.String)
FastReport.Olap.Code.Measures -> public FastReport.Olap.Utils.Variant GetDetailValue(System.Int32, System.String)
Устаревшие свойства. Следующие свойства были заменены на использование боксинга вместо типа Variant:
Нажмите сюда, чтобы развернуть
FastReport.Olap.Types.BoolValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.ByteValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.DateTimeValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.DecimalValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.DoubleValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.FloatValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.IntValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.LongValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.Range -> FastReport.Olap.Utils.Variant HighRange { public get; public set; }
FastReport.Olap.Types.Range -> FastReport.Olap.Utils.Variant LowRange { public get; public set; }
FastReport.Olap.Types.SByteValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.ShortValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.StringValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.TimeSpanValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.UIntValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.ULongValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Types.UShortValue -> FastReport.Olap.Utils.Variant Variant { public get; public set; }
FastReport.Olap.Slice.CalculateMeasureEventArgs -> FastReport.Olap.Utils.Variant Data { public get; public set; }
FastReport.Olap.Slice.CalculateValueEventArgs -> FastReport.Olap.Utils.Variant Value { public get; public set; }
FastReport.Olap.Slice.SliceField -> FastReport.Olap.Utils.Variant CurrentValue { public get; }
FastReport.Olap.Code.ContainerFieldItem -> FastReport.Olap.Utils.Variant CurrentValue { public get; }
FastReport.Olap.Code.Dimension -> FastReport.Olap.Utils.Variant CurrentValue { public get; }
FastReport.Olap.Code.Dimensions -> FastReport.Olap.Utils.Variant DetailValue { public get; }
FastReport.Olap.Code.Measure -> FastReport.Olap.Utils.Variant CurrentValue { public get; }
Устаревшие типы. Следующие типы устарели и были целиком удалены, т.к. теперь они не используются.
FastReport.Olap.Utils.Variant
FastReport.Olap.Types.IVariantable
FastReport.Olap.Types.UnAssigned
Новые делегаты заменили старые, которые использовали тип Variant.
FastReport.Olap.Slice.Value2Delegate(System.Int32, System.Int32, System.Object, System.Object, System.Int32)
FastReport.Olap.Slice.ValueDelegate(System.Int32, System.Int32, System.Object, System.Int32)
FastReport.Olap.Slice.SliceChartDataHandler(FastReport.Olap.Slice.Slice, FastReport.Olap.Slice.ChartParams, System.String[], System.String[], System.Object[], System.Int32)
Новое поле заменило существующие, теперь вместо типа Variant используется боксинг через Object.
FastReport.Olap.Slice.MeasureCell -> public System.Object Value
Новые методы заменили старые, где использовался тип Variant. Теперь вместо него используется боксинг и передача данных идёт по ссылке, а не по значению, что позволило значительно вырасти скорости.
Нажмите сюда, чтобы развернуть
FastReport.Olap.Types.Range -> public System.Boolean Match(System.Object)
FastReport.Olap.Types.Ranges -> public System.Boolean Match(System.Object)
FastReport.Olap.Slice.AxisContainer -> public System.Object GetValue(System.Int32, System.Int32)
FastReport.Olap.Slice.MeasuresContainer -> public System.Object GetMeasureValue(System.Int32, System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Slice.MeasuresContainer -> public System.Object GetSecondAdditionalTotalMeasureValue(System.Int32, System.Int32, System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Slice.Slice -> public System.Object Calc(FastReport.Olap.Types.Expression, System.Object)
FastReport.Olap.Slice.Slice -> public System.Object CalcFuncForSelectedArea(FastReport.Olap.Types.AggregateFunction, FastReport.Olap.Types.Selection)
FastReport.Olap.Slice.Slice -> public System.Object GetMeasureValue(System.Int32, System.Int32)
FastReport.Olap.Slice.SliceField -> public System.Object GetUniqueValue(System.Int32)
FastReport.Olap.Slice.SliceField -> public System.Object GetUniqueValueFromRecord(System.Int32)
FastReport.Olap.Slice.SliceField -> public System.Int32 GetUniqueValueIdAndVariantFromRecord(System.Int32, System.Object&)
FastReport.Olap.Slice.UniqueValuesFieldFilter -> public System.Void SetAllowedUniqueValueByValue(System.Object, System.Boolean)
FastReport.Olap.Cube.BaseDataReaderDataSet -> public System.Object GetValue(System.Int32)
FastReport.Olap.Cube.BaseDataSet -> public System.Object GetValue(System.Int32)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValue(System.Object)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValueFromParentValue(System.Object)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 AddNewVariantValueFromParentValueByAppend(System.Object)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Int32 GetValueIdAtValue(System.Object)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Object GetVariantByOrder(System.Int32)
FastReport.Olap.Cube.CommonUniqueValues -> public System.Object GetVariantByValueId(System.Int32)
FastReport.Olap.Cube.Cube -> public System.Object GetSourceValue(System.Int32, System.Int32)
FastReport.Olap.Cube.Cube -> public System.Object GetSourceValue(System.Int32, FastReport.Olap.Cube.CubeField)
FastReport.Olap.Cube.Cube -> public System.Int32 GetSourceValueIdAndVariant(System.Int32, System.Int32, System.Object&)
FastReport.Olap.Cube.Cube -> public System.Int32 GetSourceValueIdAndVariant(System.Int32, FastReport.Olap.Cube.CubeField, System.Object&)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean AddUniqueValue(System.Int32, System.Object)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean AddUniqueValue(FastReport.Olap.Cube.CubeField, System.Object)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean SetFieldValue(System.Int32, System.Object)
FastReport.Olap.Cube.CubeManualLoadEventArgs -> public System.Boolean SetFieldValue(FastReport.Olap.Cube.CubeField, System.Object)
FastReport.Olap.Cube.DatePartUniqueValues -> public System.DateTime GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.DayOfWeekPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.DayOfYearPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.DayPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.HalfYearPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.HourPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.IBaseDataSet -> public System.Object GetValue(System.Int32)
FastReport.Olap.Cube.MillisecondPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.MinutePartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.MonthPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.QuarterPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.SecondPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.TimePartUniqueValues -> public System.TimeSpan GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 GetValueIdAtValue(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValue(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValueFromParentValue(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Int32 AddNewVariantValueFromParentValueByAppend(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public T2 GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Object GetVariantByOrder(System.Int32)
FastReport.Olap.Cube.UniqueValues``2<T, T2> -> public System.Object GetVariantByValueId(System.Int32)
FastReport.Olap.Cube.WeekNumberPartUniqueValues -> public System.Byte GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.YearMonthPartUniqueValues -> public System.Int32 GetChildValueFromParentValue(System.Object)
FastReport.Olap.Cube.YearPartUniqueValues -> public System.Int16 GetChildValueFromParentValue(System.Object)
FastReport.Olap.Code.Measure -> public System.Object GetColOffsetTotalValueForDims(System.Int32, System.String)
FastReport.Olap.Code.Measure -> public System.Object GetColOffsetValue(System.Int32)
FastReport.Olap.Code.Measure -> public System.Object GetColOffsetValue(System.Object)
FastReport.Olap.Code.Measure -> public System.Object GetColRowOffsetValue(System.Int32, System.Int32)
FastReport.Olap.Code.Measure -> public System.Object GetColRowOffsetWithLevelValue(System.Int32, System.Int32, System.Int32, System.Int32)
FastReport.Olap.Code.Measure -> public System.Object GetRowOffsetTotalValueForDims(System.Int32, System.String)
FastReport.Olap.Code.Measure -> public System.Object GetRowOffsetValue(System.Int32)
FastReport.Olap.Code.Measure -> public System.Object GetRowOffsetValue(System.Object)
FastReport.Olap.Code.Measure -> public System.Object GetTotalValueForDims(System.String)
FastReport.Olap.Code.Measures -> public System.Object GetDetailValue(System.Int32, System.String)
Новые свойства заменили или дополнили устаревшие:
Нажмите сюда, чтобы развернуть
FastReport.Olap.Types.BoolValue -> System.Boolean Value { public get; public set; }
FastReport.Olap.Types.ByteValue -> System.Byte Value { public get; public set; }
FastReport.Olap.Types.DateTimeValue -> System.DateTime Value { public get; public set; }
FastReport.Olap.Types.DecimalValue -> System.Decimal Value { public get; public set; }
FastReport.Olap.Types.DoubleValue -> System.Double Value { public get; public set; }
FastReport.Olap.Types.FloatValue -> System.Single Value { public get; public set; }
FastReport.Olap.Types.IntValue -> System.Int32 Value { public get; public set; }
FastReport.Olap.Types.LongValue -> System.Int64 Value { public get; public set; }
FastReport.Olap.Types.Range -> System.Object HighRange { public get; public set; }
FastReport.Olap.Types.Range -> System.Object LowRange { public get; public set; }
FastReport.Olap.Types.SByteValue -> System.SByte Value { public get; public set; }
FastReport.Olap.Types.ShortValue -> System.Int16 Value { public get; public set; }
FastReport.Olap.Types.StringValue -> System.String Value { public get; public set; }
FastReport.Olap.Types.TimeSpanValue -> System.TimeSpan Value { public get; public set; }
FastReport.Olap.Types.UIntValue -> System.UInt32 Value { public get; public set; }
FastReport.Olap.Types.ULongValue -> System.UInt64 Value { public get; public set; }
FastReport.Olap.Types.UShortValue -> System.UInt16 Value { public get; public set; }
FastReport.Olap.Slice.CalculateMeasureEventArgs -> System.Object Data { public get; public set; }
FastReport.Olap.Slice.CalculateValueEventArgs -> System.Object Value { public get; public set; }
FastReport.Olap.Slice.SliceField -> System.Object CurrentValue { public get; }
FastReport.Olap.Format.CustomFormat -> System.String DefaultFormatValue { public get; public set; }
FastReport.Olap.Code.ContainerFieldItem -> System.Object CurrentValue { public get; }
FastReport.Olap.Code.Dimension -> System.Object CurrentValue { public get; }
FastReport.Olap.Code.Dimensions -> System.Object DetailValue { public get; }
FastReport.Olap.Code.Measure -> System.Object CurrentValue { public get; }
Новые типы:
FastReport.Olap.Utils.VMath - заменил тип Variant, теперь математика происходит через инвариантные вычисления с помощью боксинга и преобразование типа.
FastReport.Olap.Types.IValueStruct``1<T> - интерфейс для реализации собственного типа боксинга.
FastReport.Olap.Types.SimpleCompareAction - перечисление для типов действий инвариантной математики.
Изменения для FastCube WinForms и FastCube Mono
Устаревшие поле было заменено на технически совместимое.
FastReport.Olap.Controls.SizingInfo -> public FastReport.Olap.Utils.Variant Data
Новое поле:
FastReport.Olap.Controls.SizingInfo -> public System.Int32 Data
Рады представить вам релиз FastReport Business Graphics .NET! В этом обновлении мы сконцентрировались на повышении совместимости, улучшении поддержки современных платформ и подготовке к будущим версиям .NET.
Совместимость с .NET 9
Одним из ключевых изменений стало добавление необходимых атрибутов в компоненты для обеспечения полной совместимости с .NET 9. Это означает, что теперь FastReport Business Graphics .NET корректно работает в самых актуальных средах, сохраняя стабильность, производительность и поддержку всех новых возможностей фреймворка.
Если вы планируете переходить на .NET 9 или уже используете его в своих проектах, можете быть уверены, что наши компоненты готовы к работе без дополнительных доработок!
Обновление поддерживаемых версий .NET
Мы обновили список целевых платформ, ориентируясь на современные требования разработчиков:
Основной версией теперь считается .NET 8 – это стабильный и производительный фреймворк, который рекомендован для большинства проектов.
Также сохраняется поддержка .NET 6 – для тех, кто еще не обновился, но использует долгосрочную поддержку (LTS).
Добавлена поддержка .NET 9 – для разработчиков, которые хотят использовать самые свежие технологии и возможности.
Благодаря этим изменениям FastReport Business Graphics .NET остается актуальным инструментом для работы с бизнес-графикой в ваших проектах.
Список изменений
[Common]+ добавлены атрибуты в компоненты необходимые для совместимости с .NET 9;+ обновлены версии .NET, основной версией теперь считается .NET 8, а поддерживаемые целевые платформы включают .NET 6, .NET 8 и .NET 9.
Мы рады объявить о выпуске кроссплатформенной библиотеки для выполнения сложных скриптов на C# под названием FastScript .NET.
Библиотеки для выполнения сложных скриптов предоставляют возможность динамической генерации и исполнения кода, что может быть полезно в различных сценариях, таких как разработка плагинов, создание сценариев для пользователей и т. д.
Работа в ограниченных средах. FastScript .NET построен по классической схеме «лексер-парсер-интерпретатор». Он не использует компиляцию в машинный код и поэтому может работать в средах, где кодогенерация запрещена (Native AOT, iOS, WASM). Скорость работы сопоставима с другими решениями, использующими интерпретацию (lua, js), но она ниже, чем у скомпилированного C# кода.
C# в качестве скриптового языка. FastScript .NET имеет полную интеграцию с платформой .NET и позволяет использовать все библиотеки, фреймворки и API. Единая кодовая база на C# для скриптов позволяет избежать необходимости поддерживать код на нескольких языках.
Экономия памяти. При каждой компиляции скрипта FastScript .NET не создает отдельные dll сборки, а сохраняет информацию в кэше. Это сэкономит память вашего устройства.
С версии 2025.1.21 FastScript .NET входит в состав WinForms, WPF, WEB, Mono и Avalonia паков. Также наша библиотека входит в состав Ultimate .NET решения со всеми исходными кодами.
Узнать больше
Дарим скидку 50% на FastReport .NET и VCL лицензий Team и Site для клиентов с истекшей подпиской. До 31 марта получите доступ к новым функциям, улучшенному дизайнеру и поддержке за полцены, даже если ваш грейс-период уже закончился!
Мы выпускаем обновления 2 раза в год, поэтому действующая подписка гарантирует поддержку самых последних версий сред, отчеты с постоянно улучшаемым функционалом и интерфейсом, доступ к технической поддержке и многое другое.
Напишите нам, чтобы заменить устаревшую лицензию на новую!
В честь праздника дарим скидку в 30% на FastReport VCL редакции Ultimate. Это отличная возможность выгодно приобрести генератор отчётов самой обширной поставки с исходным кодом, инструментами для кроссплатформенной разработки и возможностями OLAP!
13 и 14 февраля успейте сэкономить от 39000 рублей и приобрести для своего приложения:
Полные исходные коды
Дизайнер отчётов с диалоговыми формами
Клиент-серверные компоненты для VCL и Lazarus
Создание отчётов для VCL, FMX и Lazarus
Конверторы из Quick Report, Report Builder, Rave Reports
Поддержку экспорта шаблонов в другие форматы данных
Систему многомерного анализа FastCube для VCL, Lazarus и FMX
Гибкую и открытую архитектуру с поддержкой кастомных объектов отчётов
Хранение готовых документов в облачных хранилищах Google Drive, Next Cloud, OneDrive, Amazon S3, Outlook, Gmail
FastScript и FastQueryBuilder в комплекте
Заморозьте скидку и оплатите позже!
Акция действует до 14 февраля, 23.59. Если вы не можете произвести оплату до этого момента, напишите нам и заморозьте свою скидку на 6 дней, чтобы оплатить позже.
С 1 января 2025 года организации и индивидуальные предприниматели, применяющие упрощенную систему налогообложения, признаются плательщиками налога на добавленную стоимость.
С нового года компаниям с доходами менее 60 млн рублей за 2024 год необходимо будет выставлять счета-фактуры с пометкой "Без налога (НДС)", вести книгу продаж, но декларации по НДС представлять не нужно.
При доходах за 2024 год свыше 60 млн рублей необходимо начислять НДС с реализации и выставлять счета-фактуры с налогом 7% или 5%.
В обоих случаях перед компаниями стоит нелегкая задача реорганизации документооборота, а перед разработчиками - создание новых шаблонов документов.
Мы позаботились о вас и добавили в наш каталог готовых шаблонов унифицированных форм отчеты, необходимые для ведения бизнеса в 2025 году. Их можно использовать в генераторах отчетов как на базе Delphi, так и .NET. Скачать их, а также многие другие шаблоны документов, можно абсолютно бесплатно:
УПД
Счет-фактура
Товарная накладная
Компания АО «НТЦ ИТ РОСА» официально подтвердила совместимость программных продуктов FastReport VCL 2025.1 и FastReport .NET Avalonia 2025.1 с операционной системой РОСА «Хром» версии 12. Это важное достижение для пользователей, работающих с данными системами, поскольку оно обеспечивает более стабильную и эффективную работу приложений на базе этих программных решений. Кроме того, компания «Быстрые отчеты» получила официальные сертификаты совместимости, подтверждающие успешное тестирование и интеграцию продуктов.
Совместимость с ОС РОСА «Хром» 12 открывает новые возможности для разработчиков и пользователей, позволяя им создавать и использовать надёжные приложения, которые могут эффективно работать в различных условиях. Это особенно важно для организаций, которым требуется высокая стабильность и безопасность при работе с важными данными и процессами.
Таким образом, обновление совместимости программных продуктов FastReport с ОС РОСА «Хром» 12 является значимым шагом вперёд в области разработки и использования качественных программных решений, способствуя повышению эффективности работы с отчетами и документами любой сложности.