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

Формирование словаря. RegData

Добавлено: 05 авг 2009, 06:28
Сергей
Доброго времени суток.

Есть следующая проблема.

Словарь представляет собой дерево баз, как в Sql Server Management Studio.
"Базы" (Sql соединения) формируются при помощи StiReport.RegData(string, SqlConnection).
Затем на каждую таблицу создается StiSqlSource и добавляется в StiReport.Dictionary.DataSources:

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

                    StiSqlSource sss = new StiSqlSource(key, dt.TableName, dt.TableName, string.Format("SELECT * FROM [{0}]", dt.TableName));
                    _report.Dictionary.DataSources.Add(sss);
                    sss.SynchronizeColumns();
(здесь key совпадает со значением первого параметра RegData)

Отчет формируется на этом словаре и сохраняется. Затем при открытии отчета (StiReport.LoadPackedReportFromString) заново вызывается StiReport.RegData(string, SqlConnection) для каждого соединения.

Появилась необходимость в возможности переименования "баз". Вроде бы, ничего сложного: есть метод RegData с третим параметром alias. Отоображать только алиасы тоже можно. Оказалось, если вызывать RegData с алиасом, отличающимся от того, что был до этого в отчете (но с тем же именем!), то в словаре будут отображаться и "база" со старым именем, и "база" с новым. При этом отчет формируется правильно.
Попробовал изменить атрибут NameInSource для всех измененных элементов в StiReport.DataSources - в словаре стало отображаться _как надо_, но вот отчет теперь не формируется.

Либо где-то ошибка в Sti, либо я в корне неверно понимаю формирование словаря.

Есть подозрение, что ошибка все-таки в методе StiDictionaryControl.BuildData(StiDictionary), так как там в качестве ключа хэш-таблицы используется алиас.

Спасибо.

Формирование словаря. RegData

Добавлено: 07 авг 2009, 06:01
Jan
Здравствуйте,
Появилась необходимость в возможности переименования "баз". Вроде бы, ничего сложного: есть метод RegData с третим параметром alias. Отоображать только алиасы тоже можно. Оказалось, если вызывать RegData с алиасом, отличающимся от того, что был до этого в отчете (но с тем же именем!), то в словаре будут отображаться и "база" со старым именем, и "база" с новым. При этом отчет формируется правильно.
Все верно. В данном случае метод RegData работает как метод Add в коллекции. При этом базы данных в отчете не компилируются в объекты отчета и то, что имя дублируется не приводит к ошибке компиляции. Просто берется первая база с указанным именем.
Попробовал изменить атрибут NameInSource для всех измененных элементов в StiReport.DataSources - в словаре стало отображаться _как надо_, но вот отчет теперь не формируется.
Что именно не работает?
Либо где-то ошибка в Sti, либо я в корне неверно понимаю формирование словаря.

Есть подозрение, что ошибка все-таки в методе StiDictionaryControl.BuildData(StiDictionary), так как там в качестве ключа хэш-таблицы используется алиас.
Не совсем понятно в чем проблема - в отображении словаря или в построении отчета?

Спасибо.



Формирование словаря. RegData

Добавлено: 07 авг 2009, 11:06
Сергей
Здравствуйте.
Jan писал(а):
Попробовал изменить атрибут NameInSource для всех измененных элементов в StiReport.DataSources - в словаре стало отображаться _как надо_, но вот отчет теперь не формируется.
Что именно не работает?
Либо где-то ошибка в Sti, либо я в корне неверно понимаю формирование словаря.
Есть подозрение, что ошибка все-таки в методе StiDictionaryControl.BuildData(StiDictionary), так как там в качестве ключа хэш-таблицы используется алиас.
Не совсем понятно в чем проблема - в отображении словаря или в построении отчета?
Если не заменять NameInSource, то некорректно отображается словарь: вместо переименования "баз" происходит добавление новых с именем NameInSource.
Если заменить NameInSource на значение - алиас (используемый в RegData для SqlConnection), то словарь отображается верно, а отчет перестает формироваться. По поводу, что именно не работает - отчет просто не выдает данных, никаких ошибок.


Формирование словаря. RegData

Добавлено: 07 авг 2009, 11:10
Сергей
Jan писал(а):
Появилась необходимость в возможности переименования "баз". Вроде бы, ничего сложного: есть метод RegData с третим параметром alias. Отоображать только алиасы тоже можно. Оказалось, если вызывать RegData с алиасом, отличающимся от того, что был до этого в отчете (но с тем же именем!), то в словаре будут отображаться и "база" со старым именем, и "база" с новым. При этом отчет формируется правильно.
Все верно. В данном случае метод RegData работает как метод Add в коллекции. При этом базы данных в отчете не компилируются в объекты отчета и то, что имя дублируется не приводит к ошибке компиляции. Просто берется первая база с указанным именем.
То есть, нужно просто не использовать RegData, а заменять уже существующую строку соединения и алиас? Как это должно выглядеть в коде?

Спасибо!

Формирование словаря. RegData

Добавлено: 10 авг 2009, 04:39
Jan
Здравствуйте,

К примеру так:

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

report.DataStore["Name"] = myData;
Спасибо.

Формирование словаря. RegData

Добавлено: 12 авг 2009, 07:00
Сергей
Здравствуйте.

Пример..
Есть объект StiReport, в DataStore 1 элемент:
_report.DataStore[0]
{МониторингСК(Мониторинг спецк)}
Alias: "мск alias"
Data: {System.Data.SqlClient.SqlConnection}
IsReportData: false
Name: "мск name"
ViewData: {System.Data.SqlClient.SqlConnection}
Далее выполняется код:

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

                    StiSqlSource sss = new StiSqlSource("мск name", "таблица1", "таблица1","SELECT * FROM [таблица1]");
                    _report.Dictionary.DataSources.Add(sss);
                    sss.SynchronizeColumns();
В результате в словаре появляется доп. источник "мск name" (это в дизайнере! в DataStore изменений нет), а хотелось бы видеть эту таблицу в старом "мск alias".

Как это сделать?

Если создавать StiSqlSource с NameInSource = алиасу, то доп. источник "мск name" не создастя и "таблица1" появится там, где надо. Но полей в ней не будет, так как, видимо, соединением воспользоваться этот StiSqlSource не может (NameInSource не соответствует имени).

То есть, на что еще раз обращаю внимание: дерево источников в дизайнере формируется, исходя из NameInSource = Alias, а фактически источник (соединение) сопоставляется, исходя из NameInSource = Name.

Спасибо.

Формирование словаря. RegData

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

Попробуйте вот такой код:

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

StiSqlSource sss = new StiSqlSource("мск name", "таблица1", "таблица1","SELECT * FROM [таблица1]");
_report.Dictionary.DataSources["MyName"] = sss;
sss.SynchronizeColumns();
Где MyName это имя (Name поле) источника данных. Поиск идет по Name полям. Регистр не учитывается.

Спасибо.

Формирование словаря. RegData

Добавлено: 14 авг 2009, 05:38
Сергей
Здравствуйте.

Результат

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

StiSqlSource sss = new StiSqlSource("мск name", "таблица1", "таблица1","SELECT * FROM [таблица1]");
_report.Dictionary.DataSources["мск name"] = sss;
sss.SynchronizeColumns();
аналогичен

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

StiSqlSource sss = new StiSqlSource("мск name", "таблица1", "таблица1","SELECT * FROM [таблица1]");
_report.Dictionary.DataSources.Add(sss);
sss.SynchronizeColumns();
(_report.Dictionary.DataSources.Count перед выполнением равно 0, поэтому, похоже, вызывается тот же самый Add).

И все-таки?

Спасибо.

Формирование словаря. RegData

Добавлено: 14 авг 2009, 05:44
Сергей
Может все-таки дело в:
unic писал(а):Есть подозрение, что ошибка все-таки в методе StiDictionaryControl.BuildData(StiDictionary), так как там в качестве ключа хэш-таблицы используется алиас.
?

Формирование словаря. RegData

Добавлено: 14 авг 2009, 06:01
Сергей
Для облегчения взаимопонимания отправил пример на суппорт [#EJC-461665].
доб.: странно, но Ticket ID система не узнала, присвоила новый [#EKB-502706].