Прямой эфир


0
Доброго времени,

хочу сделать динамически создаваемый отчет без XML,
1)сейчас остановился на том что в этой строке выдает ошибку:
myReport.SetDataSource(GetAllTypeStreet());

GetAllTypeStreet() — возвращает DataTable

если у кого есть готовый пример, вышлите на hvvmail@mail.ru
спасибо
avatar

HVV83

  • 2 июля 2011, 18:57
0
Легко. Просто прежде чем копировать файл получить содержимое нужного каталога с ftp функцией GetDirectoryList проверить есть ли в содержимом то что нам надо, и только если есть копировать.
Например так:
foreach (FtpItem item in client.GetDirectoryList(MainParams.FtpTimeout * 1000))
{
   if (item.Name=="нужный.файл")
   {
      client.GetFile(MainParams.FtpTimeout * 1000, MainParams.Path + MainParams.GetFile, MainParams.GetFile);
   }
}
avatar

Roman

  • 26 июня 2011, 20:41
+2
Хочу сделать прогу которая периодически проверяет наличие файла на ФТП сервере и его скачивает. Использую
client.GetFile(MainParams.FtpTimeout * 1000, MainParams.Path + MainParams.GetFile, MainParams.GetFile);

Файл скачивается. проблем нет. Проблема в том что если запустить эту часть кода когда файл отсутствует на ФТП. В локальной папке на компе просто появляется файл. Пустое файл. Как обойти не знаю.
avatar

xazrad

  • 26 июня 2011, 20:03
+1
Спасибо.

можно также задавать шаблон столбца (а не отдельных ячеек), например:
DataGridViewTextBoxColumn col1 = new DataGridViewTextBoxColumn();
avatar

djnik

  • 18 июня 2011, 14:43
0
Теперь уже не выяснить почему тот пример у мена работал, но сейчас в 2008 попробовал то-же самое действительно ошибка.

Чтобы правильно работало надо задавать шаблон ячейки у столбца вот так:
DataGridViewCell cell = new DataGridViewTextBoxCell();
DataGridViewCell cell1 = new DataGridViewTextBoxCell();

DataGridViewColumn col = new DataGridViewColumn();
col.HeaderText = "Параметр";
col.ReadOnly = true;
col.CellTemplate = cell;
DataGridViewColumn col1 = new DataGridViewColumn();
col1.HeaderText = "Значение";
col1.ReadOnly = false;
col1.CellTemplate = cell1;

dataGridView1.Columns.Add(col);
dataGridView1.Columns.Add(col1);

Вот так у меня всё заработало.
avatar

Roman

  • 18 июня 2011, 12:43
+1
при добавлении столбца в dataGridView выпадает следующая ошибка:
Column cannot be added because its CellType property is null.

Код:
DataGridViewColumn col1 = new DataGridViewColumn();
col1.HeaderText = «Наименование»;
col1.Width = 300;

dataGridView1.Columns.Add(col1);
avatar

djnik

  • 18 июня 2011, 04:50
0
Оппа! И опять по поиску я сюда попал. Спасибо за статью!
avatar

Madster

  • 17 июня 2011, 14:41
0
Спасибо, Роман, большое! Если бы не этот блог, так и остался бы CR тёмным лесом.
Компоненты среды выполнения Crystal Reports
avatar

Madster

  • 16 июня 2011, 19:13
+1
Отчёту передаётся источник данных MyDS — данные в нём уже есть из базы. А по структуре он идентичен xml — файлу, мы ведь xml — файл из него делали (делали только для того чтобы форму отчёта сделать в которой структура данных будет совпадать).

На клиенте нужны:
.NET — Не ниже той под которую писали.
И библиотеки Crystal Report-а — CRRedist2008_x86.msi или CRRedist2008_x64.msi в зависимости от разрядности платформы.

Библиотеки поиском можно найти в каталоге с VisualStudio.
avatar

Roman

  • 16 июня 2011, 19:00
0
Т.е. каждый раз при запуске создании отчёта не нужно это:
myDS.WriteXml("otchet1.xml", XmlWriteMode.WriteSchema);
//Указываем источнику данных вновь сформированный XML файл.
myDS.ReadXml(@".\otchet1.xml");
А как тогда происходит привязка к базе, если в отчёте мы указываем в качестве источника XML, а потом его не используем?
И второй вопрос: на машинах, где нет студии программа не запускается. Какие компоненты должны быть обязательно установлены помимо .NET Framework 2.0?
avatar

Madster

  • 16 июня 2011, 18:27
0
Вот это вот непонятно зачем вообще делается:
myDS.WriteXml("otchet1.xml", XmlWriteMode.WriteSchema);
//Указываем источнику данных вновь сформированный XML файл.
myDS.ReadXml(@".\otchet1.xml");


А если уж без этого никак, то перед загрузкой данных из XML, неплохо бы датасет вычистить:
myDS.Clear();
avatar

Roman

  • 16 июня 2011, 17:28
0
Спасибо. Заработало. Но появилась новая беда. Данные удваиваются. Например, если строк в XML две (а именно столько и должно получится), то в отчёт попадает ровно в два раза больше, т.е. четыре. При проверке количества строк выдаётся верное количество. Код такой:
MessageBox.Show(myDS.Tables[0].Rows.Count.ToString());
            //Создаём отчёт 
            ReportDocument myReport = new ReportDocument();
            //Задаём форму
            myReport.Load(@".\CrystalReport1.rpt");

            myDS.WriteXml("otchet1.xml", XmlWriteMode.WriteSchema);
            //Указываем источнику данных вновь сформированный XML файл.
            myDS.ReadXml(@".\otchet1.xml");
            //Указываем отчёту откуда брать данные.
            myReport.SetDataSource(myDS);

            //myReport.SetParameterValue("param1", "Go Go Go!");
            string str = cmbZay.Text;//textBox1.Text;
            myReport.SetParameterValue("param1", str);

            //Создаём форму.
            FormRW frm = new FormRW();
            //Указываем отчёт для CrystalReportViewer
            frm.crystalReportViewer1.ReportSource = myReport;
            //Открываем форму.
            frm.Show();
avatar

Madster

  • 16 июня 2011, 16:25
0
Вставлял до привязки к отчёту. Поэтому и не работало… (
avatar

Madster

  • 16 июня 2011, 16:05
0
Объясню как я эти отчётики делаю.
1. Создаю из основного проекта XML-ку с набором данных, для отчёта (чтобы было с чем экспериментировать.
2. Создаю совершенно новый проект в студии CrystalReport — не имеющий ничего общего с основным.
3. Добавляю в него в качестве данных XML-ку и использую поля для размещения на форме отчёта.
4. Сохраняю.
5. Забираю из этого проекта rpt — файл и использую его в основном проекте, обычно они у меня в отдельной папочке c отчётиками все лежат, подключая к нему напрямую источник данных — и всё работает.
avatar

Roman

  • 16 июня 2011, 13:20
+1
Проверил у себя, работает.

Создаём переменную в отчёте, вот так:
Создание параметра в CrystalReport

Затем, задаём параметр в коде:
myReport.SetParameterValue("param1", "Go Go Go!");

Я это сделал в самом конце, уже после того как источник данных подключил к отчёту.

И вот, что получилось:
Создание параметра в CrystalReport
avatar

Roman

  • 16 июня 2011, 13:04
0
Возможно переменная не передаётся по той же причине, по которой без XML не обойтись…
avatar

Madster

  • 16 июня 2011, 12:41
0
Теперь возник вопрос по передаче переменных, например в заголовок отчёта (всё равно куда)
Попробовал сделать как описано в посте:
«Сделал так:
string str = "my parameter text";
myReport.SetParameterValue("prm", str);

В шаблоне отчета необходимо создать параметр «prm».»

Добавил строки так:
string str = "150";//textBox1.Text;
myReport.SetParameterValue("prm", str);
SqlConnection connRC = new SqlConnection(CS);

Создал новый параметр в отчёте. И теперь при его запуске появляется запрос на ввод этого параметра. А нужно, чтобы он подцеплял string str = «150». Что не верно?
avatar

Madster

  • 16 июня 2011, 12:08
0
Спасибо! С предварительным созданием xml, выборка стала попадать в отчёт. Как то он криво создаётся в VS 2008.
avatar

Madster

  • 16 июня 2011, 12:03
0
Вообще похоже что проблема в rpt — файле, выглядит так. Как будто для тестирования отчёт подключался к таблице со всей выборкой, и теперь просто лезет туда, в ту самую выборку упорно при вызове.

На 6 и 7 — ом версии CrystalReport, (это не применимо к Visual Studio) из проектов на Delphi когда запускал, помню как раз схожая проблема была с обновлением, там надо было специально запускать обновление данных, иначе отчёт вроде как запоминал последний результат выборки. (точно не помню, может параметр там какой-то в отчёте ставился чтобы этот эффект не проявлялся, давно было).
Всё что я описал перед этим должно сработать, пробуйте делать отчёт с использованием xml-ки.
avatar

Roman

  • 15 июня 2011, 23:39
+1
Я бы для начала проверил сколько там в datasete в выборке, действительно ли 1 запись:
myDS.Tables[0].Rows.Count

Если всё ОК, то копать в сторону отчёта. При создании RPT файла, он же чем-то заполняется, так вот то чем он заполняется по структуре должно быть таким же как то что передаём в момент выполнения.

Самый лучший способ правильно сделать RPT — файл это подключить к нему xml — файл источника данных, а сам xml — файл из источника данных получить очень просто:
myDS.WriteXml("ваш_файл.xml", XmlWriteMode.WriteSchema);
avatar

Roman

  • 15 июня 2011, 23:33