Страница 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();