|
|
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
Приветствую. Для поддержки одного старого софта возникла необходимость доработки. Используется 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. проставлено. Я проверял и через Profiler, и через тупой вывод SPID в отчет. FastReport работает только со вторым ADOConnection. Как от этого избавиться? Перейти на 6й репорт и проверить там, к сожалению, нет возможности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 12:18 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Каждый из потоков создает отдельный экземпляр этого TDataModule, передает туда свой ADOConnection, который устанавливается в DefaultDatabase у TfrxADOComponents компонента. Код будет или на слово верим? AlexPiter Код: pascal 1. Эта "хрень" не работает в 4-ке. Нужно допиливать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 12:44 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiterКаждый из потоков создает отдельный экземпляр этого TDataModule... ... через TCriticalSection только 1 из потоков юзает свой экземпляр DataModule Чёт как-то не очень понятно. Если в каждой нити свой экземпляр TDataModule - зачем их делить ч/з критические секции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 12:45 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
Не используйте DefaultDatabase, а передайте в отчёт экземпляр ADOConnection и подключайте запросы к нему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 12:57 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
wadman Код будет или на слово верим? Эта "хрень" не работает в 4-ке. Нужно допиливать. Код могу дать, но он еще сильно в разработке, так что недоделаный до конца. Я, вообще уже 4 года на C# сижу, понадобилось вот дописка в старый проект. В по поводу "хрени", которая не работает, можно подробнее. Я вообще не работал с FastReport в многопоточности. ъъъъъ Чёт как-то не очень понятно. Если в каждой нити свой экземпляр TDataModule - зачем их делить ч/з критические секции? Тут 2 причины: 1. Если очень большой объем данных (ну там на 25000 страниц в PDF), то случались вылеты по Out Of Memory (32 бита...) 2. Я исходно предполагал, что FastReport не будет корректно работать с одновременной генерацией из нескольких потоков. Но не до такой степени. На самом деле вся эта тема именно для того, чтобы генерить большие объемы, в несколько десятков тысяч страниц. Просто объем делится на куски по отдельному принципу, а потом генерится кусками. DimaBr Не используйте DefaultDatabase, а передайте в отчёт экземпляр ADOConnection и подключайте запросы к нему К сожалению не могу. Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего. Т.е. получается как: Вызывается процедура, которая возвращает текст запроса на создание/удаление темповых таблиц, он вызывается в каждом из Connection-ов. Потом вызываются процедуры, которые заполняют это дело. А потом по этим темповым таблицам строятся отчеты. Сам отчет берётся тоже из БД. А таких БД в дальнейшем будет... много. Не спрашивайте почему, просто так было сделано много лет назад. Когда я еще в этой организации и не работал. Мне тоже не очень нравится подход, но его невозможно изменить полностью не переписав всю приложуху. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 13:21 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего. Это не важно сколько и чего он имеет. Все эти запросы должны создаваться в скрипте отчёта и подключаться в переданному в отчёт коннекту. Ваш отчёт - автономная единица, которая должна строится по входящим параметрам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 14:09 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter В по поводу "хрени", которая не работает, можно подробнее. Я вообще не работал с FastReport в многопоточности. Фастрепорт игнорирует это флаг и дергает Application.ProcessMessages, что противопоказано в многопоточном окружении. AlexPiter К сожалению не могу. Ибо сам отчет должен иметь в себе заранее мне неизвестное количество TfrxADOTable, TfrxADOQuery и прочего. А придется. Можно делать следующим образом (это пример из рабочего кода, который нужно адаптировать для ADO) перед каждый Prepare и Show Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 14:14 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter, предлагаю ход конём. :) Вместо создания отдельной нити на отчет - на каждый отчет создавай отдельный процесс. Набор параметров можно передавать в командной строке, в json-файле, в сообщении... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 14:19 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
wadman, Кстати да, точно. Попробую так. Забыл я о таком методе. ъъъъъ, К сожалению не реально, т.к. это будет dll, аля плагин. Иначе, если бы это было stand alone, я б писал на C# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2021, 14:22 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
Итого отвечу сам себе. Я победил формирование отчетов в FR4 из нескольких ADOConnection. Могу выразить ОГРОМНОЕ ФИ разработчикам FR4. Как в FR6 не в курсе, не изучал. Вчера потратил некоторое время на изучение исходников FR4 и понял одну деталь. Компонент TfrxADOComponents должен быть 1 на ПРИЛОЖЕНИЕ. Он сохраняется внутри FR без привязки к классам. Бред да и только. Итого. В моём приложении есть ещё один глобальный TDataModule, к которому есть доступ отовсюду. Такой Singleton без красивостей... В общем, положил я туда единственный экземпляр TfrxADOComponents, и перед генерацией отчета кидаю в него тот ADOConnection, по которому должны строиться отчёты. Очень сильно пригодилось мне то, что я исходно генерацию сделал через Critical Section, чтобы была только 1 генерация в одно время. Работает. И вроде как, стабильно. Сейчас крутится тестовый прогон на 300 000 страниц. Уже к концу подходит. Конечно в реальности 300 000 вряд-ли будет, но лучше уж оттестировать нормально, особенно пока дома сижу на удалёнке, т.к. дома комп в разы мощнее, чем на работе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 11:42 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Очень сильно пригодилось мне то, что я исходно генерацию сделал через Critical Section, чтобы была только 1 генерация в одно время. Я так и не догнал, зачем разбрасывать генерацию разных отчетов по тредам, а потом генерить их по очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 11:51 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, Разбрасывается генерация ДАННЫХ из MSSQL, т.к. она занимает тоже приличное время. А генерация отчетов делается по очереди. И получается, что 1 поток генерит отчеты, 2й генерит данные, потом они меняются, и так до победного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 11:54 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter ъъъъъ, Разбрасывается генерация ДАННЫХ из MSSQL, т.к. она занимает тоже приличное время. А генерация отчетов делается по очереди. И получается, что 1 поток генерит отчеты, 2й генерит данные, потом они меняются, и так до победного. А зачем вообще формировать данные в объекте "отчет"? В отчет можно передать любые датасеты, вовсе не обязательно пользоваться костылями типа TfrxADO* и т.п., тем более что вы формируете параметры "на лету". Да и не только датасет, почти любую структуру можно. Почему не подготовить данные вне объект[а|ов] "отчет" и не передать их затем в объект[ы] типа "отчет". Хоть последовательно, хоть параллельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 12:05 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
ъъъъъ, Уходим в лирику, но поясню. Есть старый алгоритм, написанный когда я ещё о существовании организации, где он используется не знал, но работающий на 200+ базах данных (о том, что баз 200+ и что это плохо, а что это плохо, я согласен на 146%, тема отдельной дискуссии, но без тотальной переделки структуры БД по другому не сделать). В каждой из этих БД структура данных подобна, но разная. Вкратце работа происходит по следующему алгоритму: 1. Из БД берется информация о структуре данных (темповые таблицы, их может быть разное количество и разные сами таблицы от БД к БД). 2. В соединении они создаются. 3. Запускается ряд процедур, которые генерят данные в эти темповые таблицы (вот этот кусок и распараллелен) 4. Из БД же загружается отчёт. 5. Он строится из данных, созданных в п.2 и п.3 и выгружается в PDF. Моё приложение ВООБЩЕ ничего не передает в отчёт. Оно вызывает процедуры для создания данных и запускает построение отчета/выгрузку в PDF. Принцип распараллеливания следующий. Есть ещё одна темповая таблица, хоть она одинакова, в ней лежат ID объектов по которым надо построить данные/отчёты. Соответственно раньше в неё забрасывались ID всех объектов, по которым надо всё сгенерить, сейчас же есть самописный потокозащищенный TList c этими ID, и они постепенно забираются из него и по кускам строятся/выгружаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 12:50 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Моё приложение ВООБЩЕ ничего не передает в отчёт. Оно вызывает процедуры для создания данных и запускает построение отчета/выгрузку в PDF. А шаблон сам лезет к базе по Default коннекту, загружает данные и формирует красивую картинку. Та сделайте, чтобы шаблон брал не Default-коннект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2021, 15:08 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Компонент TfrxADOComponents должен быть 1 на ПРИЛОЖЕНИЕ. Он сохраняется внутри FR без привязки к классам. Бред да и только. Громкое заявление... Было-бы неплохо подкрепить кодом из FR, из которого сделан такой вывод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 09:45 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
DimaBr, Всё уже сделано. Вопрос был как заставить FastReport обрабатывать данные от нескольких ADOConnection и он решён. Надо было без изменений самих отчётов. Всё работает. wadman, Код, да пожалуйста: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. При условии, что я ничего не указал в Value, а именно так и происходит, берется ADOComponents.DefaultDatabase. Он в свою очередь объявлен как: Код: pascal 1. 2. в интерфейсной части модуля frxADOComponents. И то, что TfrxADOComponents положенный вообще в отдельный DataModule, а перед генерацией очередной части отчетов, я меняю DefaultDatabase у него, и при этом всё работает, подтверждает мою догадку, что берется именно этот, определенный вне классов, экземпляр TfrxADOComponents. Это актуально для FR 4.15, как в 6-ке я не могу сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 17:23 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
AlexPiter Код, да пожалуйста: Тут все логично. Если нет локального коннекта, то берется глобальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2021, 18:45 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
попробовал свою надстройку для ДОА (доступ в Оракл) от фаста 4.19 для работы с фаст 6 завелся без единого вопроса теперь долблю манагеров, чтобы купили фаст 6 vcl обещали сразу же в начале года и купить. в начале 2022-ого :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 09:58 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
andreymx теперь долблю манагеров, чтобы купили фаст 6 vcl А что там такого, для тебя ценного, чего нет в FR4? Расскажи - может, тоже купим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 10:13 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
ъъъъъ andreymx теперь долблю манагеров, чтобы купили фаст 6 vcl А что там такого, для тебя ценного, чего нет в FR4? Расскажи - может, тоже купим. 4-ка экспортирует в xls с ole или в xml типа экселя и там и там свои неприятности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 10:24 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
andreymx, ясно. Мы экспорт в xml (для MS Excel) используем. А ты уже тестировал FR6, в плане даннй фичи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 10:26 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
ъъъъъ andreymx, ясно. Мы экспорт в xml (для MS Excel) используем. А ты уже тестировал FR6, в плане даннй фичи? несколько отчетов 200 страниц экспортируются за 2-3 сек сводняки не пробовал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 10:30 |
|
||
|
FastReport 4 и несколько ADOConnection.
|
|||
|---|---|---|---|
|
#18+
andreymx, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2021, 10:31 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40037025&tid=2037698]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
192ms |
get topic data: |
12ms |
get forum data: |
4ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 573ms |

| 0 / 0 |
