Вопрос по генерации отчетов с большим объемом данных.

Обсуждение Stimulsoft Reports.NET
Guest777
Сообщения: 7
Зарегистрирован: 09 мар 2011, 16:27

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Guest777 »

Добрый день!

Серьезно присматриваемся к вашему продукту,
все нравится, но есть несколько беспокоящих вопросов:

Преамбула: мне нужно ограничить пользователя с выбором таблиц и колонок(из соображений секьюрити) - это я сделал
следующим образом:

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

StiWebDesignerOptions.ModifyDictionary = False
StiWebDesignerOptions.ModifyDataSources = False
StiWebDesignerOptions.ModifyConnections = False
StiWebDesignerOptions.ModifyVariables = False
StiWebDesignerOptions.ModifyTemplate = False
при создании отчета начитываю только "разрешенные" данные:

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

Dim report As New StiReport()
report.Dictionary.Databases.Add(New StiSqlDatabase("Database001", ConnectionString))
Dim stiSqlSource As New StiSqlSource("Database001", "Database", "Database001", "SELECT * FROM Table", True)
stiSqlSource.Columns.Add("Column1", GetType(Integer))
stiSqlSource.Columns.Add("Column2", GetType(String))
report.DataSources.Add(stiSqlSource)
WebDesigner1.Design(report)
1я проблема:
При просмотре отчета, на SQL сторону отсылается запрос указанный в при ините датасоурса - "SELECT * FROM Table", а ПОТОМ
к результату применяется фильтр, если я его задал. Если таблица будет действительно большой, то это может привести
к проблемам.

1й вопрос - как мне изменить код, что бы на SQL сторону отсылался готовый SQL запрос, с фильтрами(через WHERE)

2я проблема:
Если я разрешаю редактировать дикшенари или датасоурс, то при редактировании, на поиске колонок(например) видимо для уточнения данных,
опять же посылаеться SQL запрос из датасоурса - для нас это неприемлемо.

2й вопрос - как этого избежать?

3й вопрос связан с попытками решить первые два:
Я вижу что при создании датасоурса, я могу не указывать SQL запрос, в таком случае я могу дизайнерить отчет, доп. запрос не посылаеться.
Соответственно нужно перехватить GetPreviewDataSet(к примеру), и начитать e.PreviewDataSet с нужными мне данными в кастомном DataSet,
но как мне узнать какой запрос сдизайнерил пользователь? Метод получает два параметра и в StiWebDesigner.StiPreviewDataSetEventArgs я не нешал ничего похожего.

Пож. если у вас есть советы по решению проблемы, отличные от хода моих мыслей - дайте знать.
Так же очень важно знать ответы на впоросы 1 - 2.
Спасибо!
Vasiliy Goncharenko
Сообщения: 53
Зарегистрирован: 11 июн 2010, 11:14

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Vasiliy Goncharenko »

Добавлю: несмотря что мы присматриваемся, Guest777 использует покупную версию Stimulsoft с поддержкой до 30.08.2011.
Как вариант может кто-нибудь посоветует консультанта к которому можно обратиться по телефону, и прояснить наши вопросы за отдельные деньги?
Спасибо.
Andrew
Сообщения: 586
Зарегистрирован: 09 июн 2006, 12:22

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Andrew »

Здравствуйте.
Добавлю: несмотря что мы присматриваемся, Guest777 использует покупную версию Stimulsoft с поддержкой до 30.08.2011.
Как вариант может кто-нибудь посоветует консультанта к которому можно обратиться по телефону, и прояснить наши вопросы за отдельные деньги?
Спасибо.
Позвоните нам. Компания Стимулсофт +375292125706. Проконсультируем бесплатно :biggrin:

Спасибо.
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Aleksey »

Guest777 писал(а):1я проблема:
При просмотре отчета, на SQL сторону отсылается запрос указанный в при ините датасоурса - "SELECT * FROM Table", а ПОТОМ
к результату применяется фильтр, если я его задал. Если таблица будет действительно большой, то это может привести
к проблемам.
1й вопрос - как мне изменить код, что бы на SQL сторону отсылался готовый SQL запрос, с фильтрами(через WHERE)
Как вариант, в датасоурсе использовать следующего вида запрос "SELECT * FROM Table {FilterVariable}", где в переменной хранить условие фильтрации (Where). Если переменная не будет задана, то будет возвращаться весь набор данных.
Guest777 писал(а):2я проблема:
Если я разрешаю редактировать дикшенари или датасоурс, то при редактировании, на поиске колонок(например) видимо для уточнения данных,
опять же посылаеться SQL запрос из датасоурса - для нас это неприемлемо.
2й вопрос - как этого избежать?
Не смогли воспроизвести проблему. Не могли бы вы объяснить Вашу проблему более подробно?
Guest777 писал(а):3й вопрос связан с попытками решить первые два:
Я вижу что при создании датасоурса, я могу не указывать SQL запрос, в таком случае я могу дизайнерить отчет, доп. запрос не посылаеться.
Соответственно нужно перехватить GetPreviewDataSet(к примеру), и начитать e.PreviewDataSet с нужными мне данными в кастомном DataSet,
но как мне узнать какой запрос сдизайнерил пользователь? Метод получает два параметра и в StiWebDesigner.StiPreviewDataSetEventArgs я не нешал ничего похожего.
В методе GetPreviewDataSet вы можете использовать следующий код, чтобы получить введенный пользователем запрос:

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

void StiWebDesigner1_GetPreviewDataSet(object sender, StiWebDesigner.StiPreviewDataSetEventArgs e)
{
    StiReport rep = ((StiWebDesigner)sender).Report;
    string userQuery = ((StiSqlSource)rep.Dictionary.DataSources["DataSourceName"]).SqlCommand;
}
Спасибо.
Guest777
Сообщения: 7
Зарегистрирован: 09 мар 2011, 16:27

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Guest777 »

Алексей,
Не смогли воспроизвести проблему. Не могли бы вы объяснить Вашу проблему более подробно?
по поводу 2й проблемы:

Я имею ввиду ситуацию, когда пользователь в дизайнере, выбирает в закладке Dictionary в правой части экрана,
"Edit Data Source", в попапе жмет кнопку "Retrieve Columns".
В этом случае для того что бы вы могли получить список имен всех колонок - вы шлете весь запрос на получение ДАННЫХ,
т.е. в нашем случае это "SELECT * FROM Table". И по моему еще в паре мест при редактировании дизайна, вы делаете то же.
Мой вопрос состоял в том, как избежать посылки запроса на получение данных ДО того как они действительно потребуються для
рендеринга самого отчета. Из соображений перфоманса.
В методе GetPreviewDataSet вы можете использовать следующий код, чтобы получить введенный пользователем запрос:
Да, таким образом я получу SQL запрос, но это будет мой запрос, тот что я указывал при создании датасоурса т.е.

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

Dim stiSqlSource As New StiSqlSource("Database001", "Database", "Database001", "SELECT * FROM Table", True)
а мне нужен конечный SQL запрос, на основании которого будет рендериться отчет, т.е. тот запрос,
который учитывает пользовательские фильтры, и колонки которые пользователь добавил в отчет, т.е. вместо
"SELECT * FROM Table" я хочу получить "SELECT ID, Name FROM Table WHERE ID > 10 AND Name = 'test'".
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Aleksey »

Здравствуйте,
Guest777 писал(а):Я имею ввиду ситуацию, когда пользователь в дизайнере, выбирает в закладке Dictionary в правой части экрана,
"Edit Data Source", в попапе жмет кнопку "Retrieve Columns".
В этом случае для того что бы вы могли получить список имен всех колонок - вы шлете весь запрос на получение ДАННЫХ,
т.е. в нашем случае это "SELECT * FROM Table". И по моему еще в паре мест при редактировании дизайна, вы делаете то же.
Мой вопрос состоял в том, как избежать посылки запроса на получение данных ДО того как они действительно потребуються для
рендеринга самого отчета. Из соображений перфоманса.
Сделали некоторые улучшения в данном направлении. Проверьте следующий предрелизный билд, когда он будет доступен.
Да, таким образом я получу SQL запрос, но это будет мой запрос, тот что я указывал при создании датасоурса т.е.
а мне нужен конечный SQL запрос, на основании которого будет рендериться отчет, т.е. тот запрос,
который учитывает пользовательские фильтры, и колонки которые пользователь добавил в отчет, т.е. вместо
"SELECT * FROM Table" я хочу получить "SELECT ID, Name FROM Table WHERE ID > 10 AND Name = 'test'".
В данном случае, если пользователь устанавливает фильтры для датабэнда, условия и т.д., то есть не в словаре данных, то запрос не изменяется, и данные с сервера получаются все, а затем уже, при отображении, они фильтруются. При корректировке запроса в источнике данных в условии WHERE, будут получаться только отфильтрованные данные.

Сообщите, если понадобится дополнительная помощь.
Спасибо.
Guest777
Сообщения: 7
Зарегистрирован: 09 мар 2011, 16:27

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Guest777 »

Спасибо Алексей,
попробуем.

Есть еще такой вопрос. Получаю ошибку CS0102 при попытке preview отчета.
Flash alert выглядит так:

Line Column|Error Number|Error Text
3229.32 | CS0102 |The type
3759.32 | CS0102 |The type
4554.32 | CS0102 |The type
...
и т.д.

В дикшенари гружу втруткуру базы данных, т.е. датасоурс это таблица, внтури ее поля.
При генерации отчета выводит такую вот ошибку.

Причем если я загружаю только одну таблицу - отчет отрабатывает. Если несколько то получаю ошибку.
В чем может быть проблема?
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Aleksey »

Здравствуйте,

Пожалуйста, покажите ваш код либо пришлите тестовый проект, который воспроизводит проблему.

Спасибо.
Guest777
Сообщения: 7
Зарегистрирован: 09 мар 2011, 16:27

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Guest777 »

У вас есть скайп?
Я бы мог прислать проект, но к нему прилагаеться большая база данных, прислать которую будет
проблематично. По скайпу я мог бы расшарить скрин и показать то что есть.
Обещаю потом отписаться на форуме о причинах ошибки.
Guest777
Сообщения: 7
Зарегистрирован: 09 мар 2011, 16:27

Вопрос по генерации отчетов с большим объемом данных.

Сообщение Guest777 »

Вопрос снимается.

Ошибка была в том, что алгоритм ошибочно добавлял кое где в дикшенари одинаковые поля.
stiSqlSource.Columns.Add(...)

Спасибо!!
Ответить