Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как в отчетах обойтись без copy/paste?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18326
Например хочу сделать базовый отчет "Продажи" srSalesBase
Возвращает
ShopID, GoodsID, GoodsCount, Cost, Summ и N прочих показателей.

Дальше на основе этих данных отчеты обертки, которые уже будут осуществлять группировку, прилинковывать нужные свойства и т.п.

Я хотел реализовать так:
CREATE PROC srSales1 @DateBegin datetime, @DateEnd datetime 
as

CREATE TABLE #srSalesBaseT(ShopID, GoodsID, ....)

Insert #srSalesBaseT
exec srSalesBase @DateBegin, @DateEnd 

select ShopID, sum(Summ) from #srSalesBaseT group by ShopID


Но если понадобиться добавить в srSalesBase новый показатель, то все отчеты обертки перестанут работать, так как не совпадает количество полей в Insert exec. Придется залезать в десятки отчетов оберток, что бы поправить CREATE TABLE #srSalesBaseT, хотя новые показатели там не нужны.

Как лучше организовать?
23 май 17, 11:05    [20503439]     Ответить | Цитировать Сообщить модератору
 Re: Как в отчетах обойтись без copy/paste?  [new]
londinium
Member

Откуда: Киев
Сообщений: 1170
Deff,
А Вы сделайте постоянную таблицу и заполняйте ее процедурой. А отчеты в любом случае править придется
23 май 17, 11:21    [20503499]     Ответить | Цитировать Сообщить модератору
 Re: Как в отчетах обойтись без copy/paste?  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Сделайте таблицу с постоянной структурой (ключами и заведома постоянными суммами) и дополнительные таблички ключ+значение(я). Добавлять новые таблички или править существующую, но уже не в сотне отчетов.
23 май 17, 11:42    [20503624]     Ответить | Цитировать Сообщить модератору
 Re: Как в отчетах обойтись без copy/paste?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Deff,
в теории внутри srSalesBase заполняйте широкую таблицу, на вывод отдавайте по режиму. Вариант со статической не плох, но придётся контролировать очистку/заполнение... хотя если отчёты и утром загрузили - и целый день строим, то норм
23 май 17, 11:53    [20503691]     Ответить | Цитировать Сообщить модератору
 Re: Как в отчетах обойтись без copy/paste?  [new]
uaggster
Member

Откуда:
Сообщений: 827
Deff
Например хочу сделать базовый отчет "Продажи" srSalesBase
Возвращает
ShopID, GoodsID, GoodsCount, Cost, Summ и N прочих показателей.

Дальше на основе этих данных отчеты обертки, которые уже будут осуществлять группировку, прилинковывать нужные свойства и т.п.

Я хотел реализовать так:
CREATE PROC srSales1 @DateBegin datetime, @DateEnd datetime 
as

CREATE TABLE #srSalesBaseT(ShopID, GoodsID, ....)

Insert #srSalesBaseT
exec srSalesBase @DateBegin, @DateEnd 

select ShopID, sum(Summ) from #srSalesBaseT group by ShopID


Но если понадобиться добавить в srSalesBase новый показатель, то все отчеты обертки перестанут работать, так как не совпадает количество полей в Insert exec. Придется залезать в десятки отчетов оберток, что бы поправить CREATE TABLE #srSalesBaseT, хотя новые показатели там не нужны.

Как лучше организовать?

Если сервер 2012+ и хранимые процедуры - содержат 1 возвращаемый select, то можно так:
	Declare @table nvarchar(max)
	Declare @sql nvarchar(max)
	Declare @name sysname

	Create table #t (i int);

	Select @name = Quotename(OBJECT_schema_Name(object_id(@name))) + '.' + Quotename(OBJECT_Name(object_id(@name)))

	Select @table=Stuff(
						(SELECT 
 							N'; Alter table #t add ' + N'C' + Cast(a.[column_ordinal] as nvarchar(255)) 
							+ N' ' 
							+ a.system_type_name + isNull(N' Collate ' + a.collation_name ,N'')
						 FROM sys.dm_exec_describe_first_result_set (@name, null, 0) a
						 For xml path (N''))
				, 1,2,N'')

	Exec (@table)
	
Alter table #t drop column i;


	Select @sql=N'insert into #t Exec ' + @name

	exec(@sql)


Тут, правда, чтобы совсем всё динамически сделать, нужно еще с параметрами хранимки извратиться надо.
23 май 17, 15:23    [20504631]     Ответить | Цитировать Сообщить модератору
 Re: Как в отчетах обойтись без copy/paste?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18326
Спасибо за помощь. Мне понравилась идея с версиями. В зависимости от версии возвращает разное количество полей.
CREATE PROC srSalesBase @report_version int, ....
as


.......


if @report_version = 1 begin
select f1, f2, f3 from #result
return
end

if @report_version = 2 begin
select f1, f2, f3, f4 from #result
return
end
24 май 17, 13:22    [20507690]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить