| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Заполнение Crystal Report с помощью цикла |
| Автор: Fomaa 15.4.2008, 14:56 |
| Как в Crystal Report можно заносить данные из цикла? Или как можно заносить данные из НЕТИПИЗИРОВАННОГО DataSet? |
| Автор: thomas 16.4.2008, 12:00 | ||||
| Fomaa, Приветствую.
Crystal Report позволяеть создавать "отчёты" на основании данных либо из типизированного датасет, либо из базы данных напрямую. С динамическими обьектами Crystal Report, к сожалению, работать не умеет. Он должен знать таблицы и поля в них еще в design mode. Плюс можно использовать view в БД как источник данных. Во view ты можешь выбрать данные из нескольких таблиц БД, а так же включить вычисляемые поля. В ДС только таблицы которые там созданы и заполнены. Добавлено через 58 секунд А что ты подразумеваешь под этим?
|
| Автор: 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), главное чтобы название полей совпадало!. Точнее поправлюсь, дизайнер использует прямой коннект к базе, а во время исполнения программе легко подменяется источник с прямого на свой конкретный, полученный в принципе любым путём |
| Автор: jonie 17.4.2008, 22:56 |
| дополню что Хранимки использовать можно, в качестве источника. стоит заметить, что зачастую встроенные вычисления в CR работают быстрее, нежели вычисления на сервере БД. |
| Автор: thomas 18.4.2008, 12:13 | ||||
archengel, EAV, Приветствую. Что-то я вас не пойму CR может брать данные из типизированного дата сет (т.е. из памяти) или из базы данных(т.е. с жесткого диска). При этом весь дизайн отчёта формируеться в design mode, а не в runtime. Покажите мне, неразумному, как вы "скармливаете" CR-у в design mode данные из нетипизированного дата сет, создаваемого и заполняемого данными программно в runtime. Как вы обьясняете CR-у при его создании откуда он должен брать данные? Потому как к базе данных вы не обращаетесь (соединение не устанавливаете), а типизированного дата сет в проекте на наблюдаеться. Дата сет создаеться и заполняеться данными в runtime. Вот скриншот из моего проекта для Crystal Report. Откуда он может взять данные для создания рапорта в design mode . ![]() зеленым подчеркнуто созданное соединение с базой данных на MS SQL server. красной тонкой линией подчеркнута возможность создать команду на выборку данных из БД. Но тут происходит обращение именно к БД с которой уже есть соединение. Но вместо этого удобнее пользоваться командами уже созданными в БД, т.е. view или хранимыми процедурами. Их использовать можно. синим подчеркнуты .NET Objects - это список форм в проекте, там никаких данных нет. жирная красная линия подчеркивает отсутствие типизированного дата сет в проекте. черным зачеркнуты строки не относящиеся к данному проекту. |
| Автор: vretsky 18.4.2008, 12:13 |
| извините господа! сам столкнулся с похожей задачей, из описания архангела ниче не понял. как и где динамически указать источник данных? где в дизайнере выбрать комманд? Добавлено через 9 минут и 44 секунды вернее где создать команду в дизайнере я нашел, а как ее менять динамически? |
| Автор: thomas 18.4.2008, 12:27 | ||||
| vretsky, приветствую.
вот тут товарисч написал то, что я сказал выше
А его понятие "всё что угодно" включает в себя все тот же запрос к базе данных, с которой уже есть соединение. Т.е. другими словами данные для 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"), пишите в тексте запроса
указуете, откуда берется этот @param (привязка к полю или оставите на потом). А потом цепляете его как источник данных для... (в Report Viewer прошло. Думаю, что в CR пройдёт). Это самый путевый вариант. Можно и с помощью DataReader закидать данные в типизированный DataSet и тр и пр и др. Это тоже не проблема. Проблема в том, как я понял, что при формировании отчета, когда вы готовите первую страницу, вам уже тогда должно быть известно количество тех же самых страниц отчета, сколько их в нем будет. Скорее всего, здесь ограничение логики приложения. Иными словами, на лету при обработке n-ной страницы отчета вам могут и не дать подтасовать значение какого-то поля или добавить строку. До начала отработки отчета,- пожалуйста! Надеюсь, что в тему написал хоть что-то из этого. |
| Автор: archengel 18.4.2008, 14:55 | ||||
| Кароче я делаю вот так: 1. В дизайнере CR DataBase Expert->CreateNewConnetion->OLEDB->MyDataBase->Add Command 2. В окно засовываю тело хранимой процедуры с уже подставленным параметром, ну скажем:
//Имеется ввиду что такая таблица с таими полями существует, иначе он выдаст ошибку 3.В дизайнере раскидываю поля нужным мне образом, с группировками и т.д. 4.Могу просматривать результаты отчета при разработке (принимая условие выборки из базы id_name=1) 5.Когда уже код исполняется:
Ну вот как то так |
| Автор: thomas 18.4.2008, 15:44 | ||
EAV, |
| Автор: thomas 18.4.2008, 16:00 | ||
попробовал, не прокатывает. archengel, Добавлено через 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 | ||
Иными словами, ты хочешь в обработке InitReport создать прописать ручками новый DataSet (или DataAdapter), заполнить его данными и передать его посредствои SetDataSource или создать DataReader и сделать с ним то же самое, а затем добавить в отчет полей и заполнять их (тоже ручками - кодом) данными из созданного только что тобой источника данных? |