Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/41: Рейтинг темы: голосов - 41, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 27.01.2015
Сообщений: 107

ReportViewer для произвольного SQL запроса

29.05.2015, 20:02. Показов 8056. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята помогите!
я только разбираюсь с тем, как создавать отчёт на C#. Но, получается создавать их только на основе таблиц(к C# подсоединена база SQL server)
А мне нужно, чтобы отчёт создавался на основе запроса SQL.
Как это проделать, или прописать код(по возможности с комментариями и где именно прописывать код).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.05.2015, 20:02
Ответы с готовыми решениями:

Вывод отчета из MS SQL Server в ReportViewer
Есть у кого пример вывода чего нибудь в отчет на шарпе в форму в элемент ReportViewer. Пример кода нужен ну или как сделать его? ...

Набор параметров для SQL запроса
Добрый вечер. Требуется сделать фильтрацию таблицы по нескольким параметрам, набор и значения которых неизвестны заранее. Подскажите...

ProgressBar для отображения выполнения SQL-запроса
Подскажите, как реализовать ProgressBar для SQL запроса. Запрос обычный SELECT... FROM ... LEFT JOIN .... , но таблицы очень большие и...

11
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 20:55
тоже когда то надо было, а в инете примеры были только через wizard.
1) создаете в проекте dataset - это будет датасет отчета, в нем создаете таблицу а в ней поля. Эту таблицу заполнит ваш будущий запрос. соответственно поля таблицы = полям запроса. все дата сет готов.
2) создаете новую форму на нее кидаете reportViewer и кидаете bindingSource. на этом на с формой все.
3) добавляете в проект сам отчет rdlc в нем делаете ссылку на созданный вами для него датасет из пункта 1
это метод который будет показывать вам отчет он у меня в классе ReportClass:
в него передаем:
1)string strSql - строк запроса
2)BindingSource bsReport - биндинг соурс отчета, из пункта 2 что выше
3)ReportViewer RepViewer - сам ReportViewer на форме тоже из пункта 2
4)string ReportPath - путь к самому файлу отчету rdlc из пункта 3
5)string dsName - имя датасета из пункта 1
C#
1
2
3
4
5
6
7
8
9
10
public void LoadReportEge(string strSql, BindingSource bsReport, ReportViewer RepViewer, string ReportPath, string dsName)
        {
            dataHelper data = new dataHelper();// это у меня ссылка на класс с sql'евскими методами
            bsReport.DataSource = data.getData(strSql); // тут метод возвращающий заполненный DataTable с данными
            RepViewer.ProcessingMode = ProcessingMode.Local;
            RepViewer.LocalReport.DataSources.Add(new ReportDataSource(dsName, bsReport));
            RepViewer.LocalReport.ReportPath = ReportPath;
            RepViewer.RefreshReport();
 
        }
метод который мне вернет заполненный DataTable. тут все просто и считаю в коментах не нуждается
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public DataTable getData(string sqlQueryString)
        {
            try
            {
                using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlQueryString, connStr))
                {
                    DataTable table = new DataTable();
                    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                    dataAdapter.Fill(table);
                    return table;
                }
            }
            catch
            {
                return null;
            }
 
        }
остается только вызов
C#
1
2
3
4
5
6
7
8
9
 string strSql = "ваш запрос";
            
 
            Classes.ReportClass RepCls = new Classes.ReportClass();// объявили класс с методом отчета
            RepForms.EgeRepForm frmEge = new RepForms.EgeRepForm();
            frmEge.WindowState = FormWindowState.Maximized;
            frmEge.Show();//открыли форму с отчетом
            var EgeForm = helper.GetForm<RepForms.EgeRepForm>(); //получил доступ к ней кстати через метод и контролы на ней public
            RepCls.LoadReportEge(strSql, EgeForm._bsPrintEge, EgeForm._rvPrintEge, Application.StartupPath + @"\Reports\EgeReport.rdlc", "dsEge");//запустили метод и увидили отчет
тот метод что дает доступ к открытой форме и ее элементам
C#
1
2
3
4
5
6
7
class helperClass
    {
        public T GetForm<T>() where T : Form
        {
            return (T)Application.OpenForms[typeof(T).Name];
        }
    }
3
0 / 0 / 1
Регистрация: 27.01.2015
Сообщений: 107
29.05.2015, 21:39  [ТС]
wm_leviathan, 3) добавляете в проект сам отчет rdlc в нем делаете ссылку на созданный вами для него датасет из пункта 1
Не совсем понимаю, "отчет rdlc"
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 21:41
я накидал вам простенький пример реализующий все это описанное выше.
базу использовал access'овску для переносимости.
в таблице поля фамилия, имя, отчество и город их и вывожу в отчет
ReportProj.rar
конечно пример простой но реализует у меня практически все отчеты.
По крайней мере мне не надо пользоваться жутко неудобным визардом и в любой момент я могу изменить строку с запросом и получить в этот же отчет немного другие данные
1
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.05.2015, 21:42
Цитата Сообщение от Lina_A Посмотреть сообщение
Не совсем понимаю, "отчет rdlc"
0
3 / 3 / 1
Регистрация: 18.12.2014
Сообщений: 74
24.08.2015, 15:53
wm_leviathan, здравствуйте, наткнулся на вашу тему, сделал вроде бы всё так же, НО в отчёте отображается только одна строка из dataseta, хотя по гриду видно все строки, не подскажете в чём м.б. проблема???
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
25.08.2015, 14:34
Leo28, компонент, для вывода данных в отчете, используете Tablix ?
0
3 / 3 / 1
Регистрация: 18.12.2014
Сообщений: 74
25.08.2015, 15:02
wm_leviathan, нет, не использую

Добавлено через 7 минут
вообщем в корне проекта я создал репорт, к нему подвязал созданный дадасет, в дата сете создал таблицу с такими же полями как и в запросе ну и далее
C#
1
2
3
4
             rv.ProcessingMode = ProcessingMode.Local;
             rv.LocalReport.DataSources.Add(new ReportDataSource("dataset1", bs));
             rv.LocalReport.ReportPath = "D:/project/client_postgres/client_postgres/Report1.rdlc";             
             rr.RefreshReport();
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
25.08.2015, 15:57
покажите скрин формы отчета, ну того rdlc. будем разбираться. кстате в примере что я прикриплял выше в отчете все норм настроено
0
3 / 3 / 1
Регистрация: 18.12.2014
Сообщений: 74
25.08.2015, 16:12
wm_leviathan, извиняюсь, но я хз что такое было, всё удалил заново пересоздал , пере подвязал, только вместо биндинг-соурс, указал дата тейбл и о чудо всё поехало!!!
0
102 / 24 / 12
Регистрация: 12.12.2013
Сообщений: 211
Записей в блоге: 1
27.08.2015, 11:55
wm_leviathan,
У ТС прошу прощения.
Но вопрос у меня почти похож за исключением того, что у меня есть в проекте готовый DataSet с именем DataSetLabel с таблицами DtPackageAdhesion, DtPackageBox, DtProduct. Так же есть готовые rdlc c именем ReportA3Box.rdlc
его код с DataSource
Кликните здесь для просмотра всего текста

XML
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<AutoRefresh>0</AutoRefresh>
  <DataSources>
    <DataSource Name="DataSetLabel">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSet</DataProvider>
        <ConnectString>/* Local Connection */</ConnectString>
      </ConnectionProperties>
    </DataSource>
  </DataSources>
  <DataSets>
    <DataSet Name="DataSetLabel">
      <Query>
        <DataSourceName>DataSetLabel</DataSourceName>
        <CommandText>/* Local Query */</CommandText>
      </Query>
      <Fields>
        <Field Name="PRODUCT">
          <DataField>PRODUCT</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="PRODUCTTYPE">
          <DataField>PRODUCTTYPE</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="VALENCY">
          <DataField>VALENCY</DataField>
          <rd:TypeName>System.Decimal</rd:TypeName>
        </Field>
        <Field Name="ANUMBER">
          <DataField>ANUMBER</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
      </Fields>
      <rd:DataSetInfo>
        <rd:DataSetName>DataSetLabel</rd:DataSetName>
        <rd:TableName>DtProduct</rd:TableName>
        <rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
        <rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
        <rd:TableAdapterName>DtProductTableAdapter</rd:TableAdapterName>
      </rd:DataSetInfo>
    </DataSet>
    <DataSet Name="DataSetBox">
      <Query>
        <DataSourceName>DataSetLabel</DataSourceName>
        <CommandText>/* Local Query */</CommandText>
      </Query>
      <Fields>
        <Field Name="PACKAGETITLE">
          <DataField>PACKAGETITLE</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="AMOUNT">
          <DataField>AMOUNT</DataField>
          <rd:TypeName>System.Decimal</rd:TypeName>
        </Field>
        <Field Name="CODE">
          <DataField>CODE</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="BARCODE">
          <DataField>BARCODE</DataField>
          <rd:TypeName>System.Byte[]</rd:TypeName>
        </Field>
      </Fields>
      <rd:DataSetInfo>
        <rd:DataSetName>DataSetLabel</rd:DataSetName>
        <rd:TableName>DtPackageBox</rd:TableName>
        <rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
        <rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
        <rd:TableAdapterName>DtPackageBoxTableAdapter</rd:TableAdapterName>
      </rd:DataSetInfo>
    </DataSet>
    <DataSet Name="DataSetAdhesion">
      <Query>
        <DataSourceName>DataSetLabel</DataSourceName>
        <CommandText>/* Local Query */</CommandText>
      </Query>
      <Fields>
        <Field Name="PACKAGETITLE">
          <DataField>PACKAGETITLE</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="AMOUNT">
          <DataField>AMOUNT</DataField>
          <rd:TypeName>System.Decimal</rd:TypeName>
        </Field>
        <Field Name="CODE">
          <DataField>CODE</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="BARCODE">
          <DataField>BARCODE</DataField>
          <rd:TypeName>System.Byte[]</rd:TypeName>
        </Field>
      </Fields>
      <rd:DataSetInfo>
        <rd:DataSetName>DataSetLabel</rd:DataSetName>
        <rd:TableName>DtPackageAdhesion</rd:TableName>
        <rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
        <rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
        <rd:TableAdapterName>DtPackageAdhesionTableAdapter</rd:TableAdapterName>
      </rd:DataSetInfo>
    </DataSet>
  </DataSets>
  <rd:ReportUnitType>Cm</rd:ReportUnitType>


Собственно как передать данные из DataSetLabel в rdlc.
Отчет генерирую без превью, и сразу экспортирую в pdf.
p.s. Если с превью то там все работает.
0
 Аватар для wm_leviathan
214 / 214 / 73
Регистрация: 12.01.2011
Сообщений: 767
29.08.2015, 21:57
у репорт вьювера есть LocalReport.Render используйте его с ключем "PDF" тогда он в бакграунде будет сразу сохранять в pdf. вот тут все хорошо описано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2015, 21:57
Помогаю со студенческими работами здесь

Подобрать для базы данных sql 4 запроса
Ребята создать 4 наиболее нужных и подходящих для этой бд sql запроса в базе данных на C# очень нужно

Передать значение textBox как параметр для SQL запроса
Как textBox сделать параметром запроса к БД MS SQL?

SQL запросы, чем плоха конкатенация SQL запроса?
Опишу ситуацию, есть БД с несколькими таблицами, с которыми нужно совершать много разных операций при разных условиях. Операции...

При выполнении запроса UPDATE возникает ошибка ORA-00933: SQL command not properly ended для таблицы с составным ключом
Эй, ребята, я пытаюсь обновить свою таблицу следующей частью кода: private void button4_Click(object sender, EventArgs e) ...

Progressbar для sql запроса
Добрый день, нуждаюсь в помощи знатоков. Ситуация следующая: Есть кнопка, при нажатии которой происходит выполнение sql запроса с...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru