Страница 1 из 1

Замена DataSource отчёта на внешние DataTable

Добавлено: 19 июн 2009, 12:09
Serpentariy
Здравствуйте.
В Dictionary добавил Sql Connection.
Добавил два DataSource, на основе хранимых процедур, использующих этот connection.
Добавил Relation связывающий эти DataSource.
На основе этих DataSource создал и отладил отчёт типа Master-Detail.
В своём приложении хочу отобразить данный отчёт, но данные получаемые отчётом
хочу заменить на подготовленные моим приложением DataTable-ы.
Т.е. мне надо, чтобы отчёт не запрашивал данные, а использовал те, что я ему подсуну.
Можно ли это сделать, и если да, то как?
Спасибо.

Замена DataSource отчёта на внешние DataTable

Добавлено: 22 июн 2009, 05:33
Jan
Здравствуйте,

Используйте такой код:

Код: Выделить всё

report.Databases.Clear();
report.DataSources.Clear();
report.RegData("MyDataSet", dataSet);
report.Dictionary.Synchronize();
Проверьте имена которые получаются у новых источников данных. Они должны совпадать с именами удаленных источников данных. Для проверки отчета можно вызвать дизайнер отчетов после верхнего кода:

Код: Выделить всё

report.Design();
Спасибо.

Замена DataSource отчёта на внешние DataTable

Добавлено: 22 июн 2009, 06:01
Serpentariy
Ясно. То есть напрямую, не очищая источники данных в отчёте и
не создавая на клиенте необходимую структуру данных в Dataset-е,
который и будет зарегистрирован в отчёте, это невозможно.
Т.е. что то типа этого:

Код: Выделить всё

DataTable dt=new DataTable()
//Здесь заполнение DataTable-а
report.DataSources[0].DataTable=dt

Замена DataSource отчёта на внешние DataTable

Добавлено: 23 июн 2009, 11:12
Jan
Здравствуйте,

Если нужно сделать именно так, то подпишитесь на BeforePrintEvent событие первой страницы скомпилированного отчета). В этом событии можно переприсвоить DataTable свойство источника данных.

Спасибо.

Замена DataSource отчёта на внешние DataTable

Добавлено: 14 июл 2009, 10:10
Master
Пользовался версией 2008.2.
Код там был таковым:

Код: Выделить всё

        protected void InitializeReport()
        {// Инициализация отчёта
            stiReport.Load(Application.StartupPath + m_strPathReport);

            stiReport.Compile();

            stiReport[REP_HEADER_REPORT] = m_strHeadingReportData + " в организации " + tscbNameCompany.ComboBox.Text + ".";
            stiReport.RegData(m_ds);
        }
Обновли версию компонента до 2009.1. Всё работало, пока я не залез и не изменил(обновил) источники данных, как это описывал Serpentariy.
Теперь код таковой:

Код: Выделить всё

        protected void InitializeReport()
        {// Инициализация отчёта
            stiReport.Load(Application.StartupPath + m_strPathReport);

            //Удаляем предыдущие DataSet
            stiReport.DataSources.Clear();
            stiReport.RegData("NewDataSet", m_ds);
            stiReport.Dictionary.Synchronize();

            stiReport.Compile();

            stiReport[REP_HEADER_REPORT] = m_strHeadingReportData + " в организации " + tscbNameCompany.ComboBox.Text + ".";
        }

Замена DataSource отчёта на внешние DataTable

Добавлено: 14 июл 2009, 10:24
Master
Есть один вопрос.
У меня в представлении vw_zrep_InfoPeopleChildrenAge есть поля: CompanyID, CompanyName, Fio, SubJobTitle, Department и Age.

Я ему даю такой запрос:

Код: Выделить всё

SELECT CompanyID,CompanyName,FIO,SubJobTitle,Department, COUNT(*) AS QuantityChildren 
FROM  vw_zrep_InfoPeopleChildrenAge  
WHERE  1=1 AND CompanyID=1 
GROUP BY CompanyID,CompanyName,FIO,SubJobTitle,Department

в строке

Код: Выделить всё

stiReport.Compile();
получаю ошибку:

Код: Выделить всё

c:\Temp\twgyjkon.0.cs(85,46) : error CS0117: 'Reports.Отчет.TableDataSource' does not contain a definition for 'Fio'

Замена DataSource отчёта на внешние DataTable

Добавлено: 14 июл 2009, 18:12
Jan
Здравствуйте,

Судя по всему, где то в выражении используется поле Fio. В запросе поле записано как FIO. Для c# компилятора это разные идентификаторы.

Спасибо.