Fr4 и многопоточность
Помогите кто сможет...
Есть компонент реализующий несколько видов отчётов. При запуске отчётов по одному всё отлично работает. Проблемы начинаются когда запускается на выполнение более одной инстанции одного вида отчётов На выходе получаются кривые отчёты... кривые в плане данных. Может получиться что на выходе неполный отчёт для одного, для другого вообще пустой... или вообще в каком либо отчёте данные из другого...
Нашёл в ФАКе следующее:
Вопрос: Как отключить использование глобального списка датасетов при использовании TfrxReport в потоке ?
Ответ
По умолчанию FR использует глобальный список датасетов который инициализируется в модуле frxClass, при создании экземпляра TfrxDBDataset он добавляется в этот список. В связи с этим не возможно использовать датасеты с одинаковыми именами (даже в разных потоках).
Для использования локального списка датасетов нужно использовать следующий код (начиная с версии 4.5.46):
frxReport.EngineOptions.UseGlobalDataSetList := False;
frxReport.EnabledDataSets.Clear();
frxReport.EnabledDataSets.Add(frxDataSet);
frxReport.LoadFromFile(ReportName);
Очень интересно стало, что за глобальный список и зачем так сделано?
ЗЫ: сделал изменения в коде, ничего не поменялось...
Есть компонент реализующий несколько видов отчётов. При запуске отчётов по одному всё отлично работает. Проблемы начинаются когда запускается на выполнение более одной инстанции одного вида отчётов На выходе получаются кривые отчёты... кривые в плане данных. Может получиться что на выходе неполный отчёт для одного, для другого вообще пустой... или вообще в каком либо отчёте данные из другого...
Нашёл в ФАКе следующее:
Вопрос: Как отключить использование глобального списка датасетов при использовании TfrxReport в потоке ?
Ответ
По умолчанию FR использует глобальный список датасетов который инициализируется в модуле frxClass, при создании экземпляра TfrxDBDataset он добавляется в этот список. В связи с этим не возможно использовать датасеты с одинаковыми именами (даже в разных потоках).
Для использования локального списка датасетов нужно использовать следующий код (начиная с версии 4.5.46):
frxReport.EngineOptions.UseGlobalDataSetList := False;
frxReport.EnabledDataSets.Clear();
frxReport.EnabledDataSets.Add(frxDataSet);
frxReport.LoadFromFile(ReportName);
Очень интересно стало, что за глобальный список и зачем так сделано?
ЗЫ: сделал изменения в коде, ничего не поменялось...
Комментарии
http://fast-report.com/ru/forum/index.php?showtopic=5351
Какое то странное проявление глюка. Уж лучше бы в ексепшн вылетал. Протестил ещё.... складывается впечатление что путаются датасеты....
Глобальный список используется для поиска датасетов, т.е. когда Вы добавляете сначала TfrxDBDataSet, а потом TfrxReport - датасеты будут доступны в дизайнере, т.к. список создается при инициализации модуля frxClass.
В глобальном списке нельзя использовать датасеты с одинаковыми именами, в этом случае будет выбран первый добавленный датасет.
Чтобы этого избежать было добавлено св-во UseGlobalDataSetList, но работать оно будет только до загрузки шаблона.