Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Заполнение Crystal Report с помощью цикла


Автор: Fomaa 15.4.2008, 14:56
Как в Crystal Report можно заносить данные из цикла?
Или как можно заносить данные из НЕТИПИЗИРОВАННОГО DataSet?

Автор: thomas 16.4.2008, 12:00
Fomaa, 
Приветствую.
Цитата

как можно заносить данные из НЕТИПИЗИРОВАННОГО DataSet? 

Crystal Report позволяеть создавать "отчёты" на основании данных либо из типизированного датасет, либо из базы данных напрямую.
С динамическими обьектами Crystal Report, к сожалению, работать не умеет.
Он должен знать таблицы и поля в них еще в design mode.
Плюс можно использовать view в БД как источник данных. Во view ты можешь выбрать данные из нескольких таблиц БД, а так же включить вычисляемые поля.
 В ДС только таблицы которые там созданы и заполнены.

Добавлено через 58 секунд
А что ты подразумеваешь под этим?
Цитата

Как в Crystal Report можно заносить данные из цикла?

Автор: Fomaa 16.4.2008, 23:07
Да, именно это и имел ввиду, вы в точности ответили на вопрос, спасибо.
Только с помощью каких же компонент можно создать отчет, который будет использовать нетипизированный датасет?

Автор: Fomaa 17.4.2008, 08:45
А можно в отчетах использовать хранимые процедуры?

Автор: akizelokro 17.4.2008, 09:38
Извини, в чем проблема, что ты не хочешь использовать типизированный DataSet?

Автор: thomas 17.4.2008, 13:07
Fomaa, 
Приветствую.
Цитата

Только с помощью каких же компонент можно создать отчет, который будет использовать нетипизированный датасет? 

Использовать НЕТИПИЗИРОВАННЫЙ(динамический, создаваемый в runtime) датасет для работы с Crystal Report НЕВОЗМОЖНО.

Если вы, в своей программе, используете все что угодно за исключением типизированного датасет, то отчеты в Crystal Report создаются на основе базы данных НАПРЯМУЮ.
Т.е. Crystal Report  в design mode обращаеться не к типизированному дата сет, а к базе данных, структура таблиц которой, в отличиии от не типизированного дата сет,  известна на этот момент. Это значит, что CR создает свое соединение с БД и для отчетов использует данные из БД, а не из памяти, как в случае с типизированным дата сет.
Цитата

А можно в отчетах использовать хранимые процедуры? 

Этого я не знаю, не пробовал. Я создаю отчеты на основании view в БД на MS SQL Server. Вполне возможно, что и можно. Раз view видны в мастере создания отчета, то может и хп там тоже отображаются. Только одно не маловажное замечание, для view не используються параметры, а для хп очень даже. И как это взаимодействует с Crystal Report я БМП.

Автор: archengel 17.4.2008, 21:55
в Crystal Report есть одна интересная фишка: можно указать в дизайнере источник данных, команду (command), он предложит вписать ее текст. Вот сюда можно впихнуть в принципе что угодно, от тела хранимой процедуры, до простого запроса. ПОтом раскидываем  поля по отчету как надо. И при загрузки отчета указываем ему источник, DataSet, DataTable  итд полученные на основе хранимки, запроса, или построенного вручную. Главное что бы названия полей в дизанере совпадали с полями в источнике, что ты привяжешь! Кушает как милый!

Добавлено через 8 минут и 14 секунд
thomas, время суток доброе.
Цитата

Использовать НЕТИПИЗИРОВАННЫЙ(динамический, создаваемый в runtime) датасет для работы с Crystal Report НЕВОЗМОЖНО.

Если вы, в своей программе, используете все что угодно за исключением типизированного датасет, то отчеты в Crystal Report создаются на основе базы данных НАПРЯМУЮ.
Т.е. Crystal Report  в design mode обращаеться не к типизированному дата сет, а к базе данных, структура таблиц которой, в отличиии от не типизированного дата сет,  известна на этот момент. Это значит, что CR создает свое соединение с БД и для отчетов использует данные из БД, а не из памяти, как в случае с типизированным дата сет.


Очень даже можно. Как я писал выше, привязывай, все что хочешь именно (runtime), главное чтобы название полей совпадало!.
Точнее поправлюсь, дизайнер использует прямой коннект к базе, а во время исполнения программе легко подменяется источник с прямого на свой конкретный, полученный в принципе любым путём smile 

Автор: jonie 17.4.2008, 22:56
дополню что Хранимки использовать можно, в качестве источника.
стоит заметить, что зачастую встроенные вычисления в CR работают быстрее, нежели вычисления на сервере БД.

Автор: EAV 18.4.2008, 08:00
Цитата(archengel @  17.4.2008,  23:55 Найти цитируемый пост)
привязывай, все что хочешь именно (runtime), главное чтобы название полей совпадало!

С этим согласен на 100%! сам пользуюсь подсовыванием источника данных.

Единственное что оставляет небольшое разочарование при использовании CR то, что нельзя создавать сам отчет (его структуру) непосредственно в runtime, а только можно использовать то, что ранее создал в дизайнере отчетов

Автор: thomas 18.4.2008, 12:13
Цитата(EAV @ 18.4.2008,  06:00)
Цитата(archengel @  17.4.2008,  23:55 Найти цитируемый пост)
привязывай, все что хочешь именно (runtime), главное чтобы название полей совпадало!

С этим согласен на 100%! сам пользуюсь подсовыванием источника данных.


archengel, 
EAV, 
Приветствую.
Что-то я вас не пойму  smile 

CR может брать данные из типизированного дата сет (т.е. из памяти) или из базы данных(т.е. с жесткого диска).
При этом весь дизайн отчёта формируеться в design mode,  а не в runtime.

Покажите мне, неразумному, как вы "скармливаете" CR-у в design mode данные из нетипизированного дата сет, создаваемого и заполняемого данными программно в runtime.   smile  Очень интересно. И желательно с картинками и пояснениями. 

Как вы обьясняете CR-у при его создании откуда он должен брать данные? Потому как к базе данных вы не обращаетесь (соединение не устанавливаете), а типизированного дата сет в проекте на наблюдаеться. Дата сет создаеться и заполняеться данными в runtime.

Вот скриншот из моего проекта для Crystal Report. Откуда он может взять данные для создания рапорта в design mode .
user posted image

зеленым подчеркнуто созданное соединение с базой данных на MS SQL server.
красной тонкой линией подчеркнута возможность создать команду на выборку данных из БД. Но тут происходит обращение именно к БД с которой уже есть соединение. Но вместо этого удобнее пользоваться командами уже созданными в БД, т.е. view или хранимыми процедурами. Их использовать можно.
синим подчеркнуты .NET Objects - это список форм в проекте, там никаких данных нет.
жирная красная линия подчеркивает отсутствие типизированного дата сет в проекте.
черным зачеркнуты строки не относящиеся к данному проекту.



Автор: vretsky 18.4.2008, 12:13
извините господа! 
сам столкнулся с похожей задачей, из описания архангела ниче не понял. как и где динамически указать источник данных? где в дизайнере выбрать комманд?

Добавлено через 9 минут и 44 секунды
вернее где создать команду в дизайнере я нашел, а как ее менять динамически?

Автор: thomas 18.4.2008, 12:27
vretsky, 
приветствую.
Цитата(archengel @  17.4.2008,  19:55 Найти цитируемый пост)
в Crystal Report есть одна интересная фишка: можно указать в дизайнере источник данных, команду (command), он предложит вписать ее текст. Вот сюда можно впихнуть в принципе что угодно, от тела хранимой процедуры, до простого запроса. 

вот тут товарисч написал то, что я сказал выше 
Цитата(thomas @  16.4.2008,  10:00 Найти цитируемый пост)
Crystal Report позволяеть создавать "отчёты" на основании данных либо из типизированного датасет, либо из базы данных напрямую.

А его понятие "всё что угодно" включает в себя все тот же запрос к базе данных, с которой уже есть соединение. Т.е. другими словами данные для CR будут браться из БД напрямую.
А не из какого-то там дата сет, который кто-то где-то когда-то создаст во время работы программы.





Автор: vretsky 18.4.2008, 12:30
или в сторед процедуру можно передать динамический параметр (параметры) ?
(под динамический понимать изменяемый пользователем)

Автор: thomas 18.4.2008, 12:32
Цитата

вернее где создать команду в дизайнере я нашел, а как ее менять динамически? 

что ты подразумеваешь под менять? Подставлять параметры в команду?

Если я правильно понимаю, в CR есть поля параметры.
И при помощи этих полей наверное можно выводить, например одну из многих накладных, передав в качестве параметра её номер.

Сейчас сам собираюсь над этим поработать.

Автор: vretsky 18.4.2008, 12:53
thomas 
приветствую!

вот команда к примеру

select *
from Addresses
where code=@param

создаю параметр @param
жму OK, получаю ошибку должна быть объявлена скалярная переменная!!!!!!!!!!!!

Автор: EAV 18.4.2008, 13:33
thomas, 
моя мысль была в следующем:
Сам отчет можно создать только в design mode. При создании отчета если он будет основываться на каких-то данных из БД, то в design mode необходимо создать подключение к уже существующей БД и указать какие поля нужно использовать в отчете.
Про runtime упоминалось в том смысле что во время выполнения программы данные для существующего отчета можно получить как угодно (причем не обязательно из той же таблицы, к который мы конектились во время создания отчета), главное чтобы совпадали названия полей, которые были забиты у вас в дизайнере, с полями, которые вы получили во время выполнения программы.

Автор: akizelokro 18.4.2008, 13:58
Что-то я ничего не нонял...
Заходите в схему проекта (файл xml, где сохраняется схема DataSource), жмете правой кнопкой мыши "Add"->"Query"(или "DataAdapter"), пишите в тексте запроса

Код

select *
from Addresses
where code=@param


указуете, откуда берется этот @param (привязка к полю или оставите на потом). А потом цепляете его как источник данных для... (в Report Viewer прошло. Думаю, что в CR пройдёт). Это самый путевый вариант.
Можно и с помощью DataReader закидать данные в типизированный DataSet и тр и пр и др. Это тоже не проблема.
Проблема в том, как я понял, что при формировании отчета, когда вы готовите первую страницу, вам уже тогда должно быть известно количество тех же самых страниц отчета, сколько их в нем будет. Скорее всего, здесь ограничение логики приложения. Иными словами, на лету при обработке n-ной страницы отчета вам могут и не дать подтасовать значение какого-то поля или добавить строку. До начала отработки отчета,- пожалуйста!

Надеюсь, что в тему написал хоть что-то из этого.

Автор: archengel 18.4.2008, 14:55
Кароче я делаю вот так:
1. В дизайнере CR DataBase Expert->CreateNewConnetion->OLEDB->MyDataBase->Add Command
2. В окно засовываю тело хранимой процедуры с уже подставленным параметром, ну скажем:
Код

SELECT f_name,s_name,l_name 
FROM Names
WHERE id_name=1

//Имеется ввиду что такая таблица с таими полями существует, иначе он выдаст ошибку
3.В дизайнере раскидываю поля нужным мне образом, с группировками и т.д.
4.Могу просматривать результаты отчета при разработке (принимая условие выборки из базы id_name=1)
5.Когда уже код исполняется:
Код

//Путь к отчету
String reportPath = System.Windows.Forms.Application.StartupPath + "\\" + "report.rpt";
//Новый объект отчета
ReportDocument rd  = new ReportDocument();
rd.Load(reportPath);
//Возвращаем DataTable значений на основе параметра
DataTable dt=LoadNames(int.Parse(textBox1.text));
//Подставляем таблицу как источник данных для отчета
rd.SetDataSource(dt);
crystalReportViewer.ReportSource = rd;
crystalReportViewer.Refresh();


Ну вот как то так smile 

Автор: thomas 18.4.2008, 15:44
Цитата(EAV @  18.4.2008,  11:33 Найти цитируемый пост)
Про runtime упоминалось в том смысле что во время выполнения программы данные для существующего отчета можно получить как угодно (причем не обязательно из той же таблицы, к который мы конектились во время создания отчета), 


EAV,  smile 


Автор: thomas 18.4.2008, 16:00
Цитата(archengel @  18.4.2008,  12:55 Найти цитируемый пост)
Ну вот как то так

попробовал, не прокатывает.
archengel,  smile  рабочий.

Добавлено через 4 минуты и 21 секунду
akizelokro, 
Цитата

Надеюсь, что в тему написал хоть что-то из этого.

Разговор идет о том, что возможно ли вывести в рапорт CR-а данные не из типизированного дата сет и не из базы данных на прямую, т.е. вывести в рапорт данные из динамически созданного дата сет. И как это делаеться? (если такое возможно)

Автор: archengel 18.4.2008, 16:45
Так а что неработает? В SetDataSource() неработает подстановка????

Автор: thomas 18.4.2008, 16:54
archengel, 
угу.
этот метод System.Collections.IEnumerable enumerable не принимает.
у меня нет датасетов вообще.
вместо них использую классы, которые помещаю в List<T>. (в принципе это заменяет таблицу в датасет)



Автор: akizelokro 21.4.2008, 09:23
Цитата

Разговор идет о том, что возможно ли вывести в рапорт CR-а данные не из типизированного дата сет и не из базы данных на прямую, т.е. вывести в рапорт данные из динамически созданного дата сет. И как это делаеться? (если такое возможно)


Иными словами, ты хочешь в обработке InitReport создать прописать ручками новый DataSet (или DataAdapter), заполнить его данными и передать его посредствои SetDataSource или создать DataReader и сделать с ним то же самое, а затем добавить в отчет полей и заполнять их (тоже ручками - кодом) данными из созданного только что тобой источника данных?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)