Предложения и пожелания по Fastreport .net

отредактировано 08:12 Раздел: 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 у всех промежуточных бэндов.
«13

Комментарии

  • отредактировано 08:12
    Здравствуйте,

    Объяснение понятно, непонятно как реализовать такое "малой кровью". Кстати, св-во Visible менять не обязательно - можно сделать высоту бэнда = 0.
  • MLDMLD
    отредактировано 08:12
    Здравствуйте.
    Будет ли поддержка хранимых процедур с курсорами в качестве OUT параметров?
    Спасибо.
  • отредактировано 08:12
    Здравствуйте,

    Хранимые процедуры поддерживаются и сейчас, для этого нужно создать новое соединение Data|Add Data Source..., на втором шаге мастера нажать кнопку Add Table... и ввести SQL запрос и добавить параметры. Параметры только IN. Курсор в качестве OUT - это как? ADO.NET не курсорный, или я не прав?
  • MLDMLD
    отредактировано 08:12
    Здравствуйте,
    Не совсем, сборка 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 две таблички.
    Конечно можно этот датасет всунуть в отчет, но это уже будет обвес на сам движок отчетов. Было бы приятней работать напрямую, поэтому вопрос и возник.
  • отредактировано 08:12
    Такие фокусы, конечно, сделать просто так не получится :) Как вариант - через скрипт самого отчета.
  • Dracula_DISDracula_DIS Москва
    отредактировано 08:12
    Сделайте пожалуйста параметры превью окна, которые позволяют устанавливать видимым окно в TaskBar и делать его поверх всех окон
    И если получится, то и в отдельном процессе чтоб запускать можно было
    Еще желательно задавать имя окна и устанавливать значек.
  • отредактировано 08:12
    Сделаю все, кроме отдельного процесса - чревато это...
  • Dracula_DISDracula_DIS Москва
    отредактировано 08:12
    В RichTextEditor хотелось бы добавить с правой стороны дерево Датасорса как в окне редактирования обычного текста.
    и при добавлении на форму объекта richText выставлять шрифт по умолчанию тот который выбран в панели инструментов.
    и добавить кнопки OK Cancel, аналогично редактору TextBox.
  • отредактировано October 2008
    Подскажите, возможно ли в текущей версии сохранить сформированный отчёт в строку или файл?
    Если нет, то добавьте пожалуйста функции SavePreparedToString и SavePrepared.


    И ещё предложение по интерфейсу - в окне "Редактор связи" (связывание двух таблиц master/detail) показывать в списке только те таблицы, что выбраны для данного отчёта (а не все зарегистрированные). Или хотя бы добавить соответствующий переключатель "показать все/показать только выбранные".
  • отредактировано 08:12
    Dracula_DIS написал: »
    В RichTextEditor хотелось бы добавить с правой стороны дерево Датасорса как в окне редактирования обычного текста.
    и при добавлении на форму объекта richText выставлять шрифт по умолчанию тот который выбран в панели инструментов.
    и добавить кнопки OK Cancel, аналогично редактору TextBox.

    Дерево добавил, шрифт выставляется (но не тот, что сейчас выбран в панели инструментов, а шрифт по умолчанию для текстовых объектов). Кнопки добавлять не стал: неудобно, некрасиво, да и риск потерять результат редактирования существенно возрастает.
  • отредактировано 08:12
    Alex Kh написал: »
    Подскажите, возможно ли в текущей версии сохранить сформированный отчёт в строку или файл?
    Если нет, то добавьте пожалуйста функции SavePreparedToString и SavePrepared.

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

    можно сохранять в файл или стрим:
    report1.PreparedPages.Save(...)
    но это, скорее, для внутреннего использования. Добавлю такие методы в класс отчета.
  • отредактировано October 2008
    AlexTZ написал: »
    но это, скорее, для внутреннего использования. Добавлю такие методы в класс отчета.
    Спасибо.
  • отредактировано October 2008
    Попробовал воспользоваться. PreparedPages.Save/Load.

    В тестовом отчёте одно текстовое поле в которое записано немного текста. Сохранил в поток сформированный отчёт (PreparedPages.Save), затем создал новый экземпляр Report, выполнил ему Prepare (что бы PreparedPages инициализировать). Загрузил сформированный ранее отчёт из потока посредством PreparedPages.Load. Выполнил ShowPrepared.
    Отчёт корректно отобразился, но если в показанном окне предпросмотра нажимаю кнопку редактирования, дописываю что-нибудь в текстовое поле отчёта, потом закрываю окно редактирования с сохранением, то получаю исключение.
    написал:
    System.ArgumentOutOfRangeException
    Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index.
  • отредактировано October 2008
    В новой версии попробовал методы SavePrepared/LoadPrepared из класса Report.
    Report rpt = new Report();
    rpt.Load("d:\\temp\\fr\\test.frx");
    rpt.Show();
    
    MemoryStream ms = new MemoryStream();
    rpt.SavePrepared(ms);
    ms.Position = 0;
    
    rpt.Dispose();
    
    rpt = new Report();
    rpt.LoadPrepared(ms);
    rpt.ShowPrepared();
    

    В отчёте лишь одно текстовое поле, никакие данные не привязаны и не используются.

    При выполнении последней строки загруженный отчёт корректно отображается, но если зайти в режим редактирования, дописать немного текста в существующее текстовое поле, затем закрыть окно редактирования с сохранением изменений, то наблюдаются два варианта поведения:
    1. Сразу же при подтверждении сохранения, в ShowPrepared происходит исключение NullReferenceExcepiton.
    2. Окно редактирование закрывается без ошибок, изменения попадают в предпросмотр. Далее - при закрытии окна предпросмотра оно исчезает, а потом появляется снова. При повторном закрытии никаких ошибок не происходит и ShorPrepared возвращает управление.
  • отредактировано 08:12
    Вставил код в демку, ошибок в поведении не обнаружил. Сможете прислать тестовое приложение?
  • отредактировано 08:12
    Здравствуйте.

    Очень неудобны следующие вещи:
    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
  • отредактировано 08:12
    1) Список элементов БД читает объект Connection:
    schema = connection.GetSchema("Tables", new string[] { null, null, null, name });
    

    это способ, который рекомендован в MSDN; другого способа я не знаю. При чем здесь where?

    2) это можно.
    3) скорее всего, датасорс не включен в меню "Данные|Выбрать данные для отчета".
  • отредактировано 08:12
    AlexTZ написал: »
    Сможете прислать тестовое приложение?
    Выслал на tz@fast-report.com.
  • Dracula_DISDracula_DIS Москва
    отредактировано 08:12
    Опять столкнулся с проблемой вывода Даты. HideValue уже не помогает.
    Есть большой кусок текстовки, со множеством вставляемых данных,в том числе и даты, естесственно нулевые даты нужно скрывать.
    Как вариант сделать такое свойство у TextObject и RichObject или вообще задавать его глобально для всего отчета.
    2 вариант имхо лучше.
    При взятии даты сравнивать ее с Нулевой датой, и если они равны выводить пустую строку..
  • отредактировано 08:12
    У RichObject нет св-ва HideValue - проблема в этом?
    HideValue для TextObject должно работать правильно в любом случае.
  • Dracula_DISDracula_DIS Москва
    отредактировано 08:12
    AlexTZ написал: »
    У RichObject нет св-ва HideValue - проблема в этом?
    хм, :) что то я напутал...
    Да проблема в этом...
  • отредактировано 08:12
    Это сегодня сделаю.
  • отредактировано 08:12
    1. ...список всех таблиц и вьюв из СУБД, что на наших БД делает долго.
    3. Слетает Data source в окне Edit DataBand.
    AlexTZ написал: »
    1) Список элементов БД читает объект Connection:
    schema = connection.GetSchema("Tables", new string[] { null, null, null, name });
    
    это способ, который рекомендован в MSDN; другого способа я не знаю. При чем здесь where?
    2) это можно.
    3) скорее всего, датасорс не включен в меню "Данные|Выбрать данные для отчета".

    1. Сорри, сделал преждевременные выводы (посмотрел пример в документации).
    Но всётаки со второй частью проблемы
    "если в БД есть вювы, в которых есть ссылки на несуществующие поля в таблицах БД, то FR выдает Exception и больше дизайнер не запускается. Тут тоже есть предложение обрабатывать такие ситуации и не добавлять такие объекты в список."
    можно что-то сделать? Я понимаю, что connection.GetSchema, но всё же.

    3. датасорс включил в меню - витуация повторилась.
  • отредактировано 08:12
    1) это я проверю и постараюсь исправить.
    3) Вы можете повторить ситуацию на каком-нибудь примере из демки? Если да, то опишите порядок действий, приводящих к ошибке.
  • отредактировано 08:12
    Andy Popko написал: »
    "если в БД есть вювы, в которых есть ссылки на несуществующие поля в таблицах БД, то FR выдает Exception и больше дизайнер не запускается. Тут тоже есть предложение обрабатывать такие ситуации и не добавлять такие объекты в список."
    можно что-то сделать? Я понимаю, что connection.GetSchema, но всё же.

    Хотел проверить, так мне даже не удалось создать такой View - MS SQL ругается при сохранении...
  • CouRageCouRage Санкт-Петербург
    отредактировано 08:12
    В окно предварительного просмотра, ИМХО, надо добавить кнопку "Закрыть". Пользователям до крестика тянуться далековато и не все знают про Esc.
  • отредактировано 08:12
    Какие пользователи стали ленивые. Добавлю.
  • CouRageCouRage Санкт-Петербург
    отредактировано 08:12
    Спасибо за кнопку. Извините забыл указать, что кнопка "Закрыть" помимо того, что она просто есть, должна еще закрывать окно предварительного просмотра. :)
  • отредактировано 08:12
    Так ведь закрывает :)
  • CouRageCouRage Санкт-Петербург
    отредактировано 08:12
    Не закрывает, если сразу на просмотр выводить.
    Если сначала в дизайнер и потом из него в просмотр, то закрывает.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.