Обнаруженные баги в Fastreport .net

1910111315

Комментарии

  • отредактировано 01:28
    написал: »
    Таким образом экспериментально установленно, что на определенном моменте FastReport'у не нравится символ "\n"...

    Можете прислать тестовое приложение, чтобы я его запустил и повторил ошибку? Так я не могу сказать ничего определенного.
  • отредактировано 01:28
    Я добавил одну интересную фичу - хранение данных в файле отчета. В первую очередь для того, чтобы было легче искать баги в отчетах. Фича будет доступна в версии 1.0.66 - должна к утру собраться.
    Что нужно сделать: у всех таблиц в отчете включить св-во StoreData, сохранить отчет под новым именем и прислать его мне.
  • ShtirlizShtirliz Москва
    отредактировано 01:28
    Посмотрел я щас исходники, нашел так долго мной ожидаемый экспорт в PDF.
    Но, собрать я не могу не хватает проекта FastReport.Editor, а в готовой библиотеке данного экспорта нет.

    Посмотрите плиз....
  • отредактировано 01:28
    FastReport.Editor в исходниках не поставляется, т.к. это сторонняя либа. Смотрите в programmer's manual, как собрать проект FastReport.dll из исходников. Или подождите еще немного, пока мы доделаем экспорт и включим его в поставку.
  • отредактировано 01:28
    Доброго времени суток.

    Проблема:

    Есть DataSet, в нём 2 таблицы, по ним построена реляция. Данные в таблицы заносятся вручную, т.е. перед каждым отображением отчёта делаю
    dataset.Clear() и далее dataset.tables["table1"].Rows.Add() и т.д.
    Так вот, при построении отчёта master-detail, отчёт выводится только первый раз, последующие разы получаю ощибку:

    {"Эта строка удалена из таблицы и не содержит данных. BeginEdit() позволит создать в этой строке новые данные."}

    Ошибка проявляется только на отчётах master-detail. Специально попробовал на том же датасете построить отчёт в stimulsoft - всё работает ок.
  • ShtirlizShtirliz Москва
    отредактировано 01:28
    В XML экспорте не экспортируются настройки страницы и разрывы страницы.
    Или я чего-то недопонимаю.
  • отредактировано December 2008
    Может что-то не понял. Однако по есть проблема с параметризированными запросами. Проблема с типами данных. Строковые проходит - все остальные начинает ругаться о невозможности преобразования. Получилось следующее создал запрос вызов ХЧ указал параметры в мастере поставил строковые - набор данных построился. Зато в момент выполнения - ошибка. Меняем типы параметров - нас немного матерят - говорит ошибка. Набор остаётся. Запрос выполняется. Вот собственно проблема уходит если установить значение по умолчанию DefaultValue (Может всё таки фича?)
  • CouRageCouRage Санкт-Петербург
    отредактировано 01:28
    Здравствуйте!

    Поздравляю всех С Новым Годом! Всех благ всем. :)

    Обнаружилось пара проблем в FR.NET :) .

    1. Проблема с бэндами "Заголовок группы", если их два и более для одного бэнда данных - по второму (внтутреннему) бэнду группировка не происходит. Пример выслал на tz@fast-report.com. В примере, у региона "OR" два города "Portland" - записи должны были объединится, смотрите на Outline.
    2. Проблема с парсером выражений, вроде.
    В том же примере у объекта TextObject "Text8" включите свойство AllowExpressions - отчет перестанет компилироваться из-за необъявленной переменной varTest. В поле выражение переменной указано в двойных кавычках - "[varTest]". Если кавычки убрать - все ок.
  • отредактировано 01:28
    german_c написал: »
    Есть DataSet, в нём 2 таблицы, по ним построена реляция. Данные в таблицы заносятся вручную, т.е. перед каждым отображением отчёта делаю
    dataset.Clear() и далее dataset.tables["table1"].Rows.Add() и т.д.
    Так вот, при построении отчёта master-detail, отчёт выводится только первый раз, последующие разы получаю ощибку:

    {"Эта строка удалена из таблицы и не содержит данных. BeginEdit() позволит создать в этой строке новые данные."}

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

    Не могли бы Вы отправить простой пример с этой ошибкой на tz@fast-report.com?
  • отредактировано 01:28
    Shtirliz написал: »
    В XML экспорте не экспортируются настройки страницы и разрывы страницы.

    Верно, не экспортируются. Доделаем позже.
  • отредактировано 01:28
    написал: »
    Может что-то не понял. Однако по есть проблема с параметризированными запросами. Проблема с типами данных. Строковые проходит - все остальные начинает ругаться о невозможности преобразования. Получилось следующее создал запрос вызов ХЧ указал параметры в мастере поставил строковые - набор данных построился. Зато в момент выполнения - ошибка. Меняем типы параметров - нас немного матерят - говорит ошибка. Набор остаётся. Запрос выполняется. Вот собственно проблема уходит если установить значение по умолчанию DefaultValue (Может всё таки фича?)

    Буду разбираться. Значение по умолчанию надо указывать обязательно - оно используется в режиме дизайна.
  • отредактировано 01:28
    CouRage написал: »
    Обнаружилось пара проблем в FR.NET :) .

    Письмо получил, разбираюсь.
  • Сергей ЛукьяновСергей Лукьянов Санкт-Петербург
    отредактировано 01:28
    Здравствуйте!

    Ошибка при выполнении операции: page.PaperHeight = page.PaperHeight * dGrowCoefficient;

    System.ArgumentOutOfRangeException: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
    Имя параметра: index
    в System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    в System.ThrowHelper.ThrowArgumentOutOfRangeException()
    в System.Collections.Generic.List`1.get_Item(Int32 index)
    в FastReport.Engine.ReportEngine.WeOywcbE6()
    в FastReport.Engine.ReportEngine.A2xGuBuDc7()
    в FastReport.Engine.ReportEngine.SsiG2APsT1()
    в FastReport.Engine.ReportEngine.lPFGt4eS6e(Boolean )
    в FastReport.Engine.ReportEngine.mdXGsCxuCC(Boolean )
    в FastReport.Table.TableResult.muhCFyU1T()
    в FastReport.Table.TableResult.feod78kfl(Object , EventArgs )
    в FastReport.ReportComponentBase.OnAfterPrint(EventArgs e)
    в FastReport.BandBase.RestoreState()
    в FastReport.Engine.ReportEngine.PbN8m7cEF(BandBase , Boolean )
    в FastReport.Engine.ReportEngine.Y0hgqJee9(BandBase , Boolean )
    в FastReport.Engine.ReportEngine.SWEGMGqAJ8()
    в FastReport.Engine.ReportEngine.2q7GLSvOhe(ReportPage )
    в FastReport.Engine.ReportEngine.d4XGyvwm9j()
    в FastReport.Engine.ReportEngine.gcmuNDAXC(Boolean , Boolean , ReportPage )
    в FastReport.Engine.ReportEngine.q342kEqbw(Boolean , Boolean )
    в FastReport.Report.Prepare(Boolean append)
  • ShtirlizShtirliz Москва
    отредактировано 01:28
    AlexTZ написал: »
    Верно, не экспортируются. Доделаем позже.

    Спасибо, я уже вкрутил себе это. Вроде как работает.
  • CouRageCouRage Санкт-Петербург
    отредактировано 01:28
    Объект MatrixObject. При добавлении/удалении в него полей отваливаются обработчики событий от всех ячеек матрицы и меняются имена объектов ячеек. В результате нужно каждый раз при изменении матрицы менять код и обработчики вправлять.
  • отредактировано 01:28
    Да, при изменении структуры матрицы она полностью перестраивается. Сначала настройте структуру, затем подключайте обработчики событий.
  • Сергей ЛукьяновСергей Лукьянов Санкт-Петербург
    отредактировано 01:28
    Здравствуйте!

    Такая ошибка:

    1. У таблицы из 5 строк определяем 3 строки как фиксированные, а остальные как не фиксированные
    2. Затем вывести в отчет только две их них (PrintRow()), то 1 строка, определенная как не фиксированная, будет повторяться на каждом листе, как будто она определена как фиксированная.

    Не много сумбурно, но думаю Вы поняли в чем ошибка...
  • отредактировано 01:28
    Здравствуйте,

    Смысл понял, но это не ошибка. Суть в том, что определяется количество фиксированных строк, а уж что это будут за строки - неважно. Если Вы определили 3 строки - это будут именно три первых строки, даже если они напечатаны PrintRow из разных исходных строк.
  • Сергей ЛукьяновСергей Лукьянов Санкт-Петербург
    отредактировано January 2009
    AlexTZ написал: »
    Здравствуйте,

    Смысл понял, но это не ошибка. Суть в том, что определяется количество фиксированных строк, а уж что это будут за строки - неважно. Если Вы определили 3 строки - это будут именно три первых строки, даже если они напечатаны PrintRow из разных исходных строк.

    ОК
  • отредактировано 01:28
    Есть вопросы по бизнес объектам

    1 Если свойство является коллекцией то DisplayNameAttribute не работает
    2 Если свойство является коллекцией и в раН тайме она пустая (зависит от ситуации), то в дизайнере нет полей для элементов этой коллекции (коллекция типизированная).
    3 Как определяются метаданные для коллекции если он не типизированная?

    пример
    class C
    {
    [DisplayName("Some list")]
    List<C1> List {get;}
    }
  • отредактировано 01:28
    1) это поправлю.
    2) таков алгоритм работы. Если в объекте встречается св-во типа IEnumerable, делается попытка взять элемент коллекции для анализа его св-в. Если коллекция пустая (независимо от того, типизированная она или нет) - Вы получите пустой источник данных без полей.
    3) см. п.2.
  • отредактировано 01:28
    AlexTZ написал: »
    2) таков алгоритм работы. Если в объекте встречается св-во типа IEnumerable, делается попытка взять элемент коллекции для анализа его св-в. Если коллекция пустая (независимо от того, типизированная она или нет) - Вы получите пустой источник данных без полей.

    может все таки можно что-то придумать? может аттрибут какой (лутше конечно дженерик параметр от IEnumerable<T>)?
    что если первый элемент имеет тип более специализированный чем остальные?
    или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?

    да и еще вопрос, есть необходимость сделать кастом превью. Хочется встроить существующее превью без тул бара, но при этом нет никакой возможности управлять самим превью т.е. хотелось бы какой нибудь PreviewControl с соответсвующими тулбару методами, свойствами и евентами.
  • отредактировано 01:28
    > может все таки можно что-то придумать? может аттрибут какой (лутше конечно дженерик параметр от IEnumerable<T>)?

    Это самое лучшее и надежное из того, что удалось придумать.

    > что если первый элемент имеет тип более специализированный чем остальные?
    > или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?

    Элементы коллекции должны иметь один тип. Если это не так, возможны проблемы: 1) вы увидите "лишние" поля, которые есть не во всех элементах; 2) вы не увидите полей некоторых элементов.

    Насчет кастом превью: есть ведь PreviewControl. У него есть методы и свойства для управления, можно отключить тулбар.
  • отредактировано 01:28

    с колекциями я все таки не согласен,
    в теории для определения метаданных для отчета должно быть достаточно метаданных класса т.е. System.Type
    но вам виднее :-)

    вообщем задача осталась, как имея метаданные сделать новый отчет который бы их понимал, и что будет когда я залью туда данные с пустой коллекцией ?


    с превью вообщемто разобрался, не нашел только события об изменение страницы пользователем - как вариант ловить Scroll ?
  • отредактировано 01:28
    Пример из демки.
        public class Category
        {
          public string Name;
          public string Description;
          public List<Product> Products;
    
          public Category(string name, string description)
          {
            Name = name;
            Description = description;
            Products = new List<Product>();
          }
        }
    
        public class Product
        {
          public string Name;
          public decimal UnitPrice;
    
          public Product(string name, decimal unitPrice)
          {
            Name = name;
            UnitPrice = unitPrice;
          }
        }
    

    Регистрируется список категорий:
          List<Category> list = new List<Category>();
          Category category = new Category("Beverages", "Soft drinks, coffees, teas, beers");
          list.Add(category);
    ...
    
          FReport.RegisterData(list, "Categories BusinessObject", BOConverterFlags.AllowFields, 3);
    

    Если хоть в одной категории список продуктов не пустой, Вы увидите источник Products и его поля. Если же все категории пустые, то поля у Products будут отсутствовать, и распечатать список Products не получится (просто потому, что продуктов нет).

    Событие в превью добавлю.
  • отредактировано 01:28

    в этом случае метаданные не потеряются (если будет пустая вложенная коллекция),
    достаточно ли чтобы совпадали имена ReferenceName и column.SetName() для правильного маппинга?

    1 создаю отчет
    2 регистрирую дата сурс в ручную
    ...
    BusinessObjectDataSource ds = new BusinessObjectDataSource()
    {
    ReferenceName = "dynamic",
    Alias = "dynamic source",
    Enabled = true
    };
    Column column= new Column() {Alias = "Alias", DataType = typeof(string)};
    column.SetName("Id");
    ds.Columns.Add(column);
    report1.Dictionary.AddChild(ds);
    ....
    3 добавляю данные для превью
    report1.RegisterData(new List<dynamic>(...),...)
    4 вызываю дизайнер, сохраняю отчет


  • отредактировано 01:28
    Нет, так не получится. Маппинг делается не по имени, а по PropertyDescriptor. Манипулировать BusinessObjectDataSource нельзя - он создается автоматически при регистрации бизнес-объекта.
  • отредактировано 01:28
    AlexTZ написал: »
    Нет, так не получится. Маппинг делается не по имени, а по PropertyDescriptor. Манипулировать BusinessObjectDataSource нельзя - он создается автоматически при регистрации бизнес-объекта.

    может имеет смысл вынести итрерфейс для создания BusinessObjectDataSource ?
    ну дайте хоть какую нибудь возможность определять тип элементов коллекции :-)
  • отредактировано 01:28
    Допустим, я смогу сделать определение типа элемента для generic. Как быть с остальными?
  • отредактировано 01:28
    AlexTZ написал: »
    Допустим, я смогу сделать определение типа элемента для generic. Как быть с остальными?

    ну как по мне это должен быть аттрибут и/или дженерик параметр, в противном случае ексепшен :-)

    да вот еще, пока не вычлинил минимальный код, но есть подозрение что это при свойстве равном null если свойство является обьектом

    System.Reflection.TargetException
    Message: Non-static method requires a target.
    Stack Trace:
    at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
    at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
    at FastReport.Data.BusinessObjectDataSource.GetValue(Column column)
    at FastReport.Data.DataSourceBase.get_Item(Column column)
    at FastReport.Report.r32yY2QWB(String , Boolean )
    at FastReport.Report.GetColumnValue(String complexName)
    at FastReport.ReportScript.CalcExpression(String expression, Variant Value)
Дискуссия закрыта.