В этом обновлении мы сосредоточились на ускорении вычислений, улучшении совместимости с .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
Мы рады объявить о выпуске кроссплатформенной библиотеки для выполнения сложных скриптов на 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 является значимым шагом вперёд в области разработки и использования качественных программных решений, способствуя повышению эффективности работы с отчетами и документами любой сложности.
Друзья, этот год стал для нас насыщенным и продуктивным!
Основные достижения
Релиз новых продуктов: запустили FastReport Avalonia – инструмент для кроссплатформенной работы над отчетами для Windows, MacOS и Linux.
Технологическое партнерство: провели испытания наших продуктов на совместимость с новыми операционными системами и СУБД: Альт, РЕД СОФТ, Astra Linux.
Изменили подход к формированию продуктов: разбили редакции так, чтобы вам не приходилось покупать ненужный функционал.
Прошли в финал премии «Приоритет: Цифра-2024» с облачным построителем отчетов МоиОтчеты Облако.
Какие изменения произошли в продуктах?
Для Delphi и Lazarus направления:
Улучшили работу с иерархическими данными в FastReport для Delphi и Lazarus с помощью добавления компонента TfrTreeView.
Добавили дополнительные возможности работы с картами с помощью поддержки форматов GeoJSON, TopoJSON.
Улучшили цифровые подписи, добавили бесконечную ширину таблиц, расширили возможности штрих-кодов, улучшили точность отображения и совместимость экспортных фильтров PDF, HTML5, SVG, DOCX и XLSX.
А в самой последней версии усилили возможности работы с отчётами в сложных сценариях и обеспечили более высокий уровень интеграции с современными средами разработки, в том числе RAD Studio 12.2.
В следующем году планируем добавлять новые компоненты, добавить поддержку RFID tag EPC в ZPL, новые транспорты, улучшать фильтры экспорта и многое другое.
Для .NET направления:
Мы решили отказаться от устаревшего слоя совместимости .NET Standard 2.0 - 3.1 и .NET 5 в наших библиотеках. Теперь минимальная поддерживаемая версия .NET - .NET 6, а минимальный поддерживаемый фреймворк - .NET Framework 4.6.2.
С последней версии библиотеки FastReport .NET, FastReport Business Graphics .NET и FastCube .NET стали поддерживать .NET 9. Для этого мы отказались от бинарной сериализации (BinaryFormatter).
FastCube .NET
Ещё в этому году мы перезапустили FastCube .NET – библиотеку для работы с OLAP-кубами и оперативного анализа больших данных. Теперь FastCube.Core.Web имеет поддержку на Linux и MacOS. Это открывает возможность разрабатывать веб-приложения с OLAP-функциональностью на любом сервере.
Одним из ключевых изменений в релизе FastCube .NET 2025.1 стало полное удаление зависимости от библиотеки System.Drawing.Common в модуле FastCube.Core. Это сделано для повышения совместимости библиотеки с различными платформами и улучшения производительности.
FastReport Online Designer
Не обошли изменения и визуальный дизайнер шаблонов FastReport Online Designer. За 2024 год был добавлен новый объект «Искрографик», стало доступным создание направляющих линий на странице и реализовано новое меню компонентов. При редактировании кода отчета был добавлен функционал Intellisense, он обеспечивает автоматическое дополнение кода и подсказки по синтаксису, что позволяет пользователям быстрее и точнее писать код прямо в веб-интерфейсе.
Будущие планы
В 2025 планируем добавить новый плагин, который позволит конвертировать отчеты пользователей из формата MS Word в .frx. Помимо этого, в дальнейшем будет реализовано подключение к Google Sheets. В первой половине года выйдет FastScript .NET для выполнения скриптов. Новая библиотека будет содержать технологию компиляции, которая позволяет преобразовать промежуточный код в машинный код для конкретной платформы (Native AOT).
Мы работаем над полной экосистемностью продуктов разных направлений, поэтому в следующем году также будем развивать их интеграцию друг с другом.
Для сервисных решений:
В МоиОтчеты Облако улучшили систему автоматического выполнения задач, добавили печать из браузера, разработали хранилище шрифтов, доработали SDK.
Улучшили удобство и скорость работы API
Добавили новые API-методы работы с облаком, позволяющие выполнять привычные операции быстрее и удобнее: массовое копирование, удаление, перемещение файлов; новый метод загрузки, который позволяет загружать большие файлы и тратить меньше ресурсов; методы получения прав текущего пользователя на файлы, группы, задачи и источники данных; добавили возможность получать и редактировать параметры отчёта не открывая сам отчёт на редактирование.
Сделали панель пользователя удобнее
Улучшили работу с Онлайн Дизайнером: добавили предпросмотр Richtext, шаблоны стилей для ChartObject. Дали возможность редактировать аватар пользователя, сделали новую корзину для удаления файлов, улучшили страницу работы с Задачами; доработали источники данных, дав возможность использовать хранимые процедуры и добавлять пользовательские таблицы из SQL.
Улучшили МоиОтчеты Корпоративный Сервер
Сделали панель администратора удобнее, добавили мастер установки для МоиОтчеты Корпоративный Сервер. В 2025 выпустим новый продукт, добавим передачу параметров в StaticPreview UI, добавим интеграцию с каталогом шаблонов унифицированных форм МоиОтчеты Магазин.
Мы благодарим вас за доверие в 2024. Двигаемся дальше и вместе создаём будущее!
С Новым годом!