Я добавил одну интересную фичу - хранение данных в файле отчета. В первую очередь для того, чтобы было легче искать баги в отчетах. Фича будет доступна в версии 1.0.66 - должна к утру собраться.
Что нужно сделать: у всех таблиц в отчете включить св-во StoreData, сохранить отчет под новым именем и прислать его мне.
Посмотрел я щас исходники, нашел так долго мной ожидаемый экспорт в PDF.
Но, собрать я не могу не хватает проекта FastReport.Editor, а в готовой библиотеке данного экспорта нет.
FastReport.Editor в исходниках не поставляется, т.к. это сторонняя либа. Смотрите в programmer's manual, как собрать проект FastReport.dll из исходников. Или подождите еще немного, пока мы доделаем экспорт и включим его в поставку.
Есть DataSet, в нём 2 таблицы, по ним построена реляция. Данные в таблицы заносятся вручную, т.е. перед каждым отображением отчёта делаю
dataset.Clear() и далее dataset.tables["table1"].Rows.Add() и т.д.
Так вот, при построении отчёта master-detail, отчёт выводится только первый раз, последующие разы получаю ощибку:
{"Эта строка удалена из таблицы и не содержит данных. BeginEdit() позволит создать в этой строке новые данные."}
Ошибка проявляется только на отчётах master-detail. Специально попробовал на том же датасете построить отчёт в stimulsoft - всё работает ок.
Может что-то не понял. Однако по есть проблема с параметризированными запросами. Проблема с типами данных. Строковые проходит - все остальные начинает ругаться о невозможности преобразования. Получилось следующее создал запрос вызов ХЧ указал параметры в мастере поставил строковые - набор данных построился. Зато в момент выполнения - ошибка. Меняем типы параметров - нас немного матерят - говорит ошибка. Набор остаётся. Запрос выполняется. Вот собственно проблема уходит если установить значение по умолчанию DefaultValue (Может всё таки фича?)
1. Проблема с бэндами "Заголовок группы", если их два и более для одного бэнда данных - по второму (внтутреннему) бэнду группировка не происходит. Пример выслал на tz@fast-report.com. В примере, у региона "OR" два города "Portland" - записи должны были объединится, смотрите на Outline.
2. Проблема с парсером выражений, вроде.
В том же примере у объекта TextObject "Text8" включите свойство AllowExpressions - отчет перестанет компилироваться из-за необъявленной переменной varTest. В поле выражение переменной указано в двойных кавычках - "[varTest]". Если кавычки убрать - все ок.
Есть DataSet, в нём 2 таблицы, по ним построена реляция. Данные в таблицы заносятся вручную, т.е. перед каждым отображением отчёта делаю
dataset.Clear() и далее dataset.tables["table1"].Rows.Add() и т.д.
Так вот, при построении отчёта master-detail, отчёт выводится только первый раз, последующие разы получаю ощибку:
{"Эта строка удалена из таблицы и не содержит данных. BeginEdit() позволит создать в этой строке новые данные."}
Здравствуйте,
Не могли бы Вы отправить простой пример с этой ошибкой на tz@fast-report.com?
Может что-то не понял. Однако по есть проблема с параметризированными запросами. Проблема с типами данных. Строковые проходит - все остальные начинает ругаться о невозможности преобразования. Получилось следующее создал запрос вызов ХЧ указал параметры в мастере поставил строковые - набор данных построился. Зато в момент выполнения - ошибка. Меняем типы параметров - нас немного матерят - говорит ошибка. Набор остаётся. Запрос выполняется. Вот собственно проблема уходит если установить значение по умолчанию DefaultValue (Может всё таки фича?)
Буду разбираться. Значение по умолчанию надо указывать обязательно - оно используется в режиме дизайна.
Ошибка при выполнении операции: 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)
Объект MatrixObject. При добавлении/удалении в него полей отваливаются обработчики событий от всех ячеек матрицы и меняются имена объектов ячеек. В результате нужно каждый раз при изменении матрицы менять код и обработчики вправлять.
1. У таблицы из 5 строк определяем 3 строки как фиксированные, а остальные как не фиксированные
2. Затем вывести в отчет только две их них (PrintRow()), то 1 строка, определенная как не фиксированная, будет повторяться на каждом листе, как будто она определена как фиксированная.
Не много сумбурно, но думаю Вы поняли в чем ошибка...
Смысл понял, но это не ошибка. Суть в том, что определяется количество фиксированных строк, а уж что это будут за строки - неважно. Если Вы определили 3 строки - это будут именно три первых строки, даже если они напечатаны PrintRow из разных исходных строк.
Смысл понял, но это не ошибка. Суть в том, что определяется количество фиксированных строк, а уж что это будут за строки - неважно. Если Вы определили 3 строки - это будут именно три первых строки, даже если они напечатаны PrintRow из разных исходных строк.
1 Если свойство является коллекцией то DisplayNameAttribute не работает
2 Если свойство является коллекцией и в раН тайме она пустая (зависит от ситуации), то в дизайнере нет полей для элементов этой коллекции (коллекция типизированная).
3 Как определяются метаданные для коллекции если он не типизированная?
пример
class C
{
[DisplayName("Some list")]
List<C1> List {get;}
}
1) это поправлю.
2) таков алгоритм работы. Если в объекте встречается св-во типа IEnumerable, делается попытка взять элемент коллекции для анализа его св-в. Если коллекция пустая (независимо от того, типизированная она или нет) - Вы получите пустой источник данных без полей.
3) см. п.2.
2) таков алгоритм работы. Если в объекте встречается св-во типа IEnumerable, делается попытка взять элемент коллекции для анализа его св-в. Если коллекция пустая (независимо от того, типизированная она или нет) - Вы получите пустой источник данных без полей.
может все таки можно что-то придумать? может аттрибут какой (лутше конечно дженерик параметр от IEnumerable<T>)?
что если первый элемент имеет тип более специализированный чем остальные?
или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?
да и еще вопрос, есть необходимость сделать кастом превью. Хочется встроить существующее превью без тул бара, но при этом нет никакой возможности управлять самим превью т.е. хотелось бы какой нибудь PreviewControl с соответсвующими тулбару методами, свойствами и евентами.
> может все таки можно что-то придумать? может аттрибут какой (лутше конечно дженерик параметр от IEnumerable<T>)?
Это самое лучшее и надежное из того, что удалось придумать.
> что если первый элемент имеет тип более специализированный чем остальные?
> или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?
Элементы коллекции должны иметь один тип. Если это не так, возможны проблемы: 1) вы увидите "лишние" поля, которые есть не во всех элементах; 2) вы не увидите полей некоторых элементов.
Насчет кастом превью: есть ведь PreviewControl. У него есть методы и свойства для управления, можно отключить тулбар.
с колекциями я все таки не согласен,
в теории для определения метаданных для отчета должно быть достаточно метаданных класса т.е. System.Type
но вам виднее :-)
вообщем задача осталась, как имея метаданные сделать новый отчет который бы их понимал, и что будет когда я залью туда данные с пустой коллекцией ?
с превью вообщемто разобрался, не нашел только события об изменение страницы пользователем - как вариант ловить Scroll ?
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 не получится (просто потому, что продуктов нет).
в этом случае метаданные не потеряются (если будет пустая вложенная коллекция),
достаточно ли чтобы совпадали имена 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 вызываю дизайнер, сохраняю отчет
Нет, так не получится. Маппинг делается не по имени, а по PropertyDescriptor. Манипулировать BusinessObjectDataSource нельзя - он создается автоматически при регистрации бизнес-объекта.
Нет, так не получится. Маппинг делается не по имени, а по PropertyDescriptor. Манипулировать BusinessObjectDataSource нельзя - он создается автоматически при регистрации бизнес-объекта.
может имеет смысл вынести итрерфейс для создания BusinessObjectDataSource ?
ну дайте хоть какую нибудь возможность определять тип элементов коллекции :-)
Комментарии
Можете прислать тестовое приложение, чтобы я его запустил и повторил ошибку? Так я не могу сказать ничего определенного.
Что нужно сделать: у всех таблиц в отчете включить св-во StoreData, сохранить отчет под новым именем и прислать его мне.
Но, собрать я не могу не хватает проекта FastReport.Editor, а в готовой библиотеке данного экспорта нет.
Посмотрите плиз....
Проблема:
Есть DataSet, в нём 2 таблицы, по ним построена реляция. Данные в таблицы заносятся вручную, т.е. перед каждым отображением отчёта делаю
dataset.Clear() и далее dataset.tables["table1"].Rows.Add() и т.д.
Так вот, при построении отчёта master-detail, отчёт выводится только первый раз, последующие разы получаю ощибку:
{"Эта строка удалена из таблицы и не содержит данных. BeginEdit() позволит создать в этой строке новые данные."}
Ошибка проявляется только на отчётах master-detail. Специально попробовал на том же датасете построить отчёт в stimulsoft - всё работает ок.
Или я чего-то недопонимаю.
Поздравляю всех С Новым Годом! Всех благ всем.
Обнаружилось пара проблем в FR.NET .
1. Проблема с бэндами "Заголовок группы", если их два и более для одного бэнда данных - по второму (внтутреннему) бэнду группировка не происходит. Пример выслал на tz@fast-report.com. В примере, у региона "OR" два города "Portland" - записи должны были объединится, смотрите на Outline.
2. Проблема с парсером выражений, вроде.
В том же примере у объекта TextObject "Text8" включите свойство AllowExpressions - отчет перестанет компилироваться из-за необъявленной переменной varTest. В поле выражение переменной указано в двойных кавычках - "[varTest]". Если кавычки убрать - все ок.
Здравствуйте,
Не могли бы Вы отправить простой пример с этой ошибкой на tz@fast-report.com?
Верно, не экспортируются. Доделаем позже.
Буду разбираться. Значение по умолчанию надо указывать обязательно - оно используется в режиме дизайна.
Письмо получил, разбираюсь.
Ошибка при выполнении операции: 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)
Спасибо, я уже вкрутил себе это. Вроде как работает.
Такая ошибка:
1. У таблицы из 5 строк определяем 3 строки как фиксированные, а остальные как не фиксированные
2. Затем вывести в отчет только две их них (PrintRow()), то 1 строка, определенная как не фиксированная, будет повторяться на каждом листе, как будто она определена как фиксированная.
Не много сумбурно, но думаю Вы поняли в чем ошибка...
Смысл понял, но это не ошибка. Суть в том, что определяется количество фиксированных строк, а уж что это будут за строки - неважно. Если Вы определили 3 строки - это будут именно три первых строки, даже если они напечатаны PrintRow из разных исходных строк.
ОК
1 Если свойство является коллекцией то DisplayNameAttribute не работает
2 Если свойство является коллекцией и в раН тайме она пустая (зависит от ситуации), то в дизайнере нет полей для элементов этой коллекции (коллекция типизированная).
3 Как определяются метаданные для коллекции если он не типизированная?
пример
class C
{
[DisplayName("Some list")]
List<C1> List {get;}
}
2) таков алгоритм работы. Если в объекте встречается св-во типа IEnumerable, делается попытка взять элемент коллекции для анализа его св-в. Если коллекция пустая (независимо от того, типизированная она или нет) - Вы получите пустой источник данных без полей.
3) см. п.2.
может все таки можно что-то придумать? может аттрибут какой (лутше конечно дженерик параметр от IEnumerable<T>)?
что если первый элемент имеет тип более специализированный чем остальные?
или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?
да и еще вопрос, есть необходимость сделать кастом превью. Хочется встроить существующее превью без тул бара, но при этом нет никакой возможности управлять самим превью т.е. хотелось бы какой нибудь PreviewControl с соответсвующими тулбару методами, свойствами и евентами.
Это самое лучшее и надежное из того, что удалось придумать.
> что если первый элемент имеет тип более специализированный чем остальные?
> или все эленты разного типа но имеют одного предка (его конечно можно вывести, но какой ценой если элементов много и наследование многоуровневое)?
Элементы коллекции должны иметь один тип. Если это не так, возможны проблемы: 1) вы увидите "лишние" поля, которые есть не во всех элементах; 2) вы не увидите полей некоторых элементов.
Насчет кастом превью: есть ведь PreviewControl. У него есть методы и свойства для управления, можно отключить тулбар.
с колекциями я все таки не согласен,
в теории для определения метаданных для отчета должно быть достаточно метаданных класса т.е. System.Type
но вам виднее :-)
вообщем задача осталась, как имея метаданные сделать новый отчет который бы их понимал, и что будет когда я залью туда данные с пустой коллекцией ?
с превью вообщемто разобрался, не нашел только события об изменение страницы пользователем - как вариант ловить Scroll ?
Регистрируется список категорий:
Если хоть в одной категории список продуктов не пустой, Вы увидите источник Products и его поля. Если же все категории пустые, то поля у Products будут отсутствовать, и распечатать список Products не получится (просто потому, что продуктов нет).
Событие в превью добавлю.
в этом случае метаданные не потеряются (если будет пустая вложенная коллекция),
достаточно ли чтобы совпадали имена 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 вызываю дизайнер, сохраняю отчет
может имеет смысл вынести итрерфейс для создания BusinessObjectDataSource ?
ну дайте хоть какую нибудь возможность определять тип элементов коллекции :-)
ну как по мне это должен быть аттрибут и/или дженерик параметр, в противном случае ексепшен :-)
да вот еще, пока не вычлинил минимальный код, но есть подозрение что это при свойстве равном 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)