Добрый день.
Есть задача построить 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)
Спасибо.
SQL запросы, master-detail и большой объем данных
SQL запросы, master-detail и большой объем данных
Посмотрите, пожалуйста, отчет Mater-Detail with Parameters в группе SQL программы Demo. Там реализован подход к Master-Detail без использования Relation, а через параметры, как Вам и необходимо.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) как можно обойти проблему нехватки памяти (при этом виртуальная память скорее всего не используется, т.к., визуально из ТаскМэнэджера, когда заканчивается место в ОЗУ, валится это исключение) ? Кеширование страниц на диск включено, НО, я так понимаю, до рендера страниц дело еще не дошло!
В связи с массированной переработкой движка генератора отчетов вопрос с xml документацией для предыдущих версий приостановлен. В новой версии ситуация с документированием будет улучшена.3) где можно скачать внятную документацию с описанием ПОЛЕЙ/ПРОПЕРТЕЙ классов, а не серию "How to ... ?" ? Т.к. для 99% пропертей нет хмл-описания (v.2007.2, сейчас обновляемся на 2008.2)
Дайте знать, если понадобится помощь.
Спасибо.
SQL запросы, master-detail и большой объем данных
С параметрами разобрался, спасибо.
Возникла сдел. непонятная проблема: 2 датабанда, мастер-дитэйл. Дитэйл привязан к мастеру через параметр. Если дитэйл-банду указать мастер-компонент (наш мастер-банд), то отчет генерится пустой (в мастер-банде нет данных)!!!! Если отвязать, то все ок, в мастер-банде данные появляются.
Не пойму куда копать......
Возникла сдел. непонятная проблема: 2 датабанда, мастер-дитэйл. Дитэйл привязан к мастеру через параметр. Если дитэйл-банду указать мастер-компонент (наш мастер-банд), то отчет генерится пустой (в мастер-банде нет данных)!!!! Если отвязать, то все ок, в мастер-банде данные появляются.
Не пойму куда копать......
SQL запросы, master-detail и большой объем данных
Сорри, дата сорс не открывался автоматом при старте рендеринга.ARM писал(а):С параметрами разобрался, спасибо.
Возникла сдел. непонятная проблема: 2 датабанда, мастер-дитэйл. Дитэйл привязан к мастеру через параметр. Если дитэйл-банду указать мастер-компонент (наш мастер-банд), то отчет генерится пустой (в мастер-банде нет данных)!!!! Если отвязать, то все ок, в мастер-банде данные появляются.
Не пойму куда копать......
ЗЫ: Обновился 2007.2 => 2008.1. Визуально, открытие/закрытие дизайнера стало в 2 раза медленее!
SQL запросы, master-detail и большой объем данных
Во-первых, баг-репорты:
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! У вас в демо работает, у меня (с другим коннекшином) нет...
Вот сгенеренные запросы и 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
Решить проблему нужно срочно....
Спасибо.
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! У вас в демо работает, у меня (с другим коннекшином) нет...
Вот сгенеренные запросы и 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
Решить проблему нужно срочно....
Спасибо.
SQL запросы, master-detail и большой объем данных
Когда можно ожидать ответа ???
SQL запросы, master-detail и большой объем данных
К сожалению это ограничение дизайнера в текущей версии.ARM писал(а):1) есть источник данных, дата-банд, привязанный к этому источнику. Все ок, репорт в дизайнере генерится. Теперь переименовываем источник и ссылки на поля этого источника в текстовых объектах на дата-банде. Репорт генерится без ошибок, но выводится пустым! Дважды кликаем на дата-банде (видим, что он привязан к переименованному источнику) и ничего не делая жмем ОК. Генерим ответ (все еще в дизайнере). Теперь отчет показывается.
Еще такой момент: это происходит в мастер-дитэйл отчете. Я переименовывал дитэйл-источник!
Проверьте, пожалуйста, билд от 23 апреля.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)
---------------------------------------
Нужно указать еще и ReсonnectOnEachRow=true для Detail источника данных. Также Relation указывать у SQL мастер-деталь отчета не нужно.Во-вторых, все-таки я не совсем пойму логику работы мастер-дитэйл отчетов......
Посмотрел ваш пример из группы 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! У вас в демо работает, у меня (с другим коннекшином) нет...
Вот сгенеренные запросы и 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
Решить проблему нужно срочно....
Спасибо.
Спасибо.