Предложения и пожелания по Fastreport .net
День добрый!
Очень хотелось бы, чтоб FastReport .NET имел следующую функциональность:
Имеется 3 таблицы, например: Source, DirRelation и Target.
И между ними имеются связи, скажем: Source.ID связан с DirRelation.SID, а DirRelation.TID связан с Target.ID.
В этом случае, чтобы получить элементы таблицы Source и связанные с ними элементы таблицы Target нужно сделать так:
| Data: Source
| | Data: DirRelation
| | | Data: Target
(это я так изобразил бэнды , и их вложенность)
Так вот хотелось бы, чтоб была возможность, имея DataBand привязанный к таблице Source и его дочерний DataBand привязанный к таблице Target (т.е. без промежуточного бэнда, привязанного к таблице DirRelation) получить элементы из Source и связанные с ними (т.е. по связям через таблицу DirRelation) элементы Target. То есть, чтоб дочерний бэнд можно было привязывать не только к конкретной таблице, но и была возможность, скажем, указать через какую таблицу (в идеале, таблицы) он связан с родительским.
Например, чтоб при привязке дочернего бэнда можно было указать [Source.ID]->[DirRelation.SID]; [DirRelation.TID]->[Target.ID] и FastReport при построении отчета выводил бы элементы таблицы Source на родительском бэде, а на дочернем - элементы Target, но не все для каждого элемента Source, а только связанные с данным родительским.
Еще лучше, чтоб для указания связи источника и приемника через третью таблицу можно было бы использовать существующие между таблицами объекты Relation (например, в диалоге привязки бэнда к источнику, перетаскиваем мышкой объект Relation из таблицы DirRelation и из таблицы Target).
Надеюсь объяснил понятно.
Зачем это нужно? Я работаю со специфичной БД, связи между объектами в ней реализованы именно промежуточными таблицами. Соответственно я выбираю нужные мне данные из БД в датасет, строю между таблицами DataRelations и передаю в FastReport. Ситуация, Когда одна таблица связана с другой через еще одну возникает постоянно, причем бывает, что таблицы связаны через несколько промежуточных (2-5, бывает и больше, но редко).
Очень не хотелось бы чтоб пользователю приходилось в шаблоне выкладывать кучу вложенных один в другой бэндов, настраивать соответствующую привязку и потом, например, отключать свойство Visible у всех промежуточных бэндов.
Очень хотелось бы, чтоб FastReport .NET имел следующую функциональность:
Имеется 3 таблицы, например: Source, DirRelation и Target.
И между ними имеются связи, скажем: Source.ID связан с DirRelation.SID, а DirRelation.TID связан с Target.ID.
В этом случае, чтобы получить элементы таблицы Source и связанные с ними элементы таблицы Target нужно сделать так:
| Data: Source
| | Data: DirRelation
| | | Data: Target
(это я так изобразил бэнды , и их вложенность)
Так вот хотелось бы, чтоб была возможность, имея DataBand привязанный к таблице Source и его дочерний DataBand привязанный к таблице Target (т.е. без промежуточного бэнда, привязанного к таблице DirRelation) получить элементы из Source и связанные с ними (т.е. по связям через таблицу DirRelation) элементы Target. То есть, чтоб дочерний бэнд можно было привязывать не только к конкретной таблице, но и была возможность, скажем, указать через какую таблицу (в идеале, таблицы) он связан с родительским.
Например, чтоб при привязке дочернего бэнда можно было указать [Source.ID]->[DirRelation.SID]; [DirRelation.TID]->[Target.ID] и FastReport при построении отчета выводил бы элементы таблицы Source на родительском бэде, а на дочернем - элементы Target, но не все для каждого элемента Source, а только связанные с данным родительским.
Еще лучше, чтоб для указания связи источника и приемника через третью таблицу можно было бы использовать существующие между таблицами объекты Relation (например, в диалоге привязки бэнда к источнику, перетаскиваем мышкой объект Relation из таблицы DirRelation и из таблицы Target).
Надеюсь объяснил понятно.
Зачем это нужно? Я работаю со специфичной БД, связи между объектами в ней реализованы именно промежуточными таблицами. Соответственно я выбираю нужные мне данные из БД в датасет, строю между таблицами DataRelations и передаю в FastReport. Ситуация, Когда одна таблица связана с другой через еще одну возникает постоянно, причем бывает, что таблицы связаны через несколько промежуточных (2-5, бывает и больше, но редко).
Очень не хотелось бы чтоб пользователю приходилось в шаблоне выкладывать кучу вложенных один в другой бэндов, настраивать соответствующую привязку и потом, например, отключать свойство Visible у всех промежуточных бэндов.
Комментарии
Объяснение понятно, непонятно как реализовать такое "малой кровью". Кстати, св-во Visible менять не обязательно - можно сделать высоту бэнда = 0.
Будет ли поддержка хранимых процедур с курсорами в качестве OUT параметров?
Спасибо.
Хранимые процедуры поддерживаются и сейчас, для этого нужно создать новое соединение Data|Add Data Source..., на втором шаге мастера нажать кнопку Add Table... и ввести SQL запрос и добавить параметры. Параметры только IN. Курсор в качестве OUT - это как? ADO.NET не курсорный, или я не прав?
Не совсем, сборка System.Data.OracleClient.dll входит в набор ADO.Net, она конкретно под оракл
Пример:
OracleConnection oraconn = new OracleConnection(ConnectionString);
OracleCommand command = oraconn.CreateCommand();
command.CommandText = "mes_core.UsersGroups"; // процедура - UsersGroups(param in number, cur1 out sys_refcursor, cur2 out sys_refcursor)
command.CommandType = CommandType.StoredProcedure;
DataSet _ds = new DataSet();
OracleParameter _par1 = command.Parameters.Add("param", OracleType.Int32);
_par1.Value = 1;
_par1.Direction = ParameterDirection.Input;
OracleParameter _par2 = command.Parameters.Add("cur1", OracleType.Cursor);
_par2.Value = DBNull.Value;
_par2.Direction = ParameterDirection.Output;
OracleParameter _par3 = command.Parameters.Add("cur2", OracleType.Cursor);
_par3.Value = DBNull.Value;
_par3.Direction = ParameterDirection.Output;
OracleDataAdapter dAdapter = new OracleDataAdapter(command);
dAdapter.Fill(_ds);
В результирующем DataSet две таблички.
Конечно можно этот датасет всунуть в отчет, но это уже будет обвес на сам движок отчетов. Было бы приятней работать напрямую, поэтому вопрос и возник.
И если получится, то и в отдельном процессе чтоб запускать можно было
Еще желательно задавать имя окна и устанавливать значек.
и при добавлении на форму объекта richText выставлять шрифт по умолчанию тот который выбран в панели инструментов.
и добавить кнопки OK Cancel, аналогично редактору TextBox.
Если нет, то добавьте пожалуйста функции SavePreparedToString и SavePrepared.
И ещё предложение по интерфейсу - в окне "Редактор связи" (связывание двух таблиц master/detail) показывать в списке только те таблицы, что выбраны для данного отчёта (а не все зарегистрированные). Или хотя бы добавить соответствующий переключатель "показать все/показать только выбранные".
Дерево добавил, шрифт выставляется (но не тот, что сейчас выбран в панели инструментов, а шрифт по умолчанию для текстовых объектов). Кнопки добавлять не стал: неудобно, некрасиво, да и риск потерять результат редактирования существенно возрастает.
Здравствуйте,
можно сохранять в файл или стрим:
report1.PreparedPages.Save(...)
но это, скорее, для внутреннего использования. Добавлю такие методы в класс отчета.
В тестовом отчёте одно текстовое поле в которое записано немного текста. Сохранил в поток сформированный отчёт (PreparedPages.Save), затем создал новый экземпляр Report, выполнил ему Prepare (что бы PreparedPages инициализировать). Загрузил сформированный ранее отчёт из потока посредством PreparedPages.Load. Выполнил ShowPrepared.
Отчёт корректно отобразился, но если в показанном окне предпросмотра нажимаю кнопку редактирования, дописываю что-нибудь в текстовое поле отчёта, потом закрываю окно редактирования с сохранением, то получаю исключение.
В отчёте лишь одно текстовое поле, никакие данные не привязаны и не используются.
При выполнении последней строки загруженный отчёт корректно отображается, но если зайти в режим редактирования, дописать немного текста в существующее текстовое поле, затем закрыть окно редактирования с сохранением изменений, то наблюдаются два варианта поведения:
1. Сразу же при подтверждении сохранения, в ShowPrepared происходит исключение NullReferenceExcepiton.
2. Окно редактирование закрывается без ошибок, изменения попадают в предпросмотр. Далее - при закрытии окна предпросмотра оно исчезает, а потом появляется снова. При повторном закрытии никаких ошибок не происходит и ShorPrepared возвращает управление.
Очень неудобны следующие вещи:
1. В дизайнере создаем Data Source, настраиваем его и при нажатии на кнопку Next FR читает список всех таблиц и вьюв из СУБД, что на наших БД делает долго. Есть идея как оптимизировать это дело хотя бы для MsSqlDataConnection - добавлением условия where 1 = 2.
И еще если в БД есть вювы, в которых есть ссылки на несуществующие поля в таблицах БД, то FR выдает Exception и больше дизайнер не запускается. Тут тоже есть предложение обрабатывать такие ситуации и не добавлять такие объекты в список.
2. В окне Define columns добавить удаление полей из списка по Del или другому шорткату - неудобно каждый раз мышкой нажимать на кнопку.
То же относится и к списку парамтров.
3. Слетает Data source в окне Edit DataBand.
Кликаем дважды на бэнде Data, выбираем нужный датасорс, устанавливаем ему сортировку, устанавливаем фильтр, жмём ОК и запускаем Preview.
Закрываем Preview, кликаем дважды на бэнде Data, видим датасорс = None.
С уважением, Andy
это способ, который рекомендован в MSDN; другого способа я не знаю. При чем здесь where?
2) это можно.
3) скорее всего, датасорс не включен в меню "Данные|Выбрать данные для отчета".
Есть большой кусок текстовки, со множеством вставляемых данных,в том числе и даты, естесственно нулевые даты нужно скрывать.
Как вариант сделать такое свойство у TextObject и RichObject или вообще задавать его глобально для всего отчета.
2 вариант имхо лучше.
При взятии даты сравнивать ее с Нулевой датой, и если они равны выводить пустую строку..
HideValue для TextObject должно работать правильно в любом случае.
Да проблема в этом...
3. Слетает Data source в окне Edit DataBand.
1. Сорри, сделал преждевременные выводы (посмотрел пример в документации).
Но всётаки со второй частью проблемы
"если в БД есть вювы, в которых есть ссылки на несуществующие поля в таблицах БД, то FR выдает Exception и больше дизайнер не запускается. Тут тоже есть предложение обрабатывать такие ситуации и не добавлять такие объекты в список."
можно что-то сделать? Я понимаю, что connection.GetSchema, но всё же.
3. датасорс включил в меню - витуация повторилась.
3) Вы можете повторить ситуацию на каком-нибудь примере из демки? Если да, то опишите порядок действий, приводящих к ошибке.
Хотел проверить, так мне даже не удалось создать такой View - MS SQL ругается при сохранении...
Если сначала в дизайнер и потом из него в просмотр, то закрывает.