Использование FastReport3 совместно с .NET

almanalman космополит
отредактировано 18:12 Раздел: FastReport Studio
Господа, Вы можете принять участие в тестировании и обкатке FastReport3 COM-server. Данный продукт позволяет использовать FastReport совместно с Visual C++, C#.NET, VB.NET и другими продуктами.

http://www.fast-report.com/pbc_download/frx3com_trial.exe

Продукт находится в стадии ранней альфы, мы будем рады учесть все Ваши пожелания.

В архиве находится FastReport COM-server (frxCOM.dll ), примеры использования для МS VC++, C# и VB и множество демонстрационных отчётов.

Комментарии

  • отредактировано 18:12
    Добрый день! Установил COM - версию, и сразу появились вопросы-пожелания:
    1. Будет ли навигация по таблице данных вынесена в интерфейс, который бы реализовывал нетовский класс?
    2. работает ли COM в Multi Threaded Appartment?
    3. Так как датасеты у нас формируются динамически, возможна ли проверка
    корректности (соответствия) настроек отчета (наименований таблиц и полей ) с соответствующими таблицами и полями датасета с данными? ( Имею ввиду нетовский датасет)

    Списибо.
  • almanalman космополит
    отредактировано 18:12
    vlad_galaxy написал:
    Добрый день! Установил COM - версию, и сразу появились вопросы-пожелания:

    Добрый день.
    vlad_galaxy написал:
    1. Будет  ли навигация по таблице данных вынесена в интерфейс, который бы реализовывал нетовский класс?

    Не могли бы Вы уточнить вопрос? Навскидку можно сказать - любые методы, которые не нарушают структурной целостности FastReport, могут быть вынесены в интерфейс. Если Вы объясните Ваше пожелание на примере, это гораздо сократит время имплементации.
    vlad_galaxy написал:
    2. работает ли COM в Multi Threaded Appartment?

    В текущей версии frxCOM работает в Single Threading Appartment. Мы планируем перевести СОМ объекты в Multithreading Appartment в бета версии.
    vlad_galaxy написал:
    3. Так как датасеты у нас формируются динамически, возможна ли проверка
    корректности (соответствия) настроек отчета (наименований таблиц и полей ) с соответствующими таблицами и полями датасета с данными? ( Имею ввиду нетовский датасет)

    В текущей версии достучаться до внутренней структуры отчёта очень сложно, можно сказать что невозможно. Пожалуй, единственный способ - генерировать скрипт FastScript в прикладной программе, затем передавать скрипт в FastReport и уже скрипт может сам строить отчёт или, в простейшем случае, менять наименование таблиц и полей. Весьма трудоёмкий способ.

    Мы постараемся реализовать доступ к внутренней структуре отчёта в ближайших версиях.

  • _OZ_OZ
    отредактировано 18:12
    Запускаю пример на CS, выбираю отчет, нажимаю Design - появляется окно дизайнера. Теперь жму на preview, отчет нормально выводится, но остается окно инспектора. Если в примере сразу нажимать Preview, то окно инспектора не появляется.
  • _OZ_OZ
    отредактировано 18:12
    Да, и не совсем понятно, как подключать user dataset'ы. В примере он просто создается, но нигде не используется (в примере БД подключается из скрипта). Я посмотрел в IfrxReport, но и там тоже нет методов для подключения своих dataset'ов.
    Как подключить свой user dataset?
  • отредактировано 18:12
    написал:
    Не могли бы Вы уточнить вопрос? Навскидку можно сказать - любые методы, которые не нарушают структурной целостности FastReport, могут быть вынесены в интерфейс. Если Вы объясните Ваше пожелание на примере, это гораздо сократит время имплементации.

    На клиенте находится только клиентская часть системы. Компоненты BDE, ODBC и т.д. не являются обязательными.
    Поэтому frxCOM ( в нашем случае ) должен работать независимо. Для этого получение данных и навигация по ним должны быть реализованы с помощью интерфейсов.

    Например:

    модуль интерфейсов
    public interface IFrxDataBand{

    .................

    bool Eof();
    void Exit();
    void First();
    void Init();
    void Next();
    void Prior();
    }


    В frxCOM в качестве датасетов для frxReport используется класс, дергающий методы интерфейса IFrxDataBand.

    В нетовском проекте создается класс, реализующий этот интерфейс
    public class RepTable : IFrxDataBand
    {

    bool Eof()
    {
    // Реализация интерфейса
    }

    .................

    }

    А может, решение задачи возможно, используя FastReport Server?.


    Еще вопрос
    1. Будут ли в комовскую библиотеку включены ActiveX дизайнера и Preview?
    Этот вопрос связан с нашим корпоративным стандартом пользовательского интерфейса
  • almanalman космополит
    отредактировано 18:12
    _OZ написал:
    Запускаю пример на CS, выбираю отчет, нажимаю Design - появляется окно дизайнера. Теперь жму на preview, отчет нормально выводится, но остается окно инспектора. Если в примере сразу нажимать Preview, то окно инспектора не появляется.
    Похоже что это баг, мы постараемся исправить в следующей версии.
  • almanalman космополит
    отредактировано 18:12
    _OZ написал:
    Да, и не совсем понятно, как подключать user dataset'ы. В примере он просто создается, но нигде не используется (в примере БД подключается из скрипта). Я посмотрел в IfrxReport, но и там тоже нет методов для подключения своих dataset'ов.
    Как подключить свой user dataset?
    Действительно, такая проблема имеется.
    UserDataSet можно подключить из скрипта или непосредственно в дизайнере.
    Мы планируем на следующей неделе выложить новую версию с расширенным интерфейсом IfrxReport, которая позволит подлключать DataSet программно.
  • almanalman космополит
    отредактировано 18:12
    vlad_galaxy написал:
    На клиенте находится только клиентская часть системы. Компоненты BDE, ODBC и т.д. не являются обязательными.
    Поэтому frxCOM ( в нашем случае ) должен работать независимо. Для этого получение данных и навигация по ним должны быть реализованы с помощью интерфейсов.

    Спасибо. Теперь я понял Ваш вопрос. Добавление интерфейсов к frxDataBand и другим внутренним объектам FastReport мы планруем в отдалённой перспективе.
    vlad_galaxy написал:
    А может, решение задачи возможно, используя FastReport Server?.

    FastReport Server позиционруется для решения других задач, впрочем если Вам удастся использовать его для решения данной задачи, мы будем только рады.
    vlad_galaxy написал:
    Еще вопрос
    1. Будут ли в комовскую библиотеку включены ActiveX дизайнера и Preview?
    Этот вопрос связан с нашим корпоративным стандартом пользовательского интерфейса

    ActiveX Preview компонент появится в ближайшее время. Мы планируем вынести Preview в отдельную DLL.
  • отредактировано 18:12
    написал:
    Спасибо. Теперь я понял Ваш вопрос. Добавление интерфейсов к frxDataBand и другим внутренним объектам FastReport мы планруем в отдалённой перспективе.
    А можно обойтись без интерфейсов к TfrxDataBand и т.д. Внутри COM разрабатываем класс ExternalDS, наследуемый от TfrxCustomDBDataSet, у кот. public проперть типа IFrxDataBand. Для получения данных используем метод
    function ExternalDS.GetValue(Index: String): Variant;
    begin
    result := iDataBand.GetValue( Index );
    end;
    Для этого нужно импортить библиотеку типов, описанных в нетовском проекте интерфейсов.
    Аналогично перекрываются остальные методы базового класса(их немного по сравнению с борландовским TDataSet), используемые в FastReport.
  • отредактировано 18:12
    написал:
    В текущей версии достучаться до внутренней структуры отчёта очень сложно, можно сказать что невозможно
    могу предложить следующий механизм:
    1. Пробегаем по всем объектам
    2. Получаем TStrings(TfrxMemoView(myCurrentView).Memo) - коллекцию строк Expr для анализа.
    3. Парсим выражение, используя как основу код процедуры
    ExpandVariables(var Expr: String);
    Находим переменную:
    S := frxGetBrackedVariable(Expr, '', i, j);
    4. Повторяем п.п. 2-3 для тэгов и скрипта.

    Для поиска ошибок:
    В блоке try ... except
    вызываем функцию CalcAndFormat(m, S), где m - это TfrxMemoView.
    При генерации исключений добавляем S в список ошибочных переменных.
    Если m = nil,
    тогда вызываем метод fReport.Calc(S);
  • отредактировано 18:12
    Добрый день.

    Хотелось узнать, насколько далеко FastReport 3.net на данный момент ушел от "ранней альфы". Планируется ли на ближайшее время выпуск следующей стабильной версии?

    На данный момент и "ранняя альфа" неплохо у меня работает и я бы хотел ее начать использовать в своих проектах уже сейчас. Реально ли стать пользователем на данный момент или выпуск коммерческого релиза не планируется до окончания тестинга?

    Так же хотелось узнать, планируется ли создание компонентов для web-отчетов на основе FastReport 3.net.
  • отредактировано 18:12
    Скачал frx3com_trial2.exe
    Пока столкнулся со следующими проблемами (в порядке критичности для меня):
    1. У меня прокет базируется на ASP.NET, поэтому обнаружилась следующая ошибка, которой не наблюдается в WinForms:
    TfrxReportClass frx = new TfrxReportClass();
    TfrxUserDataSetClass DataSet = new TfrxUserDataSetClass();
    //DataSet.UserName = "NewDataSet"; - в альфе работало
    // Следующие строки работать в бете под ASP.NET не желают
    string ds = DataSet.Name;
    DataSet.UserName = "NewDataSet";
    Чтобы воспроизвести ошибку, достаточно создать WebApplication и вставить на Page_Load вышеуказанный код.

    2. Экспорт в BMP происходит при 96 dpi. Это крайне мало. Для распечатки документов требуется 300 dpi.

    3. При экспорте в BMP установка LeftMargin не дает желаемого эффекта - отчет не только не сдвигается, но и с правой стороны появляется часть отчета (задвоение изображения).

    4. При попытке экспорта в HTML изображение баркода не сохранилось на диск.

    5. При экспорте в PDF изображение баркода размытое. Боюсь, что сканер такой баркод не прочитает.

    6. Если будет реализован экспорт в PNG - это будет большим плюсом, так как формат более экономичный, чем BMP.

    Жду откликов.
    Решение первых трех проблем достаточно критично для меня, так как очень хочется продолжить работать на вашем продукте, но заказчикам это объяснить сложно - им нужен результат.
    Жду также сообщения о ценовой политике относительно российских клиентов или хотя бы сроки ее утверждения.

    С уважением,
    Антон
  • almanalman космополит
    отредактировано May 2005
    xTony написал:
    1. У меня прокет базируется на ASP.NET, поэтому обнаружилась следующая ошибка, которой не наблюдается в WinForms:
    TfrxReportClass frx = new TfrxReportClass();
    TfrxUserDataSetClass DataSet = new TfrxUserDataSetClass();
    //DataSet.UserName = "NewDataSet"; - в альфе работало
    // Следующие строки работать в бете под ASP.NET не желают
    string ds = DataSet.Name;
    DataSet.UserName = "NewDataSet";
    Чтобы воспроизвести ошибку, достаточно создать WebApplication и вставить на Page_Load вышеуказанный код.

    В версии trial2 свойство UserName переименовано в Name. Скорее всего это является причиной ошибки.
    xTony написал:
    2. Экспорт в BMP происходит при 96 dpi. Это крайне мало. Для распечатки документов требуется 300 dpi.

    Установка количества dpi для экспорта будет добавлена в следующей версии. Очень возможно, что в траильной версии разрешения более 96 dpi будут отключены.
    xTony написал:
    Жду откликов.
    Решение первых трех проблем достаточно критично для меня, так как очень хочется продолжить работать на вашем продукте, но заказчикам это объяснить сложно - им нужен результат.

    Спасибо за отзывы, Ваши пожелания направлены разработчику, ответственному за экспорт.

    С уважением
  • отредактировано 18:12
    Я немного ошибся, не проходит стока:
    DataSet.Name = "NewDataSet";
    Я привел строку string ds = DataSet.Name; потому-что даже при обращении к ней уже выбрасывается исключение.

    Привожу полный текст:

    Server Error in '/WebApplication1' Application.

    QueryInterface for interface FastReport.IfrxUserDataSetAggregate failed.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.InvalidCastException: QueryInterface for interface FastReport.IfrxUserDataSetAggregate failed.

    Source Error:


    Line 28: DataSet = new TfrxUserDataSetClass();
    Line 29: //DataSet. UserName = "NewDataSet";
    Line 30: string ds = DataSet.Name;
    Line 31: DataSet.Name = "NewDataSet";

    Source File: c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs Line: 30
    Stack Trace:
    [InvalidCastException: QueryInterface for interface FastReport.IfrxUserDataSetAggregate failed.]
    FastReport.TfrxUserDataSetClass.get_Name() +0
    WebApplication1.WebForm1.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\webapplication1\webform1.aspx.cs:30
    System.Web.UI.Control.OnLoad(EventArgs e)
    System.Web.UI.Control.LoadRecursive()
    System.Web.UI.Page.ProcessRequestMain()
    Version Information: Microsoft .NET Framework Version:1.1.4322.2032; ASP.NET Version:1.1.4322.2032
  • отредактировано May 2005
    Имеется ли возможность при дизайне отчетов задать фильтр для отображения записей в band для Master Data? Например, чтобы пользователь ввел в форму начальную и конечную даты, затем построился бы отчет только для этого диапазона. Я использую в качестве dataset'a свой собственный, унаследованный от CfrxUserDataSet.
  • отредактировано 18:12
    Имеется. Создайте обработчик OnBeforePrint для дата-бэнда и напишите что-то вроде:
    MasterData1.Visible := <myDataset."MyField"> > some_value
  • отредактировано 18:12
    AlexTZ написал:
    Имеется. Создайте обработчик OnBeforePrint для дата-бэнда и напишите что-то вроде:
    MasterData1.Visible := <myDataset."MyField"> > some_value
    Большое спасибо за подсказку! Мощь и гибкость Fast Report'a поистине заслуживает восхищения! ;)
  • almanalman космополит
    отредактировано 18:12
    xTony написал:
    Я немного ошибся, не проходит стока:
    DataSet.Name = "NewDataSet";
    Я привел строку string ds = DataSet.Name; потому-что даже при обращении к ней уже выбрасывается исключение.
    Мне понадобится пара дней, чтобы пофиксить эту проблему.
  • almanalman космополит
    отредактировано 18:12
    Можно скачать обновление тестовой версии Fast Report COM.

    http://fast-report.com/pbc_download/frx3com_trial2.exe

    Изменения:
    1. Исправлена бага при работе под ASP.NET
    2. Добавлены два экспорта: TIFF и JPEG
    3. Добавлены параметры для всех экспортов, кроме экспорта в txt.
    4. Базируется на FastReport 3.14
    5. Багофиксы
    6. Добавлены новые баги ;)
  • отредактировано 18:12
    не подскажите ли примерчик для VC создания отчета в коде
    хотелось бы воспроизвести пример из документации
    var Page:TfrxReportPage; Band:TfrxBand; DataBand:TfrxMasterData; Memo:TfrxMemoView;
    {очищаем отчет }
    frxReport1.Clear;
    {добавляем источник данных в список доступных для отчета }
    frxReport1.DataSets.Add frxDBDataSet1);
    {добавляем страницу }
    Page :=TfrxReportPage.Create frxReport1);{создаем уникальное имя }
    Page.CreateUniqueName;{устанавливаем размеры полей,бумаги и ориентацию по умолчанию }
    Page.SetDefaults;{меняем ориентацию бумаги }
    Page.Orientation :=poLandscape;
    {добавляем report title }
    Band :=TfrxReportTitle.Create(Page); Band.CreateUniqueName;{для бэнда достаточно установить координату Top и высоту }
    {обе координаты -в пикселах }
    Band.Top :=0; Band.Height :=20;
    {добавляем объект на report title }
    Memo :=TfrxMemoView.Create(Band); Memo.CreateUniqueName; Memo.Text :='Hello FastReport!'; Memo.Height :=20;{этот объект будет растянут на ширину бэнда }
    Memo.Align :=baWidth;
    


    я пока дальше
    CfrxReport  *pReport=NULL;
    HRESULT  hr;
    
    pReport  = new CfrxReport;
    pReport->Initialize();
    
    hr = pReport->LoadFromFile("report.fr3");
    hr = pReport->ShowReport();
    
    delete[] pReport;
    

    а дальше не знаю как получить указатели на обьекты, которые лежат на странице
  • almanalman космополит
    отредактировано 18:12
    EugeneVC написал:
    не подскажите ли примерчик для VC создания отчета в коде
    хотелось бы воспроизвести пример из документации

    В версии Beta2 - можно получить доступ только к структуре репорта, а в версии Beta3, которая сейчас на подходе, уже кое что можно.

    Ещё нет обёрток для COM объектов, введённых в версию Beta3, поэтому демонстрационная программа напрямую общается с COM сервером. Приблизительно так выглядит вышеприведенный пример:
    void CfrxCOMDlg::OnFeaturesDynamicreport()
    {
    	HRESULT    	hr;
    	IfrxRuntimeControl	*	pControl;
    	IfrxComponents  *	pReportComponent;
    	IfrxComponents  *	pReportPageComponent;
    	IfrxComponents  *	pReportTitleComponent;
    	IfrxComponents  *	pMemoViewComponent;
    	IfrxCustomMemoView	*	pCustomMemoView;
    
    	// Typecasting to IfrxRuntimeControl interface
    	hr = pReport->pReport->QueryInterface(IID_IfrxRuntimeControl, (PVOID*) &pControl);
    	if( FAILED(hr) ) throw (hr);
    
    	// Clear existing report
    	pControl->Clear();
    
    	// Query base interface of IfrxReport
    	hr = pReport->pReport->QueryInterface(IID_IfrxComponents, (PVOID*) &pReportComponent);
    	if( FAILED(hr) ) throw (hr);
    
    	// Create report page object
    	hr = pControl->CreateReportObject(
      pReportComponent, 
      typeReportPage, 
      CComBSTR("DynamicPage"), 
      (IfrxComponents**) &pReportPageComponent);
    	if( FAILED(hr) ) throw (hr);
    
    	// Create report title object
    	hr = pControl->CreateReportObject(
      pReportPageComponent, 
      typeReportTitle, 
      CComBSTR("DynamicTitle"), 
      (IfrxComponents**) &pReportTitleComponent);
    	if( FAILED(hr) ) throw (hr);
    	pReportTitleComponent->put_Top(0);
    	pReportTitleComponent->put_Height(20);
    
    	// Create memo view object
    	hr = pControl->CreateReportObject(
      pReportTitleComponent, 
      typeMemoView, 
      CComBSTR("DynamicMemo"), 
      (IfrxComponents**) &pMemoViewComponent);
    	if( FAILED(hr) ) throw (hr);
    	pMemoViewComponent->put_Left(50);
    	pMemoViewComponent->put_Top(10);
    	pMemoViewComponent->put_Height(20);
    	pMemoViewComponent->put_Width(200);
    
    	// Typecasting to IfrxCustomMemoView interface
    	hr = pMemoViewComponent->QueryInterface(IID_IfrxCustomMemoView, (PVOID*) &pCustomMemoView);
    	if( FAILED(hr) ) throw (hr);
    
    	// Write text into memo
    	pCustomMemoView->put_Text( CComBSTR("Hello, FastReport!") );
    
    	// Show report
    	pReport->ShowReport();
    
    	// Release interfaces
    	pCustomMemoView->Release();
    	pMemoViewComponent->Release();
    	pReportTitleComponent->Release();
    	pReportComponent->Release();	
    	pReportPageComponent->Release();
    	pControl->Release();
    }
    
    
    EugeneVC написал:
    а дальше не знаю как получить указатели на обьекты, которые лежат на странице

    Поскольку объект Report наследован от TfrxComponent, то можно получить интерфейс на TfrxComponent. В свою очередь, TfrxComponent имеет свойство ObjectsCount и метод GetObject, с помощью которых можно получить дочерние объекты класса TfrxReport. Далее можно анализировать свойство BaseName у дочерних объектов и в зависимости от типа объекта запрашивать соответсвующий интерфейс.
    Конечно, это весьма громоздко, поэтому в последующих версиях рутинные операции будут реализованы в обёртке.

  • отредактировано 18:12
    спасибо, насчет оберток я так примерно так и думал

    1. А когда выйдет примерно beta3?

    2. Нельзя ли уменьшить размер COM dll. А то 4.5 мегобайта - мне кажется многовато!
  • almanalman космополит
    отредактировано 18:12
    EugeneVC написал:
    1. А когда выйдет примерно beta3?

    Вышла сегодня:
    http://fast-report.com/pbc_download/frx3com_trial3.exe
    EugeneVC написал:
    2. Нельзя ли уменьшить размер COM dll. А то 4.5 мегобайта - мне кажется многовато!

    Уменьшили. Сейчас 2.75 Мб.
  • отредактировано June 2005
    спасибо уже качаем
    написал:
    еще бы хотелось отметить, то что в примерах к VisualC++ в beta2
    есть 2 файла
    frxCOM_h.h
    frxCOM_i.c

    они созданы на основе файла frxCOM.idl

    но прикол в том, что эти файлы собраны midl компилятором от VC7, и не собираются VC6

    Я насколько знаю VC6 щас пока популярнее VC7. Конечно, проблем пересобрать midl компилятором нет, но все же это лишний барьер к использованию продукта.

    PS: В beta3 уже VC6 собрали, неплохо бы еще и VC6 проектик класть
  • almanalman космополит
    отредактировано 18:12
    EugeneVC написал:
    PS: В beta3 уже VC6 собрали, неплохо бы еще и VC6 проектик класть
    В следующей версии скорее всего появится.
  • отредактировано 18:12
    up

    когда появится новая версия
    ждем

    а то наблюдается какой то перерывчик

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

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