powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FastReport 4 и несколько ADOConnection.
28 сообщений из 28, показаны все 2 страниц
FastReport 4 и несколько ADOConnection.
    #40035020
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую. Для поддержки одного старого софта возникла необходимость доработки.
Используется FastReport 4 и Delphi 2007.
Имеется 2 потока, в каждом из которых открыт ADOConnection к MsSQL серверу.
ADOConnection создается внутри потоков и явно работает корректно при всех обращениях к БД.
Также имеется TDataModule в котором находятся TfrxReport, TfrxADOComponents, TfrxPDFExport
Каждый из потоков создает отдельный экземпляр этого TDataModule, передает туда свой ADOConnection, который устанавливается в DefaultDatabase у TfrxADOComponents компонента.
Каждый из потоков создает временные таблицы, запускает несколько StoredProcedures для из заполнения (естественно входные параметры разные), после этого через TCriticalSection только 1 из потоков юзает свой экземпляр DataModule c FastReport компонентами, выгружает полученные отчеты в PDF.
Но получается, что всегда! используется ADOConnection, который был задан последним!!
Естественно вот это:
Код: pascal
1.
2.
3.
4.
 frxReport.EngineOptions.EnableThreadSafe:=true;
 frxReport.EngineOptions.UseGlobalDataSetList:=False;
 frxReport.EngineOptions.UseFileCache:=false;
 frxReport.ShowProgress:=false;


проставлено.
Я проверял и через Profiler, и через тупой вывод SPID в отчет. FastReport работает только со вторым ADOConnection.
Как от этого избавиться? Перейти на 6й репорт и проверить там, к сожалению, нет возможности.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035030
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter
Каждый из потоков создает отдельный экземпляр этого TDataModule, передает туда свой ADOConnection, который устанавливается в DefaultDatabase у TfrxADOComponents компонента.

Код будет или на слово верим?

AlexPiter
Код: pascal
1.
 frxReport.EngineOptions.EnableThreadSafe:=true;


Эта "хрень" не работает в 4-ке. Нужно допиливать.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035031
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexPiterКаждый из потоков создает отдельный экземпляр этого TDataModule...
...
через TCriticalSection только 1 из потоков юзает свой экземпляр DataModule

Чёт как-то не очень понятно. Если в каждой нити свой экземпляр TDataModule - зачем их делить ч/з критические секции?
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035034
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не используйте DefaultDatabase, а передайте в отчёт экземпляр ADOConnection и подключайте запросы к нему
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035041
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman

Код будет или на слово верим?

Эта "хрень" не работает в 4-ке. Нужно допиливать.

Код могу дать, но он еще сильно в разработке, так что недоделаный до конца. Я, вообще уже 4 года на C# сижу, понадобилось вот дописка в старый проект.
В по поводу "хрени", которая не работает, можно подробнее. Я вообще не работал с FastReport в многопоточности.

ъъъъъ

Чёт как-то не очень понятно. Если в каждой нити свой экземпляр TDataModule - зачем их делить ч/з критические секции?

Тут 2 причины:
1. Если очень большой объем данных (ну там на 25000 страниц в PDF), то случались вылеты по Out Of Memory (32 бита...)
2. Я исходно предполагал, что FastReport не будет корректно работать с одновременной генерацией из нескольких потоков. Но не до такой степени.
На самом деле вся эта тема именно для того, чтобы генерить большие объемы, в несколько десятков тысяч страниц. Просто объем делится на куски по отдельному принципу, а потом генерится кусками.

DimaBr
Не используйте DefaultDatabase, а передайте в отчёт экземпляр ADOConnection и подключайте запросы к нему

К сожалению не могу.
Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего.
Т.е. получается как:
Вызывается процедура, которая возвращает текст запроса на создание/удаление темповых таблиц, он вызывается в каждом из Connection-ов. Потом вызываются процедуры, которые заполняют это дело.
А потом по этим темповым таблицам строятся отчеты.
Сам отчет берётся тоже из БД.
А таких БД в дальнейшем будет... много. Не спрашивайте почему, просто так было сделано много лет назад. Когда я еще в этой организации и не работал. Мне тоже не очень нравится подход, но его невозможно изменить полностью не переписав всю приложуху.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035055
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter

Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего.

Это не важно сколько и чего он имеет. Все эти запросы должны создаваться в скрипте отчёта и подключаться в переданному в отчёт коннекту.
Ваш отчёт - автономная единица, которая должна строится по входящим параметрам.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035057
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter
В по поводу "хрени", которая не работает, можно подробнее. Я вообще не работал с FastReport в многопоточности.

Фастрепорт игнорирует это флаг и дергает Application.ProcessMessages, что противопоказано в многопоточном окружении.
AlexPiter
К сожалению не могу.
Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего.

А придется. Можно делать следующим образом (это пример из рабочего кода, который нужно адаптировать для ADO) перед каждый Prepare и Show
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TReportModule.ResetSession(const AReport: TfrxReport);
var i: integer;
		l: TList;
begin
	l := AReport.AllObjects;
	for i := 0 to l.Count - 1 do begin
		if TObject(l[i]) is TfrxDBQuery then begin
			(TObject(l[i]) as TfrxDBQuery).SessionName := Session.SessionName;
		end else if TObject(l[i]) is TfrxDBTable then begin
			(TObject(l[i]) as TfrxDBTable).SessionName := Session.SessionName;
    end;
  end;
end;
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035061
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexPiter,

предлагаю ход конём. :)
Вместо создания отдельной нити на отчет - на каждый отчет создавай отдельный процесс. Набор параметров можно передавать в командной строке, в json-файле, в сообщении...
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035064
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,
Кстати да, точно. Попробую так.
Забыл я о таком методе.
ъъъъъ,
К сожалению не реально, т.к. это будет dll, аля плагин.
Иначе, если бы это было stand alone, я б писал на C#
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035323
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итого отвечу сам себе.
Я победил формирование отчетов в FR4 из нескольких ADOConnection.
Могу выразить ОГРОМНОЕ ФИ разработчикам FR4. Как в FR6 не в курсе, не изучал.
Вчера потратил некоторое время на изучение исходников FR4 и понял одну деталь. Компонент TfrxADOComponents должен быть 1 на ПРИЛОЖЕНИЕ. Он сохраняется внутри FR без привязки к классам. Бред да и только.
Итого. В моём приложении есть ещё один глобальный TDataModule, к которому есть доступ отовсюду. Такой Singleton без красивостей...
В общем, положил я туда единственный экземпляр TfrxADOComponents, и перед генерацией отчета кидаю в него тот ADOConnection, по которому должны строиться отчёты. Очень сильно пригодилось мне то, что я исходно генерацию сделал через Critical Section, чтобы была только 1 генерация в одно время.
Работает. И вроде как, стабильно. Сейчас крутится тестовый прогон на 300 000 страниц. Уже к концу подходит. Конечно в реальности 300 000 вряд-ли будет, но лучше уж оттестировать нормально, особенно пока дома сижу на удалёнке, т.к. дома комп в разы мощнее, чем на работе.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035329
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexPiter
Очень сильно пригодилось мне то, что я исходно генерацию сделал через Critical Section, чтобы была только 1 генерация в одно время.

Я так и не догнал, зачем разбрасывать генерацию разных отчетов по тредам, а потом генерить их по очереди.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035331
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ,
Разбрасывается генерация ДАННЫХ из MSSQL, т.к. она занимает тоже приличное время.
А генерация отчетов делается по очереди.
И получается, что 1 поток генерит отчеты, 2й генерит данные, потом они меняются, и так до победного.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035336
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexPiter
ъъъъъ,
Разбрасывается генерация ДАННЫХ из MSSQL, т.к. она занимает тоже приличное время.
А генерация отчетов делается по очереди.
И получается, что 1 поток генерит отчеты, 2й генерит данные, потом они меняются, и так до победного.


А зачем вообще формировать данные в объекте "отчет"?
В отчет можно передать любые датасеты, вовсе не обязательно пользоваться костылями типа TfrxADO* и т.п., тем более что вы формируете параметры "на лету". Да и не только датасет, почти любую структуру можно.

Почему не подготовить данные вне объект[а|ов] "отчет" и не передать их затем в объект[ы] типа "отчет". Хоть последовательно, хоть параллельно.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035361
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ,
Уходим в лирику, но поясню.
Есть старый алгоритм, написанный когда я ещё о существовании организации, где он используется не знал, но работающий на 200+ базах данных (о том, что баз 200+ и что это плохо, а что это плохо, я согласен на 146%, тема отдельной дискуссии, но без тотальной переделки структуры БД по другому не сделать).
В каждой из этих БД структура данных подобна, но разная. Вкратце работа происходит по следующему алгоритму:
1. Из БД берется информация о структуре данных (темповые таблицы, их может быть разное количество и разные сами таблицы от БД к БД).
2. В соединении они создаются.
3. Запускается ряд процедур, которые генерят данные в эти темповые таблицы (вот этот кусок и распараллелен)
4. Из БД же загружается отчёт.
5. Он строится из данных, созданных в п.2 и п.3 и выгружается в PDF.

Моё приложение ВООБЩЕ ничего не передает в отчёт. Оно вызывает процедуры для создания данных и запускает построение отчета/выгрузку в PDF.

Принцип распараллеливания следующий. Есть ещё одна темповая таблица, хоть она одинакова, в ней лежат ID объектов по которым надо построить данные/отчёты. Соответственно раньше в неё забрасывались ID всех объектов, по которым надо всё сгенерить, сейчас же есть самописный потокозащищенный TList c этими ID, и они постепенно забираются из него и по кускам строятся/выгружаются.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035452
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter

Моё приложение ВООБЩЕ ничего не передает в отчёт. Оно вызывает процедуры для создания данных и запускает построение отчета/выгрузку в PDF.

А шаблон сам лезет к базе по Default коннекту, загружает данные и формирует красивую картинку.
Та сделайте, чтобы шаблон брал не Default-коннект
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035665
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter
Компонент TfrxADOComponents должен быть 1 на ПРИЛОЖЕНИЕ. Он сохраняется внутри FR без привязки к классам. Бред да и только.

Громкое заявление... Было-бы неплохо подкрепить кодом из FR, из которого сделан такой вывод.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035889
AlexPiter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,
Всё уже сделано. Вопрос был как заставить FastReport обрабатывать данные от нескольких ADOConnection и он решён. Надо было без изменений самих отчётов.
Всё работает.

wadman,
Код, да пожалуйста:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TfrxADOTable.SetDatabase(Value: TfrxADODatabase);
begin
  FDatabase := Value;
  if Value <> nil then
    FTable.Connection := Value.Database
  else if ADOComponents <> nil then
    FTable.Connection := ADOComponents.DefaultDatabase
  else
    FTable.Connection := nil;
  DBConnected := FTable.Connection <> nil;
end;



При условии, что я ничего не указал в Value, а именно так и происходит, берется ADOComponents.DefaultDatabase.
Он в свою очередь объявлен как:
Код: pascal
1.
2.
var
  ADOComponents: TfrxADOComponents;


в интерфейсной части модуля frxADOComponents.

И то, что TfrxADOComponents положенный вообще в отдельный DataModule, а перед генерацией очередной части отчетов, я меняю DefaultDatabase у него, и при этом всё работает, подтверждает мою догадку, что берется именно этот, определенный вне классов, экземпляр TfrxADOComponents.
Это актуально для FR 4.15, как в 6-ке я не могу сказать.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40035914
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexPiter
Код, да пожалуйста:

Тут все логично. Если нет локального коннекта, то берется глобальный.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037008
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробовал свою надстройку для ДОА (доступ в Оракл) от фаста 4.19 для работы с фаст 6
завелся без единого вопроса

теперь долблю манагеров, чтобы купили фаст 6 vcl
обещали сразу же в начале года и купить. в начале 2022-ого :(
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037016
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
теперь долблю манагеров, чтобы купили фаст 6 vcl

А что там такого, для тебя ценного, чего нет в FR4?
Расскажи - может, тоже купим.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037020
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
andreymx
теперь долблю манагеров, чтобы купили фаст 6 vcl

А что там такого, для тебя ценного, чего нет в FR4?
Расскажи - может, тоже купим.
самое ценное для меня в настоящее время - экспорт в xlsx без ole
4-ка экспортирует в xls с ole или в xml типа экселя
и там и там свои неприятности
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037021
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

ясно. Мы экспорт в xml (для MS Excel) используем.

А ты уже тестировал FR6, в плане даннй фичи?
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037024
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
andreymx,

ясно. Мы экспорт в xml (для MS Excel) используем.

А ты уже тестировал FR6, в плане даннй фичи?
протестировал в тестовом режиме
несколько отчетов
200 страниц экспортируются за 2-3 сек
сводняки не пробовал
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037025
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,

спасибо.
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037027
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати
год-два назад менял свой фаст 4.19
не помню точно, печатать не хотел на win-2016, то ли в файл, то ли что-то еще, то ли список принтеров
так поддержка помогла, прислала кусок кода
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037031
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037051
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

не
мы iif практически не пользуемся
никто не жаловался за последние 15 лет
...
Рейтинг: 0 / 0
FastReport 4 и несколько ADOConnection.
    #40037087
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
andreymx,

ясно. Мы экспорт в xml (для MS Excel) используем.
при открытии тех XML идут задержки в несколько секунд
такое ощущение, что винда в инет лезет, обрабатывает заголовок XML
и формат чисел иногда глючит неопределенным образом
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FastReport 4 и несколько ADOConnection.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]