SQL запросы, master-detail и большой объем данных

Обсуждение Stimulsoft Reports.NET
Ответить
ARM
Сообщения: 5
Зарегистрирован: 16 апр 2008, 08:09
Откуда: somewhere on the earth

SQL запросы, master-detail и большой объем данных

Сообщение ARM »

Добрый день.

Есть задача построить master-detail отчет. Добавлены конекшн и два датасорса.
Мастер-датасорс: select * from Customers
Дитэйл-датасорс: select * from Orders
Добавлен релэйшн. Все ОК.
НО, проблема в том, что Заказы (Ордерс) имеет порядка 3000000 записей.
Соотв., т.к. запрос для Заказов перед рендером отчета выбирает ВСЕ заказы (см. запрос), привью отчета валится с ошибкой о нехватке памяти.

Вопросы:
1) как можно оптимизировать выборку данных, чтобы генерился запрос на получение ТОЛЬКО тех Заказов,
которые связаны с выводимыми в отчет Покупателями ?
Опережая ваш ответ, скажу, что единственным приемлимым вариантом вижу указание критерия отбора (в запросе) для мастер-датасорса:
'select * from customers where FirstName = 'John'', затем указание для дитейл-датасорса такого же условия:
'select * from orders o
inner join customers c on c.customerId = o.customerId
where c.FirstName = 'John''
НО при этом я ухожу от универсальности.

2) как можно обойти проблему нехватки памяти (при этом виртуальная память скорее всего не используется, т.к., визуально из ТаскМэнэджера, когда заканчивается место в ОЗУ, валится это исключение) ? Кеширование страниц на диск включено, НО, я так понимаю, до рендера страниц дело еще не дошло!

3) где можно скачать внятную документацию с описанием ПОЛЕЙ/ПРОПЕРТЕЙ классов, а не серию "How to ... ?" ? Т.к. для 99% пропертей нет хмл-описания :( (v.2007.2, сейчас обновляемся на 2008.2)

Спасибо.
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

SQL запросы, master-detail и большой объем данных

Сообщение Edward »

ARM писал(а):Добрый день.

Есть задача построить master-detail отчет. Добавлены конекшн и два датасорса.
Мастер-датасорс: select * from Customers
Дитэйл-датасорс: select * from Orders
Добавлен релэйшн. Все ОК.
НО, проблема в том, что Заказы (Ордерс) имеет порядка 3000000 записей.
Соотв., т.к. запрос для Заказов перед рендером отчета выбирает ВСЕ заказы (см. запрос), привью отчета валится с ошибкой о нехватке памяти.

Вопросы:
1) как можно оптимизировать выборку данных, чтобы генерился запрос на получение ТОЛЬКО тех Заказов,
которые связаны с выводимыми в отчет Покупателями ?
Опережая ваш ответ, скажу, что единственным приемлимым вариантом вижу указание критерия отбора (в запросе) для мастер-датасорса:
'select * from customers where FirstName = 'John'', затем указание для дитейл-датасорса такого же условия:
'select * from orders o
inner join customers c on c.customerId = o.customerId
where c.FirstName = 'John''
НО при этом я ухожу от универсальности.
Посмотрите, пожалуйста, отчет Mater-Detail with Parameters в группе SQL программы Demo. Там реализован подход к Master-Detail без использования Relation, а через параметры, как Вам и необходимо.
2) как можно обойти проблему нехватки памяти (при этом виртуальная память скорее всего не используется, т.к., визуально из ТаскМэнэджера, когда заканчивается место в ОЗУ, валится это исключение) ? Кеширование страниц на диск включено, НО, я так понимаю, до рендера страниц дело еще не дошло!
Да, верно, скорее всего так и было.
3) где можно скачать внятную документацию с описанием ПОЛЕЙ/ПРОПЕРТЕЙ классов, а не серию "How to ... ?" ? Т.к. для 99% пропертей нет хмл-описания :( (v.2007.2, сейчас обновляемся на 2008.2)
В связи с массированной переработкой движка генератора отчетов вопрос с xml документацией для предыдущих версий приостановлен. В новой версии ситуация с документированием будет улучшена.

Дайте знать, если понадобится помощь.

Спасибо.
ARM
Сообщения: 5
Зарегистрирован: 16 апр 2008, 08:09
Откуда: somewhere on the earth

SQL запросы, master-detail и большой объем данных

Сообщение ARM »

С параметрами разобрался, спасибо.
Возникла сдел. непонятная проблема: 2 датабанда, мастер-дитэйл. Дитэйл привязан к мастеру через параметр. Если дитэйл-банду указать мастер-компонент (наш мастер-банд), то отчет генерится пустой (в мастер-банде нет данных)!!!! Если отвязать, то все ок, в мастер-банде данные появляются.
Не пойму куда копать...... :hugging:
ARM
Сообщения: 5
Зарегистрирован: 16 апр 2008, 08:09
Откуда: somewhere on the earth

SQL запросы, master-detail и большой объем данных

Сообщение ARM »

ARM писал(а):С параметрами разобрался, спасибо.
Возникла сдел. непонятная проблема: 2 датабанда, мастер-дитэйл. Дитэйл привязан к мастеру через параметр. Если дитэйл-банду указать мастер-компонент (наш мастер-банд), то отчет генерится пустой (в мастер-банде нет данных)!!!! Если отвязать, то все ок, в мастер-банде данные появляются.
Не пойму куда копать...... :hugging:
Сорри, дата сорс не открывался автоматом при старте рендеринга.

ЗЫ: Обновился 2007.2 => 2008.1. Визуально, открытие/закрытие дизайнера стало в 2 раза медленее!
ARM
Сообщения: 5
Зарегистрирован: 16 апр 2008, 08:09
Откуда: somewhere on the earth

SQL запросы, master-detail и большой объем данных

Сообщение ARM »

Во-первых, баг-репорты:
1) есть источник данных, дата-банд, привязанный к этому источнику. Все ок, репорт в дизайнере генерится. Теперь переименовываем источник и ссылки на поля этого источника в текстовых объектах на дата-банде. Репорт генерится без ошибок, но выводится пустым! Дважды кликаем на дата-банде (видим, что он привязан к переименованному источнику) и ничего не делая жмем ОК. Генерим ответ (все еще в дизайнере). Теперь отчет показывается.
Еще такой момент: это происходит в мастер-дитэйл отчете. Я переименовывал дитэйл-источник!
2) редактируем запрос источника данных в дизайнере (там где список полей). Жмем кнопку View query, в открывшемся окне жмем Edit Query (иконка - SQL) и получаем:
System.NullReferenceException: Object reference not set to an instance of an object.
at Stimulsoft.Report.Design.Editors.StiTextEditorForm..ctor(StiReport report, String text, StiCodeEditorMode editorMode)
at Stimulsoft.Report.Design.Editors.StiTextEditor.EditText(StiReport report, String& text, StiCodeEditorMode mode)
at Stimulsoft.Report.Design.Dictionary.StiViewDataForm.tbEditSql_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at Stimulsoft.Controls.StiToolButton.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at Stimulsoft.Controls.StiToolButton.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

---------------------------------------
Во-вторых, все-таки я не совсем пойму логику работы мастер-дитэйл отчетов...... :(
Посмотрел ваш пример из группы SQL в демо проекте, все работает. Создаю такой же простейший мастер-дитэйл со связью на основе параметра в дитэйл-источнике данных и получаю неверный результат.
Подробнее:
1) коннекшн к 2005-му Экспресс сиквелу. Две таблицы DimCustomer - мастер, FactInternetSales - связанный. Связь по CustomerKey.
2) запрос мастер-источника: select top 3 * from dimcustomer.
3) запрос дитэйл-источника: select * from factinternetsales where customerkey = @par1 and orderquantity is not null. Параметр: @par1 = DimCustomer.CustomerKey, тип - Вариант (менял на Int, не помогло).
4) на репорте два дата-банда: для мастера (поля: DimCustomer.CustomerKey (по кот. вяжемся) и т.д) и для дитэйла (поля: FactInternetSales.CustomerKey (по кот. вяжемся, только из FactInternetSales!) и т.д.)

При генерации отчета получаю:
Мастер данные: 11000 (DimCustomer.CustomerKey) ..... другие поля
Дитэйл данные: 11000 (FactInternetSales.CustomerKey) ...... другие поля

Мастер данные: 11001 (DimCustomer.CustomerKey) ..... другие поля
Дитэйл данные: 11000 (FactInternetSales.CustomerKey) ...... другие поля <------ НЕВЕРНЫЙ CustomerKey!

Вопрос: почему для второй порции данных DimCustomer.CustomerKey не изменился для дитэйл таблицы ??? Перепробовал уже все, результат - 0! У вас в демо работает, у меня (с другим коннекшином) нет... :angry:

Вот сгенеренные запросы и behind-кода репорта:
public void GetDimCustomer_SqlCommand(object sender, System.EventArgs e)
{
this.DimCustomer.SqlCommand = "select top 3 * from dimcustomer";
}

public void GetSales_SqlCommand(object sender, System.EventArgs e)
{
this.Sales.SqlCommand = "select * from factinternetsales \r\nwhere customerkey = @par1\r\n and orderquant" + "ity is not null";
this.Sales.Parameters["@par1"].ParameterValue = DimCustomer.CustomerKey;
}

ЗЫ: версия 2008.1

Решить проблему нужно срочно....
Спасибо.
ARM
Сообщения: 5
Зарегистрирован: 16 апр 2008, 08:09
Откуда: somewhere on the earth

SQL запросы, master-detail и большой объем данных

Сообщение ARM »

Когда можно ожидать ответа ???
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

SQL запросы, master-detail и большой объем данных

Сообщение Edward »

ARM писал(а):1) есть источник данных, дата-банд, привязанный к этому источнику. Все ок, репорт в дизайнере генерится. Теперь переименовываем источник и ссылки на поля этого источника в текстовых объектах на дата-банде. Репорт генерится без ошибок, но выводится пустым! Дважды кликаем на дата-банде (видим, что он привязан к переименованному источнику) и ничего не делая жмем ОК. Генерим ответ (все еще в дизайнере). Теперь отчет показывается.
Еще такой момент: это происходит в мастер-дитэйл отчете. Я переименовывал дитэйл-источник!
К сожалению это ограничение дизайнера в текущей версии.
2) редактируем запрос источника данных в дизайнере (там где список полей). Жмем кнопку View query, в открывшемся окне жмем Edit Query (иконка - SQL) и получаем:
System.NullReferenceException: Object reference not set to an instance of an object.
at Stimulsoft.Report.Design.Editors.StiTextEditorForm..ctor(StiReport report, String text, StiCodeEditorMode editorMode)
at Stimulsoft.Report.Design.Editors.StiTextEditor.EditText(StiReport report, String& text, StiCodeEditorMode mode)
at Stimulsoft.Report.Design.Dictionary.StiViewDataForm.tbEditSql_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at Stimulsoft.Controls.StiToolButton.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at Stimulsoft.Controls.StiToolButton.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

---------------------------------------
Проверьте, пожалуйста, билд от 23 апреля.
Во-вторых, все-таки я не совсем пойму логику работы мастер-дитэйл отчетов...... :(
Посмотрел ваш пример из группы SQL в демо проекте, все работает. Создаю такой же простейший мастер-дитэйл со связью на основе параметра в дитэйл-источнике данных и получаю неверный результат.
Подробнее:
1) коннекшн к 2005-му Экспресс сиквелу. Две таблицы DimCustomer - мастер, FactInternetSales - связанный. Связь по CustomerKey.
2) запрос мастер-источника: select top 3 * from dimcustomer.
3) запрос дитэйл-источника: select * from factinternetsales where customerkey = @par1 and orderquantity is not null. Параметр: @par1 = DimCustomer.CustomerKey, тип - Вариант (менял на Int, не помогло).
4) на репорте два дата-банда: для мастера (поля: DimCustomer.CustomerKey (по кот. вяжемся) и т.д) и для дитэйла (поля: FactInternetSales.CustomerKey (по кот. вяжемся, только из FactInternetSales!) и т.д.)

При генерации отчета получаю:
Мастер данные: 11000 (DimCustomer.CustomerKey) ..... другие поля
Дитэйл данные: 11000 (FactInternetSales.CustomerKey) ...... другие поля

Мастер данные: 11001 (DimCustomer.CustomerKey) ..... другие поля
Дитэйл данные: 11000 (FactInternetSales.CustomerKey) ...... другие поля <------ НЕВЕРНЫЙ CustomerKey!

Вопрос: почему для второй порции данных DimCustomer.CustomerKey не изменился для дитэйл таблицы ??? Перепробовал уже все, результат - 0! У вас в демо работает, у меня (с другим коннекшином) нет... :angry:

Вот сгенеренные запросы и behind-кода репорта:
public void GetDimCustomer_SqlCommand(object sender, System.EventArgs e)
{
this.DimCustomer.SqlCommand = "select top 3 * from dimcustomer";
}

public void GetSales_SqlCommand(object sender, System.EventArgs e)
{
this.Sales.SqlCommand = "select * from factinternetsales \r\nwhere customerkey = @par1\r\n and orderquant" + "ity is not null";
this.Sales.Parameters["@par1"].ParameterValue = DimCustomer.CustomerKey;
}

ЗЫ: версия 2008.1

Решить проблему нужно срочно....
Спасибо.
Нужно указать еще и ReсonnectOnEachRow=true для Detail источника данных. Также Relation указывать у SQL мастер-деталь отчета не нужно.

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