FastReport - это набор компонент для построения отчетов, представляет собой сочетание дизайнера, генератора и Preview отчетов. Данное средство примечательно наличием полноценного дизайнера по типу WYSIWYG, что очень сильно упрощает жизнь разработчику, всегда проще накидать отчет в дизайнере нежели описывать его в коде сценария. Так же имеется возможность экспорта сформированных отчетов в популярные форматы документов (rtf, xls, pdf и т.д). С полным перечнем возможностей данного продукта вы можете ознакомиться на официальном сайте компании производителя. Хотелось бы отметить тот факт что стоимость этого продукта вполне адекватна и соответствует заявленному функционалу. Для тех кто хочет сэкономить деньги компании, существует бесплатная версия продукта.
За основу для нашего будущего решения я взял VCL компоненты (среда разработки Delphi CodeGear (exBorland), так же можно использовать бесплатную IDE TurboGears, под ней тоже возможно скомпилировать проект). На выходе у нас должна получиться ActiveX библиотека. Итак, создаем CoClass FRReport и интерфейс IFReport c описание его методов, нам понадобятся следующие:
Реализация этого интерфейса достаточно проста, поэтому я пропущу код на паскале, т.к. все перечисленные методы по своей сути являются всего лишь оберткой для VCL класса TfrxReport. Кстати, не забудьте включить в проект модуль frxADOComponents, иначе не будет возможности обращаться к базе данных.
После компиляции мы получим библиотеку FRRepLib.dll, ее необходимо зарегистрировать посредством утилиты regsvr32.exe (regsvr32.exe [lib_folder]\FRRepLib..dll).
Для создания отчетов, нам потребуется сценарий вызова дизайнера:
Report = CreateObject("FRRepLib.FRReport")
Report.Design()
это самый простой вариант, при желании можно расширить функционал, все зависит от потребностей и фантазии разработчика.
Создать - создали, а что дальше? А дальше можно сохранять файлы в отдельную директорию или "шару" в сети и открывать их оттуда, но мы поступим иначе, мы будем хранить наши документы в самой СЕД Директум, при этом приобретая очень полезную фичу как версионность отчетов. Создаем справочник отчетов, в котором будем хранить наименование отчета и ссылку на файл, так же создаем еще один сценарий для обработки формирования отчета, который впоследствии мы подключим в нужный нам модуль. Текст сценария:
ВнешниеОтчеты = References.ВнешниеОтчеты.GetComponent()
ВнешниеОтчеты.ComponentForm.View.ViewMode = vmSelect
ВнешниеОтчеты.ComponentForm.View.MultiSelection = False
ВнешниеОтчеты.ComponentForm.ShowModal
if ВнешниеОтчеты.ComponentForm.Result = mrOK
ReportID = ВнешниеОтчеты.View.SelectedRecordsID(0)
ВнешниеОтчеты.Locate('Код'; ReportID)
EDocumentID = ВнешниеОтчеты.Requisites('ReportID').Value
EDocumentFactory = Application.EDocumentFactory
ReportDocument = EDocumentFactory.GetObjectByID(EDocumentID)
LastReportVersion = GetLastEDocumentVersionNum(ReportDocument)
ReportFileName = DocumentsFolder & '\tmp_report.fr3'
ReportDocument.Export(LastReportVersion; ReportFileName; FALSE)
Report = СоздатьОбъект("FRRepLib.FRReport")
Report.Load(ReportFileName)
Report.SetVariableValue("EDocID"; Object.ID)
Report.Show()
endif
Данный сценарий открывает справочник со списком отчетов в модальном режиме, определяет выбранную пользователем запись и через фабрику EDocumentFactory получет связанный документ самого отчета. Далее происходит извлечение последней версии документа и сохранение ее в пользовательский каталог, с последующем открытием отчета.
Мы получили возможность не только быстрого создания отчетов в среде FastReport, но и возможность хранить версии всех отчетов не используя внешних систем контроля версий.
Интересное решение. Только вот я сомневаюсь в целесообразности хранения отчетов в системе. Обычно сформировал отчет, посмотрел или распечатал и забыл про него. Потом при необходимости его можно сформировать снова. А тут как я понял все отчеты будут храниться в системе. Хотя сама идея интересная.
Дмитрий, Вы наверное не совсем поняли, сам, так сказать "макет" отчета хранится в базе, а не сформированный отчет. Т.о. изменяя макет Вы всегда можете откатиться если что то пошло не так.
Аааа... ну тогда совсем другое дело. Приношу извинения за невнимательность :)
Было бы неплохо, если бы выложили еще саму готовую ActiveX библиотеку :)
Отчеты надо хранить в системе, например, когда требуется подтверждение, что на такую-то дату отчет выглядел так и никак иначе. Сохранить в системе и подписать ЭЦП. На основании отчетных документов могут выпускаться приказы, заключаться договры, выплачиваться премиальные сотрудникам. Такие отчеты лучше всего защищать от изменений.
Кроме того, отчеты могут рассылаться на ознакомление или согласовываться. Тогда их тоже лучше делать документами. Во-первых, отчеты могут долго формироваться. Гораздо дольше, чем открывается документ. Во-вторых, у тех, кто должен ознакомиться с отчетом, может не быть доступа к тем компонентам информационной системы, которые формируют отчет (как к коду, так и к данным).
Денис, я согласен с тобой. Действительно бывают ситуации, описанные тобой, при которых отчет надо хранить в системе. Я лишь хотел сказать, что все подряд хранить не стоит.
Согласен, такой функционал имеет право на жизнь, но это уже другая история и при нехитрых доработках это реализуемо, я же говорил именно о макетах отчетов.
ссылка на видео http://www.youtube.com/watch?v=oR16Haw8syk
По поводу хранения отчетов - многичисленные RTF/HTML/XLS, присуствующие в системе являютя динамическими, то есть не обладают ни одним из вышеперечисленных свойств.
При желании отчет fast report можно экспортировать в неизменный формат, подписать и сохранить в системе. Ручками пользователей. А если такая возможность будет часто требоваться, то несложно и автоматизировать эти действия.
Алексей, можете показать реализацию ниже перечисленных методов в delphi?
IFReport.Design() - метод для запуска дизайнера отчетов
IFReport.Show() - метод для просмотра отчета
IFReport.Load(AFileName : string) - метод для загрузки файла отчета
IFReport.SetVariableValue(AName, AValue: string) - метод для инициализации переменной отчета
IFReport.GetVariableValue(AName: string) - метод для получения значения переменной отчета
да конечно, смотрите текст исходника ниже, но я не использую стандартную форму превью, т.к. сделал свою форму предпросмотра, так что все упоминания FPreviewForm можете заменить на вызов метода Show у FReport:
При попытке вызова любого метода библиотеки возвращающего WideString, получаю исключение Access Violation.
Например, вот метод:
Пробовал даже так делать, все равно возникает исключение:
Вызываю метод так:
Причем, если метод возвращает не WideString, а например Integer, то все работает без проблем.
Кто-нибудь может подсказать в чем проблема?
Забыл добавить, исключение возникает в самой dll и только при попытке вызова методов возвращающих WideString.
Очень странно, пришлите исходник архивом - посмотрю что не так. По фотографии лечить сложно....
Отправил вам на почту
Все понятно... вы немного ошиблись с описанием методов в библиотеке типов,
посмотрите на скрин, вот так должно выглядеть описание метода (Result типа HRESULT, у вас стоит BSTR).
Спасибо огромное, все заработало!
Добрый день. Есть вопрос по теме FastReporta. Отзовитесь.
Спрашивайте
Есть FastReport Studio, это COM/ActiveX компонент. В наличии сама dll
Пытаюсь вызвать с отчет и передать туда параметр. Форма отчета открывается, но параметр не передается.
он вызывается с помощью IS-Builder посредством сценария
Код на IS-Builder:
tReport = CreateObject("FastReport.TfrxReport")
tReport.LoadReportFromFile("c:\XXXX.fr3")
tReport.SetVariable('Taskid',152)
tReport.ShowReport()
Создание переменной с кода, работает
tReport.AddVariable('NameGroup','NameParam',123); -- 123 value
Если вызвать дизайнер, то видим, переменная создана, а значение не присваивается.
К сожалению по студии не готов давать какие-то комментарии, это разработка вендора, Вам лучше к ним обратиться за консультацией. Я могу Вам ответить только в рамках предложенной в статье схемы реализации "отчетника".
Хорошо. Как понял, то человек который скомпилировал под себя проект, по вашему примеру столкнулся с ошибкой при передачи значения. Вот Ваш ответ "Все понятно... вы немного ошиблись с описанием методов в библиотеке типов" В каком это методе?
У меня ошибки не возникает, просто не передается значение в переменную. Может стоит попробовать преобразовать перед передачей в какой то тип?
Этот комментарий был связан с корректностью описания параметров в собственном методе внутри библиотеки типов, т.е. внутри самой библиотеки.
Попробуйте перед Show вызвать PrepareReport или что-то аналогичное если есть, м.б. это Вам поможет.
Илья, я Вам уже ответил относительно студии, Ваш вопрос конечно связан с FR, но никак не связан с моей статьей. Откройте заявку на форуме разработчика в соответствующей теме https://www.fastreport.ru/ru/forum/index.php?s=74c07128ba1b6d55a1e9f30c9378ff3c&showforum=10
Да, я с вами соглашусь, но просто вы на основе vcl создали com обьект и использовали стандартные методы, которые такие же как и в студии. Вот и подумал, что ошибка может быть как раз в этом
Алексей Зиновьев
23 сентября 2010 в 17:46
Все понятно... вы немного ошиблись с описанием методов в библиотеке типов,
посмотрите на скрин, вот так должно выглядеть описание метода (Result типа HRESULT, у вас стоит BSTR).
Когда я создавал COM-объект, я не смотрел на описание методов в FR-студии.
Кстати, как Вы поняли что переменная не присваивается? Судя по ответу на форуме разработчика Вам дали пример кода как достучаться до параметров Query внутри отчета. Хотя на мой взгляд это кривоватый путь. На самом деле, в самом запросе параметр обозначается так: select * from SBTask where id = :ID , этот параметр ID необходимо сопоставить с параметром отчета (это разные параметры - параметр отчета и параметр запроса) в дизайнере либо в коде через Query.ParamByName(...). = Report.Variables(''), как то так... И далее при вызове "отчетника" через ком установить параметры отчета, далее отчет сам отработает входящий параметр согласно реализованной внутри логике.
Все усложняется тем, что под IS-Builder с FastReport никто не имел дело. Форум давно если живой, а разработчики прекратили поддержку данного компанента
разработчики прекратили поддержку данного компанента
Ну риски о том что это вообще будет работать в перспективе на Вас, м.б. и не нужен Вам именно этот компонент? У них есть поддержка Net и VCL, инструкция как собрать по рецепту отчетник выше в статье.Хорошо, спасибо. Попробую разобраться по собранию СОМ обьекта.
Добрый день. Что делаю не так, создаю ActiveX билиотеку, добавляю COM обьект, создаю методы, компилирую. DLL создается, регистрируется, но вызвать её не получается. Можете подробней о том как реализовать правильную библиотеку или где почитать?
Пока пробовал проект по ссылке http://www.introligator.org/articles/3/78
На втором этапе вам нужно создать AutomationObject а не ComObject
Ваш полученный класс должен имплементировать интерфейс IDispatch, что-то вроде этого
TReportWrapper = class(TAutoObject, IReportWrapper)
....
Спасибо. Мне дали исходные коды FR studio. проект компилируется, DLL регистрируется, шаблон открывается, но значение параметру у меня так и не передается. Может есть спортивный интерес посмотреть на студию изнутри и вынести вердикт:) ?
Пишите на почту zinovievalex [dog] ГМЕЙЛ.КОМ
Авторизуйтесь, чтобы написать комментарий