Страница 1 из 1
Хранимая процедура. Несколько таблиц в выводе
Добавлено: 26 июн 2014, 09:00
Алексей
Добрый день!
У меня есть хранимая процедура, которая имеет порядка десяти таблиц на выходе
Дизайнер отчетов "видит" только первый результат.
Можно ли вообще при источнике данных: хранимая процедура получить несколько таблиц?
И соотв., как?
С Уважением,
Алексей.
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 26 июн 2014, 11:46
HighAley
Здравствуйте.
К сожалению, из хранимой процедуры можно получить только одну таблицу.
Вам необходимо для каждой таблицы создать свою процедуру.
Спасибо.
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 26 июн 2014, 13:42
Алексей
У меня хранимая процедура обрабатывает некоторое кол-во информации и формирует соответствующий вывод (в виде нескольких таблиц).
Как можно тогда все эти таблицы получить? может есть какой-то обходной вариант?
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 27 июн 2014, 11:54
Леонид
Добрый день!
Добавлю свои 50 центов к дискуссии.
Любая хранимая процедура (ХП) возвращает строго определённый набор полей, а не список таблиц.
Поэтому, есть несколько вариантов: 1) вы можете сделать несколько ХП - возвращающих соответствующие данный каждой из таблиц, что является наиболее простым и правильным путём;
2) моветон, но иногда необходимый - использовать в ХМ конструкциию union, что-то вроде этого:
в самом теле ХП пишете
Код: Выделить всё
select id,
name,
price,
employee_id as null,
employee_name as null,
employee_birthdate as null
from goods
order by id
union
select employee_id,
employee_name,
employee_birthdate
from employees
order by employee_id
Соответственно, в отчётной системе (или непосредственно в программе на C#) просто пишете:
Код: Выделить всё
select id, name, price, employee_id, employee_name, employee_birthdate
from custom_stored_procedure
Тем не менее, предпочтительнее первый вариант и использованием нескольких DataTable (BussinessOject и пр.).
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 27 июн 2014, 14:54
Алексей
Добрый!
1. "Любая хранимая процедура", если строго подходить к терминологии, в SqlPipe может отправить несколько результатов, в каждом - свой набор полей;
в моем случае это единственный разумный способ, т.к. разделение на несколько хранимок, выводящих по одному результату - приведет к многократному (в конкретном случае - не менее 5) запуску одного и того же алгоритма, что не есть хорошо, особенно на нагруженных системах;
2. UNION на разнотипные таблицы.... слов нет
пока думаю сделать через временную таблицу, но этот вариант мне категорически не нравится.
В связи с этим вопрос:
Порядок запроса из источников данных при генерации фиксированный или он может меняться?
Стоит ли считать, что сначала делается запрос по самому первому (верхнему) источнику, затем к следующему (как видно в дизайнере) и только таким образом и такой порядок не будет изменен в будущих версиях StimulReports?
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 27 июн 2014, 17:03
HighAley
Здравствуйте.
Запросы производятся в том порядке, в котором источники данных отображаются в словаре.
Сообщите, если возникнут какие-либо трудности с этим.
Спасибо.
Re: Хранимая процедура. Несколько таблиц в выводе
Добавлено: 01 июл 2014, 17:02
Леонид
Добрый день!
1. "Любая хранимая процедура", если строго подходить к терминологии...
Знаю, согласен, для простоты так написал.
2. UNION на разнотипные таблицы.... слов нет
На однотипные, вы же сами написали. Возможно, неудачный пример с названиями. P.S. Теорию БД знаю отлично, если что...
Смотрите, в вашем случае решение только одно остаётся - из кода C#, т.е., если ваш провайдер, например OracleDataAdapter или SqlDataAdapter возвращает все 10 результатов, то вы можете "запихнуть" их в DataSet (да, все 10 DataTable), или каждый набор в свой List<YourDataClass> или ObservableCollection<YourDataClass>, и т.д., ну вы поняли), а потом просто вызывать отчёт из кода.
Код: Выделить всё
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
class ContactInfo
{
// *** your code goes here
}
List<Person> personList = List<Person>();
List<ContactInfo> contactsInfo = List<ContactInfo>();
// *** и т.д., все 10 наборов
stiReport1.Load("report.mrt");
stiReport1.RegBusinessObject("personList", personList); // *** вместо этого можно DataSet с 10-тью DataTable зарегистрировать
stiReport1.RegBusinessObject("contactsInfo ", contactsInfo);
stiReport1.Show();