Как создать отчет с помощью быстрых отчетов без прямого подключения к базе данных

Моя компания попросила меня обновить функциональность отчетов конкретного приложения, написанного на Delphi и использующего быстрые отчеты, чтобы вместо этого использовать FastReports.

Текущая реализация вытягивает все данные из базы данных, проделывает большую работу по организации и подсчету необходимых данных для отчетов и хранит все это в нескольких разных объектах. Затем события Quick Report OnNeedData используются для заполнения полос до тех пор, пока не закончатся данные (обозначается установкой MoreData = false).

Проблема, с которой я столкнулся, заключается в том, что Fast Reports, похоже, нуждается в полосе для подключения к реальному источнику данных, которого у меня нет. Также у fastReports, похоже, нет события, похожего на OnNeedData.

Можно ли каким-либо образом заполнить значения бэнда данных в коде и снова распечатать его, пока все данные не будут напечатаны без подключения бэнда к набору данных?

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


person Crunchie    schedule 17.12.2012    source источник


Ответы (5)


Быстрые отчеты используют промежуточный объект, производный от _TFrxDataSet, для подключения механизма отчетов, который печатает данные.

Чтобы подключить отчет к источнику данных, управляемому самой программой, вы используете компонент TfrxUserDataSet, который позволяет вам видеть набор данных внутри отчета, но вы вручную указываете имена столбцов в полях (TStrings ) свойства и управлять и поставлять значения, программно написав обработчики событий для следующих событий:

  • OnCheckEOF функционально эквивалентен OnNeedData, если больше нечего печатать, вы устанавливаете для параметра EOF var значение true.
  • OnFirst вы делаете все необходимое, чтобы начать поиск данных.
  • OnGetValue и OnNewGetValue вы предоставляете значения для каждого из различных столбцов текущей строки.
  • OnNext, OnPrior вы перемещаете свою текущую строку на одну следующую или одну предыдущую позицию.

Как вы видите, концепция строки/столбца (DataSet) используется для предоставления данных в отчет, но вы можете извлекать данные из любой структуры, которую вы используете для хранения результатов ваших вычислений (списки, массивы или любой другой объект). /структура/файл и т. д.)

Внутри отчета вы связываете полосу с этим логическим DataSet и используете стандартные компоненты для печати столбца values этого DataSet.

Если у вас уже есть данные в DataSet, например DataSet в памяти после ваших вычислений, лучше использовать TfrxDBDataset для прямой привязки вашего отчета к этому источнику данных.

person jachguate    schedule 17.12.2012
comment
Спасибо Это действительно полезно - person Crunchie; 17.12.2012
comment
@jachguate, у вас есть решение этой проблемы с отображением сетки быстрого отчета ссылка - person Ninad Avasare; 31.10.2013
comment
Я сделал простой пример - person dipold; 11.09.2018

вы можете использовать TfrxUserDataSet. В папке «demos» есть демонстрация с именем «printstringlist».

person kazarus    schedule 17.12.2012
comment
Может быть, сделать это комментарий вместо этого. - person cereallarceny; 17.12.2012
comment
Это совершенно правильный ответ - person Toby Allen; 17.12.2012
comment
Спасибо, эта демонстрация должна быть полезной - person Crunchie; 17.12.2012

В нашем проекте мы реализовали собственный класс, унаследованный от TfrxCustomQuery. Этот новый класс запросов просто перенаправляет свои операторы SQL на внутренний механизм запросов нашего приложения. Мы зарегистрировали этот новый класс в палитре FastReport (использовали frxDsgnIntf.frxObjects.RegisterObject* для FR версии 3 и 4), и теперь он используется во всех наших шаблонах отчетов вместо TfrxADOQuery или других встроенных классов набора данных.

person Anton R.    schedule 17.12.2012
comment
Я разрабатываю компонент, используя способ, который вы цитируете, внутри нового компонента я использую TClientDataSet для открытия запросов, я добавляю такие функции, как параметры, соединение, спасибо - person Erik Ferney Cubillos Garcia; 24.04.2018

Вот еще одна альтернатива:

Я использую FastReport уже много лет. Я иногда попадаю в подобную ситуацию. Для автономных табличных отчетов я использую набор данных в памяти. Я давно купил DevExpress, поэтому у меня есть TdxMemData. Но даже без него вы должны быть довольны использованием компонента TClientDataset.

Кроме того, TfrxUserDataset — это альтернатива, которую я использую при отображении списков объектов.

person alzaimar    schedule 17.12.2012

Есть возможность сделать это так, хотя это медленно,

Код:-

var
  FRX: TfrxReport;
procedure NewPage;
begin
  MyPage := TfrxReportPage.Create(FRX);
  MyPage.CreateUniqueName;
  MyPage.PaperSize := DMPAPER_A4;
end;
procedure ...(AText: string);
var
  frMemo : TfrxMemoView;
begin
  frMemo := TfrxMemoView.Create(MyPage);
  frMemo.CreateUniqueName;
  frMemo.Text := AText;
end;

С уважением
Герман

person user4514287    schedule 31.01.2015