Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
1
.NET Core

FastReport.Net - как правильно сделать экспорт в цикле?

22.03.2021, 20:02. Показов 2467. Ответов 5

Author24 — интернет-сервис помощи студентам
Салют, коллеги!

Задача следующая. Нужно сформировать по шаблону FRX отчеты в FastReport двумя способами:
а) вход - список заказов, шаблон, выход - отдельный файл по каждому заказу;
б) вход - список заказов, шаблон, выход - один файл, который содержит инфу по заказам из списка.

Если вариант А достаточно просто оказалось сделать, то вот с Б я впал в ступор. На вход методу подается List<Order> orders и файл шаблона. В цикле foreach я беру номер заказа и подставляю его в SQL запрос. Затем пытаюсь подготовить полученные в TableDataSource данные, но, что было ожидаемо, файл затирается данными из последнего запроса. Подскажите, можно ли как-то сохранить промежуточный результат, чтобы потом в один файл все сохранить? Код на данный момент:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
report = new Report();
report.Load("\\template.frx");
TableDataSource tds = { /* инициализация по алиасу в frx */ }
 
foreach (var o in orders) {
    var sqlText = "SELECT * FROM myTable WHERE numOrder = '" + o.Num + "'";
    tds.SelectCommand = sqlText;
 
    report.Prepare();
}
 
using( /* экспорт в Word 2007*/ )
{
    // ...
    word2007.Export(report, fileName);
    // ...
}
Подозреваю, что копать надо в другую сторону, туда, где будет сложнее, но пока что пытаюсь идти по "лёгкому" пути, о котором на каждом шагу пишут разработчики генератора. Только вот не нашел примеров генерации отчетов, когда данные готовятся в циклах for/foreach...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2021, 20:02
Ответы с готовыми решениями:

ADO.NET и MS Word - экспорт таблиц, как сделать одним махом
Здесь приводится пример, как одним махом перенести таблицу из рекордсета в документ Word:...

VB .NET. Форма авторизации - как сделать правильно?
Всем привет. Речь пойдет о Visual Studio 2010 / visual basic 2010. Я на .NET платформу перешел...

Экспорт из FastReport в PDF
Здравствуйте! Не сталкивался ли кто-нибудь с такой проблемой: в программе формируется отчёт с...

Экспорт данных из RichTextBox в FastReport в формат RTF
при экспорте данных из RichTextBox в файле все форматирование пропадает. Когда я я экспортирую в...

5
1217 / 808 / 244
Регистрация: 08.08.2014
Сообщений: 2,378
22.03.2021, 20:29 2
У метода 'Prepare' должна быть перегруженная версия с bool-параметром 'append'.

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        //
        // Summary:
        //     Prepares the report.
        //
        // Parameters:
        //   append:
        //     Specifies whether the new report should be added to a report that was prepared
        //     before.
        //
        // Returns:
        //     true if report was prepared succesfully.
        //
        // Remarks:
        //     Use this method to merge prepared reports.
        public bool Prepare(bool append);
0
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
22.03.2021, 21:24  [ТС] 3
Это да, проверил первым делом. Без цикла то оно работает, как и в примере из документации - https://fastreports.github.io/... eport.html

Но в цикле почему-то не добавляет. В отладке не заметил, меняется ли что-то ещё, кроме текста sql-запроса да количества строк в tds.

Завтра попробую завернуть в трюкач, мб есть какое-то исключение, которое обычным способом не вываливается при исполнении
0
1217 / 808 / 244
Регистрация: 08.08.2014
Сообщений: 2,378
22.03.2021, 21:57 4
Проверил на простом примере со статическими данными, всё ок, 'append = true' дополняет отчёт в цикле:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public static byte[] BuildReport(string templateFile, List<object> reportData)
        {
            var rpt = new Report();
            rpt.Load(templateFile);
 
            foreach(var data in reportData)
            {
                rpt.RegisterData(new List<object>() { data }, "ReportData");
                rpt.Prepare(true);
            }
 
            //Export ...
1
15 / 14 / 2
Регистрация: 17.08.2012
Сообщений: 109
23.03.2021, 19:36  [ТС] 5
Вспомнил, у меня дублировались данные по самому первому айтему, потому всё стёр. Сегодня всё переделал, дубли были из-за того, что Load и TableDataSource вынес из цикла. Внёс назад. Полный рабочий код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public static class ReportGenerator
{
    private static readonly string exportPath = Settings.Default.Word2007ExportPath;
    /* FastReport EnvironmentSettings */
    
    public static void CreateReportInMultipleFiles(string templateFile, List<Order> ordersList)
    {
        Report report;
        TableDataSource tds;
        
        foreach (var order in ordersList)
        {
            report = new Report();
            report.Load(templateFile);
            tds = report.GetDataSource("Table") as TableDataSource;
            tds.SelectCommand = "SELECT * FROM myTable WHERE numOrder = '" + order.Num + "'";
            report.Prepare();
            
            // Если SelectCommand ничего не вернет, то нужно исключить пустые файлы
            if (tds.RowCount > 0)
            {
                using (var word2007 = new FastReport.Export.OoXML.Word2007Export())
                {
                    word2007.ShowProgress = false;
                    word2007.Export(report, exportPath);
                }
            }   
        }
    }
    
    public static void CreateReportInOneFile(string templateFile, List<Order> ordersList)
    {
        Report report = new Report();
        TableDataSource tds;
        var pageCount = 0; // Кол-во готовых страниц в документе
 
        foreach (var order in ordersList)
        {
            report.Load(templateFile);
            tds = report.GetDataSource("Table") as TableDataSource;
            tds.SelectCommand = "SELECT * FROM myTable WHERE numOrder = '" + order.Num + "'";
            
            // обязательно вызвать Init(), иначе значение RowCount будет равно 0 и обновится только после вызова Prepare(), как в первом варианте
            tds.Init();
 
            // Аналогичная проверка, только для пустых страниц
            if (tds.RowCount > 0)
            {
                report.Prepare(true);
                pageCount = pageCount + tds.RowCount;
            }
        }
        // Исключаем пустой документ
        if (pageCount > 0)
        {
            using (var word2007 = new FastReport.Export.OoXML.Word2007Export())
            {
                word2007.ShowProgress = false;
                word2007.Export(report, exportPath);
            }
        }
    }
}
Пока читал документацию, развил экстрасенсорные способности
0
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
23.03.2021, 21:22 6
sql injection vulnerable
0
23.03.2021, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2021, 21:22
Помогаю со студенческими работами здесь

Как в FastReport сделать альбомный лист A4?
Fast report 5. не могу найти что-то) Добавлено через 31 секунду т.е перевернуть боком лист

Как с помощью FastReport сделать чек по выбранной строке таблицы
Здравствуйте! Меня интересует как с помощью FastReport сделать чек по выбранной строке таблицы....

Работа с FastReport.Net
Надеюсь тут есть люди кто работал с FastReport.Net.Net В FastReport я передаю массив strring,...

Как правильно задать условие в цикле?
Постоянно сталкиваюсь с тем, что не могу правильно задать условие в цикле. Из-за этого приходится...

Как поставить правильно таймер в цикле?
подскажите, как сделать так ,что цикл каждый раз проходил через определенный интервал? if...

Как правильно использовать TextBox в цикле?
For x=1 to 100 TextBox (x)=&quot;&quot; как правильно записать Next x Добавлено через 21 минуту Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru