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

Откуда:
Сообщений: 65
Добрый день,
Никак не могу разобраться с проблемой репликации слиянием в SQL 2008
Ситуация следующая имеем 2 базы с настроенной репликацией слиянием. В список статей входят все объекты БД. На издателе установлен признак реплицировать изменения схемы БД, если выполнить команду ALTER для нескольких процедур все проходит нормально изменения при синхронизации передаются, но если кол-во изменений превысит 10 (точно не могу сказать какое число), то синхронизация в мониторе репликации показывает полный бред с одной стороны он пишет, что синхронизация запущена с другой стороны позволяет запустить повторно и ничего не делает.
Профайлер говорит, что запрашивается информация об изменениях в публикации и тишина. Никаких ошибок нет.

Версия MSSQL
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) Jun 17 2011 00:54:03 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
10 июл 12, 10:01    [12842754]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 888
ошибок где нет? в мониторе репликации состояние агентов какое и ошибок у них нет?
10 июл 12, 10:41    [12843043]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
В мониторе репликации отображается, что процесс синхронизации запущен, при этом синхронизацию можно запустить повторно.
10 июл 12, 10:43    [12843060]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
Похоже что проблема не в кол-ве скриптов а в одном единственном скрипте который изменяет процедуру. Сейчас еще раз проверю эту версию.
10 июл 12, 10:48    [12843103]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
Да версия подтвердилась. синхронизация ломается из-за скприта и как понять что в нем не так?
10 июл 12, 10:57    [12843174]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
В логе можно увидеть текст

2012-07-10 07:03:26.102 OLE DB Подписчик 'SQL2008': set nocount on declare @dbname sysname select @dbname = db_name() declare @collation nvarchar(255) select @collation = convert(nvarchar(255), databasepropertyex(@dbname, N'COLLATION')) select collationproperty(@collation, N'CODEPAGE') as 'CodePage', collationproperty(@collation, N'LCID') as 'LCID', collationproperty(@collation, N'COMPARISONSTYLE') as 'ComparisonStyle',cast(case when convert (int,databasepropertyex (@dbname,'comparisonstyle')) & 0x1 = 0x1 then 0 else 1 end as bit) as DB_CaseSensitive,cast(case when convert (int,serverproperty ('comparisonstyle')) & 0x1 = 0x1 then 0 else 1 end as bit) as Server_CaseSensitive set nocount off
2012-07-10 07:03:26.117 Percent Complete: 0
2012-07-10 07:03:26.117 OLE DB Подписчик 'SQL2008': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
2012-07-10 07:03:26.180 Соединение с Подписчик "SQL2008"
2012-07-10 07:03:26.180 OLE DB Распространитель 'SQL2008': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
2012-07-10 07:03:26.180 OLE DB Подписчик 'SQL2008': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
2012-07-10 07:03:26.180 Percent Complete: 0
2012-07-10 07:03:26.195 Получение сведений о публикации
2012-07-10 07:03:26.195 OLE DB Распространитель 'SQL2008': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
2012-07-10 07:03:26.195 Percent Complete: 0
2012-07-10 07:03:26.195 Получение сведений о подписках.
2012-07-10 07:03:26.211 OLE DB Распространитель 'SQL2008': {call sys.sp_MSadd_merge_history90 (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}
10 июл 12, 11:05    [12843226]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
andreykond,

Включите подробное журналирование у мерж-агента.
10 июл 12, 11:09    [12843263]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
invm
andreykond,

Включите подробное журналирование у мерж-агента.

Это -OutputVerboseLevel 1?
10 июл 12, 11:17    [12843329]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
-OutputVerboseLevel 2
10 июл 12, 11:23    [12843391]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
invm
-OutputVerboseLevel 2

Такой и поставил результат показывал выше
10 июл 12, 11:25    [12843416]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
Текст процедуры

+
ALTER PROCEDURE [dbo].[kvit_multy]
	@date_beg datetime,
	@num int,
	@paket bit=1,
	@calcSaldo bit=0
AS


if object_id('tempdb..#tmp_ab') is not null drop table #tmp_ab
if object_id('tempdb..#tmp_schet') is not null drop table #tmp_schet
if object_id('tempdb..#tmp_mop_rasxod') is not null drop table #tmp_mop_rasxod
if object_id('tempdb..#tmp_rec_schet') is not null drop table #tmp_rec_schet
if object_id('tempdb..#tmp_recalc') is not null drop table #tmp_recalc
if object_id('tempdb..#tmp_ss') is not null drop table #tmp_ss
if object_id('tempdb..#tmp_calc') is not null drop table #tmp_calc
if object_id('tempdb..#tmp_calc_values') is not null drop table #tmp_calc_values
if object_id('tempdb..#tmp_opl') is not null drop table #tmp_opl
if object_id('tempdb..#tmp_rnd') is not null drop table #tmp_rnd
if object_id('tempdb..#tmp_multy_rnd') is not null drop table #tmp_multy_rnd
if object_id('tempdb..#tmp_last_rnd') is not null drop table #tmp_last_rnd
if object_id('tempdb..#tmp_last1_rnd') is not null drop table #tmp_last1_rnd

declare @yy int, @mm smallint, @_date_beg datetime, @_date_end datetime
  
delete from #multy_ab_info
delete from #multy_calc_info
delete from #multy_all_info
delete from #multy_lgota_info

select	@yy=year(@date_beg), @mm=month(@date_beg), 
	@_date_beg=@date_beg, @_date_end=dateadd(mm,1,@date_beg)

declare @mens_on bit
select @mens_on=mens_on from __system_params
--select mens_on from __system_params

select	ab.*
		,sns.nschet
		,date_men=cast(null as datetime)
		,kart_adr=ak.adr
into #tmp_ab
from	_abonent ab with(nolock) 
		inner join __system_nls_spisok sns on sns.kod_=ab.nls_id and kod_>-1
		inner join _ab_kart ak on sns.kod_=ak.nls_id and ak.date_end is null
where sns.num_=@num and ab.type_abonent_id in (1,20,21)

select distinct kart_adr=ak.adr
into #tmp_kart
from	#tmp_ab ab
		inner join _ab_kart ak on ab.nls_id=ak.nls_id and ak.date_end is null
where ab.nls_id>0

--select * from #tmp_kart

create table #tmp_schet(nls_id int, kart_adr int, service_id int, principal_id int, 
						nschet int, schet_adr int, adr_ int, parent_adr int,
						mopD float, mopN float, mopP float, mop_zones0 smallint, mop_zones10 smallint,
						mopD0_parent float, mopN0_parent float, mopP0_parent float,
						mopD10_parent float, mopN10_parent float, mopP10_parent float,
						rasxodD float, rasxodP float, rasxodN float,
						rperiod_beg datetime, rperiod_beg_storno datetime, 
						storno bit, date_beg datetime, date_end datetime,
						forRecalc bit, summa_lgot money, summa_nach money, simple_schet bit)

 insert into #tmp_schet(nls_id, kart_adr, service_id, principal_id, nschet, schet_adr, adr_, parent_adr, mopD, mopN, mopP, 
						summa_lgot, summa_nach, mop_zones0, rperiod_beg, rperiod_beg_storno, storno, date_beg, date_end, 
						forRecalc, simple_schet, rasxodD, rasxodP, rasxodN)
   select absc.nls_id
		 ,absc.kart_adr
         ,absc.service_id
         ,absc.principal_id
         ,absc.nschet
         ,absc.adr
         ,absc.adr
		 ,absc.parent_adr
		 ,null
		 ,null
		 ,null
		 ,absc.summa_lgot
		 ,absc.summa
		 ,0
		 ,rperiod_beg
		 ,rperiod_beg_storno
		 ,storno
		 ,absc.date_beg
		 ,absc.date_end
		 ,0
		 ,ts.simple_schet
		 ,case when absc.rasxod=0 then 0 else show_end-show_beg end
		 ,case when absc.rasxod=0 then 0 else showP_end-showP_beg end
		 ,case when absc.rasxod=0 then 0 else showN_end-showN_beg end
   from _ab_schet absc with(nolock) 
        inner join __system_nls_spisok sns on sns.kod_=absc.nls_id
        inner join #tmp_ab ab on ab.nls_id=absc.nls_id
        inner join __type_schet ts on ts.type_schet=absc.type_schet
		inner join #tmp_kart ak on ak.kart_adr=absc.kart_adr
   where sns.num_=@num and (isnull(group_type_id,0)=0 or (isnull(group_type_id,0)=1 and @calcSaldo=1))
         and (absc.rperiod_beg=@date_beg or absc.rperiod_beg_storno=@date_beg)
		 and (absc.rperiod_beg<>isnull(absc.rperiod_beg_storno,absc.rperiod_beg+1))
--select * from #tmp_schet

select absd.* 
into #tmp_schet_detail
from	_ab_schet_detail absd
		inner join #tmp_schet absc on absd.schet_adr=absc.schet_adr

create table #tmp_mop_rasxod(
		schet_adr int, 
		mopD0 float, mopP0 float, mopN0 float,
		mopD0_parent float, mopP0_parent float, mopN0_parent float,
		mop0_zones int,
		mopD10 float, mopP10 float, mopN10 float,
		mopD10_parent float, mopP10_parent float, mopN10_parent float,
		mop10_zones int)

insert into #tmp_mop_rasxod
select	absc.schet_adr,
		sum(case	when ab.type_abonent_id=0 or ab.nls_id is null then isnull(absm.rasxod,isnull(absd.rasxod_mop10,0)+isnull(absd.rasxod_mop0,0)) else 0 end),
		sum(case	when ab.type_abonent_id=0 or ab.nls_id is null then isnull(absm.rasxodP,isnull(absd.rasxodP_mop10,0)+isnull(absd.rasxodP_mop0,0)) else 0 end),
		sum(case	when ab.type_abonent_id=0 or ab.nls_id is null then isnull(absm.rasxodN,isnull(absd.rasxodN_mop10,0)+isnull(absd.rasxodN_mop0,0)) else 0 end),
		0,
		0,
		0,
		max(case	when ab.type_abonent_id=0 or ab.nls_id is null then
							(case	when isnull(absm.rasxodP,0)<>0 or absd.rasxodP_mop0<>0 or absd.rasxodP_mop10<>0 then 3
									when isnull(absm.rasxodN,0)<>0 or absd.rasxodN_mop0<>0 or absd.rasxodN_mop10<>0 then 2
									when isnull(absm.rasxod,0)<>0 or absd.rasxod_mop0<>0 or absd.rasxod_mop10<>0 then 1
									else 0 end) 
				else 0 end),
		sum(case	when ab.type_abonent_id=10 then isnull(absm.rasxod,isnull(absd.rasxod_mop10,0)+isnull(absd.rasxod_mop0,0)) else 0 end),
		sum(case	when ab.type_abonent_id=10 then isnull(absm.rasxodP,isnull(absd.rasxodP_mop10,0)+isnull(absd.rasxodP_mop0,0)) else 0 end),
		sum(case	when ab.type_abonent_id=10 then isnull(absm.rasxodN,isnull(absd.rasxodN_mop10,0)+isnull(absd.rasxodN_mop0,0)) else 0 end),
		0,
		0,
		0,
		max(case	when ab.type_abonent_id=10 then
							(case	when isnull(absm.rasxodP,0)<>0 or absd.rasxodP_mop0<>0 or absd.rasxodP_mop10<>0 then 3
									when isnull(absm.rasxodN,0)<>0 or absd.rasxodN_mop0<>0 or absd.rasxodN_mop10<>0 then 2
									when isnull(absm.rasxod,0)<>0 or absd.rasxod_mop0<>0 or absd.rasxod_mop10<>0 then 1
									else 0 end) 
					else 0 end)
--into #tmp_mop_rasxod
from	#tmp_schet absc
		left outer join _ab_schet_mop_raspred absm on absm.schet_adr=absc.schet_adr
		left outer join #tmp_schet_detail absd on absd.schet_adr=absc.schet_adr
		left outer join _ab_schet_mop_raschet m on (m.schet_adr=absc.parent_adr and absc.parent_adr is not null)
		left outer join _abonent ab on (ab.nls_id=m.nls_id0 and m.nls_id0 is not null)or(ab.nls_id=m.nls_id and m.nls_id0 is null)
group by absc.schet_adr
--select sum(mopD10_parent) from #tmp_mop_rasxod
--select * from #tmp_mop_rasxod
--select * from #tmp_schet

update #tmp_mop_rasxod	set	mopD0_parent = case when ab.type_abonent_id is null then m1.rasxod_period else m.rasxod_period end,
							mopP0_parent = case when ab.type_abonent_id is null then m1.rasxodP_period else m.rasxodP_period end,
							mopN0_parent = case when ab.type_abonent_id is null then m1.rasxodN_period else m.rasxodN_period end
						from	_ab_schet_mop_raschet m
								inner join #tmp_schet absc on absc.parent_adr=m.schet_adr
								left outer join _abonent ab on ab.nls_id=m.nls_id and ab.type_abonent_id=0
								left outer join _ab_schet aaa on aaa.adr=absc.parent_adr and aaa.adr<>aaa.parent_adr and ab.type_abonent_id is null
								left outer join _ab_schet_mop_raschet m1 on m1.schet_adr=aaa.parent_adr
						where absc.schet_adr=#tmp_mop_rasxod.schet_adr

update #tmp_mop_rasxod	set	mopD10_parent = m.rasxod_period,
							mopP10_parent = m.rasxodP_period,
							mopN10_parent = m.rasxodN_period
						from	_ab_schet_mop_raschet m
								inner join #tmp_schet absc on absc.parent_adr=m.schet_adr
								inner join _abonent ab on ab.nls_id=m.nls_id and ab.type_abonent_id=10
						where absc.schet_adr=#tmp_mop_rasxod.schet_adr
--select * from #tmp_mop_rasxod

update #tmp_schet	set	mopD=mop.mopD0+mop.mopD10,
						mopP=mop.mopP0+mop.mopP10,
						mopN=mop.mopN0+mop.mopN10,
						mopD0_parent=mop.mopD0_parent,
						mopP0_parent=mop.mopP0_parent,
						mopN0_parent=mop.mopN0_parent,
						mop_zones0=mop.mop0_zones,
						mopD10_parent=mop.mopD10_parent,
						mopP10_parent=mop.mopP10_parent,
						mopN10_parent=mop.mopN10_parent,
						mop_zones10=mop.mop10_zones
					from #tmp_mop_rasxod mop
					where mop.schet_adr=adr_
--select * from #tmp_schet where service_id=7

select	distinct
		nls_id,
		kart_adr,
		service_id,
		principal_id,
		nullable=case when storno<>1 and date_beg>=@date_beg and date_end<=dateadd(mm,1,@date_beg) then 0
                      else 1
                 end 
into #tmp_ss
from #tmp_schet

	union all

select	distinct
		s.nls_id,
		s.kart_adr,
		s.service_id,
		s.principal_id,
		nullable=2
from	_saldo s
		inner join #tmp_kart ak on ak.kart_adr=s.kart_adr
where rperiod_beg=dateadd(mm,-1,@date_beg) and nls_id in (select nls_id from #tmp_ab)	
--where rperiod_beg='20101101' and nls_id in (select nls_id from #tmp_ab)	

	union all 

select	distinct
		absr.nls_id,
		ab.kart_adr,
		absr.service_id,
		absr.principal_id,
		nullable=3
from _ab_service absr
		inner join #tmp_ab ab on ab.nls_id=absr.nls_id
where	dbo.DateAcrossOk(@_date_beg, @_date_end, absr.date_beg, absr.date_end)=1
		and principal_id is not null

update #tmp_schet set	forRecalc=1,
						summa_lgot=case when storno=1 and rperiod_beg_storno=@date_beg then -summa_lgot
										else summa_lgot end,
						summa_nach=case when storno=1 and rperiod_beg_storno=@date_beg then -summa_nach
										else summa_nach end
where	(storno=1 and rperiod_beg_storno=@date_beg)
		or date_beg<@date_beg or date_beg>=dateadd(mm,1,@date_beg)

update #tmp_ab set date_men=(select isnull(max(date_end),dateadd(mm,1,@date_beg)) from #tmp_schet sc where sc.forRecalc=0 and sc.nls_id=nls_id)

delete from #tmp_ss 
where nullable=3 and (	select count(*) 
						from #tmp_ss ss with (nolock) 
						where	ss.nls_id= #tmp_ss.nls_id 
								and ss.principal_id=#tmp_ss.principal_id 
								and ss.service_id=#tmp_ss.service_id )>1

delete from #tmp_ss 
where nullable=2 and (	select distinct count(*) 
						from #tmp_ss ss with (nolock) 
						where	ss.nls_id= #tmp_ss.nls_id 
								and ss.principal_id=#tmp_ss.principal_id 
								and ss.service_id=#tmp_ss.service_id )>1

delete from #tmp_ss 
where nullable=1 and (	select count(*) 
						from #tmp_ss ss with (nolock) 
						where	ss.nls_id= #tmp_ss.nls_id 
								and ss.principal_id=#tmp_ss.principal_id 
								and ss.service_id=#tmp_ss.service_id )>1

--select * from #tmp_ss
--select * from #tmp_schet

select ao.*
into #tmp_opl
from _ab_oplata ao
     inner join __system_nls_spisok sns on sns.kod_=ao.nls_id
where sns.num_=@num
      and ao.nls_id=sns.kod_ and isnull(ao.storno,0)<>1 and isnull(old,0)<>1
	  and ao.oplata<>0
--select * from #tmp_opl


select ac.*
      ,calc_adr=ac.adr
      ,calc_name=rtrim(tc.name_calc)
      ,tc.service_id
	  ,koff=isnull(ap.koff,1)/abs(isnull(ap.koff,1))
      ,maxCalcValue=power(10, tc.sign)
into #tmp_calc
from _ab_calc ac with(nolock) 
     inner join typecalc tc with(nolock)  on tc.typecalc_id=ac.typecalc_id
	 inner join _ab_point ap on ap.adr=ac.ab_point_adr
where ac.nls_id in (select nls_id from #tmp_ab)
--select * from #tmp_calc


delete from #multy_rounds_info
insert into #multy_rounds_info(nls_id, calc_adr, zav_nom, round_date, showD, showP, showN, service_id, service_name, zone_count, maxCalcValue)
select	distinct
		ac.nls_id,
		ac.calc_adr,
		rtrim(ac.zav_nom),
		case	when abr.type_round not in (8,9) then abr.date_beg
				else abr.date_beg_fakt
		end,
		abr.show,
		abr.showP,
		abr.show2,
		ac.service_id,
		tc.name,
		case	when showP is not null then 3
				when show2 is not null then 2
				else 1 end,
		maxCalcValue
from	#tmp_calc ac
		inner join _ab_schet_round absr on absr.ab_calc_adr=ac.calc_adr
		inner join #tmp_schet absc on absc.schet_adr=absr.schet_adr and forRecalc=0
		inner join _ab_round  abr on 
			(abr.ab_calc_adr=ac.calc_adr) and
			(abr.date_beg>=absc.date_beg and abr.date_beg<=absc.date_end)
		inner join __type_service tc on tc.service_id=ac.service_id
	
update #multy_rounds_info set	showD_beg=(	select top 1 showD
											from #multy_rounds_info t
											where	t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select min(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showD is not null
																		)
											),
								showD_end=(	select top 1 showD
											from #multy_rounds_info t
											where	t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select max(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showD is not null
																		)
											),
								showP_beg=(	select top 1 showP
											from #multy_rounds_info t
											where t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select min(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showP is not null
																		)
											),
								showP_end=(	select top 1 showP
											from #multy_rounds_info t
											where t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select max(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showP is not null
																		)
											),
								showN_beg=(	select top 1 showN
											from #multy_rounds_info t
											where t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select min(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showN is not null
																		)
											),
								showN_end=(	select top 1 showN
											from #multy_rounds_info t
											where t.calc_adr=#multy_rounds_info.calc_adr
													and t.round_date=(	select max(round_date) 
																		from #multy_rounds_info tt
																		where tt.calc_adr=t.calc_adr
																				and showN is not null
																		)
											)

insert into #multy_ab_info(nls_id,nls,kart_adr,fio,fio_,adress,dsid,phone,last_opl_date,last_opl_summa,s_total,s_living,rooms,mens)
select ab.nls_id
      ,nls=dbo.nls(ab.nls_id)
	  ,ak.adr
      ,fio=rtrim(ak.fio)+' '+rtrim(isnull(ak.im,''))+' '+rtrim(isnull(ak.ot,''))
	  ,fio_=rtrim(ak.fio)+' '+
			LEFT(ltrim(rtrim(isnull(ak.im,''))),1)+(case when ak.im is null or ltrim(rtrim(ak.im))='' then '' else '. 'end)+
			LEFT(ltrim(rtrim(isnull(ak.ot,''))),1)+(case when ak.ot is null or ltrim(rtrim(ak.ot))='' then '' else '. 'end)
      ,adress=dbo.adress(ab.nls_id,12)
      ,ab.dsid
      ,ak.phone
      ,ao.[date]
      ,ao.oplata
      ,ab.s_total
      ,ab.s_living
	  ,ab.rooms
      ,case when mens_on=1 then (select count(*) from _ab_mens m where m.kart_adr=ak.adr and m.date_beg<=ab.date_men and isnull(m.date_end,ab.date_men+1)>ab.date_men)
            else (select men from _ab_men m where m.kart_adr=ak.adr and m.date_beg<=ab.date_men and isnull(m.date_end,ab.date_men+1)>ab.date_men)
		end
from #tmp_ab ab
	inner join _ab_kart ak with(nolock)  on ak.nls_id=ab.nls_id and ak.date_end is null
	left outer join(	   select top 1 * from _ab_oplata ao with(nolock)
                           where adr=(select top 1 adr
                                      from #tmp_opl t
                                      where t.nls_id=ao.nls_id)
                           order by adr) ao on ao.nls_id=ab.nls_id
--select * from #multy_ab_info



select abr.nls_id
      ,ac.service_id
      ,rnd_adr=max(abr.adr)
      ,calc_adr=ab_calc_adr
      ,_date=max(case when abr.type_round in (8,9) then abr.date_beg_fakt else abr.date_beg end)
      ,showD=max(show)
      ,showN=max(show2)
      ,showP=max(showP)
      ,tr.group_id
      ,last_date=cast(null as datetime)--max(abr.date_beg)
      ,pre_last_date=cast(null as datetime)
into #tmp_rnd
from _ab_round abr
     inner join __system_nls_spisok sns on sns.kod_=abr.nls_id
     inner join #tmp_calc ac on ac.adr=abr.ab_calc_adr
     inner join typecalc tc on tc.typecalc_id=ac.typecalc_id
     inner join __type_round tr on tr.type_round=abr.type_round
where (abr.date_beg<=@_date_end and abr.type_round not in(8,9)) or (abr.date_beg_fakt<=@_date_end and abr.type_round in(8,9))
group by abr.nls_id, ab_calc_adr, ac.service_id, abr.date_beg, abr.adr, tr.group_id
order by abr.nls_id, abr.date_beg desc, ac.service_id


update #tmp_rnd set last_date=(	select max(_date)
								from #tmp_rnd t with (nolock)
								where t.nls_id=#tmp_rnd.nls_id and group_id<>2 and t.calc_adr=#tmp_rnd.calc_adr)

update #tmp_rnd set pre_last_date=(	select max(_date)
									from #tmp_rnd t with (nolock)
									where t.nls_id=#tmp_rnd.nls_id and _date<last_date and group_id<>2 and t.calc_adr=#tmp_rnd.calc_adr)
--select * from #tmp_rnd

select nls_id
      ,service_id
      ,calc_adr
      ,_date=max(_date)
      ,showD=max(showD)
      ,showN=max(showN)
      ,showP=max(showP)
      --,group_id
into #tmp_last_rnd
from #tmp_rnd
where /*group_id<>2 and*/ _date=last_date
group by nls_id, service_id, calc_adr--,group_id
--select * from #tmp_last_rnd


select distinct r.nls_id
      ,r.service_id
      ,r.calc_adr
      ,_date=max(r._date)
      ,showD=max(r.showD)
      ,showN=max(r.showN)
      ,showP=max(r.showP)
      --,r.group_id
into #tmp_last1_rnd
from #tmp_rnd r
where r.group_id<>2 and _date=pre_last_date
group by r.nls_id, r.service_id, r.calc_adr--, r.group_id
--select * from #tmp_last1_rnd


select nls_id=rnd.nls_id
      ,service_id=rnd.service_id
      ,calc_adr=rnd.adr

      ,last_beg=case when l1rnd.showD is null then lrnd._date else l1rnd._date end
      ,showDL_beg=case when l1rnd.showD is null then lrnd.showD else l1rnd.showD end
      ,showNL_beg=case when l1rnd.showN is null then lrnd.showN else l1rnd.shown end
      ,showPL_beg=case when l1rnd.showP is null then lrnd.showP else l1rnd.showp end

      ,last_end=case when l1rnd.showD is null then null else lrnd._date end
      ,showDL_end=case when l1rnd.showD is null then null else lrnd.showD end
      ,showNL_end=case when l1rnd.showN is null then null else lrnd.showN end
      ,showPL_end=case when l1rnd.showP is null then null else lrnd.showP end

      ,rasch_beg=rnd1._date
      ,showDR_beg=(rnd1.showD)
      ,showNR_beg=(rnd1.showN)
      ,showPR_beg=(rnd1.showP)

      ,rasch_end=rnd2._date
      ,showDR_end=(rnd2.showD)
      ,showNR_end=(rnd2.showN)
      ,showPR_end=(rnd2.showP)

      ,rnd.maxCalcValue
into #tmp_multy_rnd
from #tmp_calc rnd
     left join #tmp_last1_rnd l1rnd on l1rnd.nls_id=rnd.nls_id and l1rnd.service_id=rnd.service_id  and l1rnd.calc_adr=rnd.calc_adr --and l1rnd.group_id<>2
     left join #tmp_last_rnd lrnd on lrnd.nls_id=rnd.nls_id and lrnd.service_id=rnd.service_id  and lrnd.calc_adr=rnd.calc_adr --and lrnd.group_id<>2
     left join #tmp_rnd rnd1 on rnd1.nls_id=rnd.nls_id and rnd1.service_id=rnd.service_id and rnd1._date=dbo.decodedate(year(@_date_beg),month(@_date_beg),01) and rnd1.calc_adr=rnd.calc_adr and rnd1.group_id=2
     left join #tmp_rnd rnd2 on rnd2.nls_id=rnd.nls_id and rnd2.service_id=rnd.service_id and rnd2._date=@_date_end and rnd2.calc_adr=rnd.calc_adr and rnd2.group_id=2
--select * from #tmp_multy_rnd


select	distinct 
		absd.nls_id
		,ab_calc_adr=isnull(absr.ab_calc_adr, ar.ab_calc_adr)
		,_date_beg=@_date_beg
		,_date_end=@_date_end
		,service_id=absc.service_id
		,zone_count=max(case when absr.two_tarif+1 is null then absd.two_tarif+1
                             else absr.two_tarif+1
                        end)
		,rasxodD=sum(case when absr.rasxod is null and absr.adr is null then absd.rasxod-isnull(absc.mopD,0)
                          else absr.rasxod
                     end)
		,rasxodP=sum(case when absr.rasxodP is null and absr.adr is null then absd.rasxodP-isnull(absc.mopP,0)
                          else absr.rasxodP
                     end)
		,rasxodN=sum(case when absr.rasxodN is null and absr.adr is null then absd.rasxodN-isnull(absc.mopN,0)
                          else absr.rasxodN
                     end)
		,showD_beg=sum(case when absr.show0 is null then absd.show0
                            else absr.show0
                       end)
        ,showP_beg=sum(case when absr.showP0 is null and isnull(absr.two_tarif,0)<>0  then absd.showP0
                            else absr.showP0
                       end)
        ,showN_beg=sum(case when absr.showN0 is null and isnull(absr.two_tarif,0)<>0 then absd.showN0
                            else absr.showN0
                       end)
        ,showD_end=sum(case when absr.show1 is null then absd.show1
                            else absr.show1
                       end)
        ,showP_end=sum(case when absr.showP1 is null and isnull(absr.two_tarif,0)<>0 then absd.showP1
                            else absr.showP1
                       end)
        ,showN_end=sum(case when absr.showN1 is null and isnull(absr.two_tarif,0)<>0 then absd.showN1
                            else absr.showN1
                       end)
into #tmp_calc_values
from #tmp_schet absc
    left outer join #tmp_schet_detail absd with(nolock)	on absd.schet_adr=absc.schet_adr
    left outer join _ab_round ar with(nolock) on ar.adr=absd.ab_round_adr
    left outer join _ab_schet_round absr with(nolock)  on absr.schet_adr=absd.schet_adr
	left outer join _ab_schet_mop_raschet absm with(nolock)	on absm.schet_adr=absd.schet_adr
where	absc.nls_id in (select nls_id from #tmp_ab)
		and absc.forRecalc=0 and absd.type_rasx<>2
group by absc.service_id, absd.nls_id, absr.ab_calc_adr, ar.ab_calc_adr
--select * from #tmp_calc_values

insert into #multy_calc_info(nls_id, kart_adr, service_id, service_name, principal_id, principal_name
							 ,zav_nom, zone_count, mop_zones0, mop_zones10
							 ,showD_beg, showD_end, showP_beg, showP_end, showN_beg, showN_end
                             ,rasxodD, rasxodP, rasxodN
							 ,rasxodD_mop0, rasxodP_mop0, rasxodN_mop0
							 ,rasxodD_mop10, rasxodP_mop10, rasxodN_mop10
							 ,date_beg, date_end, unit_type_name
                             ,last_beg, showDL_beg, showNL_beg, showPL_beg, last_end, showDL_end, showNL_end, showPL_end
                             ,rasch_beg, showDR_beg,showNR_beg, showPR_beg, rasch_end, showDR_end, showNR_end, showPR_end
							 ,calc_beg, calc_end, isNorm, maxCalcValue)
select distinct 
		ab.nls_id
	  ,sc.kart_adr
      ,absc.service_id
      ,rtrim(ts.name)
      ,absc.principal_id
      ,cast(p.par_name as varchar(50))
      ,rtrim(ac.zav_nom)
      ,case when ac.zav_nom is null then 0 else isnull(ac.two_tarif,0)+1 end
	  ,case when isnull(sc.mopP0_parent,0)<>0 then 3
			when isnull(sc.mopN0_parent,0)<>0 then 2
			when isnull(sc.mopD0_parent,0)<>0 then 1
			else 0 end
	  ,case when isnull(sc.mopP10_parent,0)<>0 then 3
			when isnull(sc.mopN10_parent,0)<>0 then 2
			when isnull(sc.mopD10_parent,0)<>0 then 1
			else 0 end
      ,rasx.showD_beg
      ,rasx.showD_end
      ,rasx.showP_beg
      ,rasx.showP_end
      ,rasx.showN_beg
      ,rasx.showN_end
      ,rasx.rasxodD*ac.koff
      ,rasx.rasxodP*ac.koff
      ,rasx.rasxodN*ac.koff
      ,(sc.mopD0_parent)
      ,(sc.mopP0_parent)
      ,(sc.mopN0_parent)
      ,(sc.mopD10_parent)
      ,(sc.mopP10_parent)
      ,(sc.mopN10_parent)
      ,_date_beg
      ,_date_end
      ,rtrim(tu.name)
      ,last_beg
      ,showDL_beg
      ,showNL_beg
      ,showPL_beg
      ,last_end
      ,showDL_end
      ,showNL_end
      ,showPL_end
      ,rasch_beg
      ,showDR_beg
      ,showNR_beg
      ,showPR_beg
      ,rasch_end
      ,showDR_end
      ,showNR_end
      ,showPR_end
      ,ac.date_beg
      ,ac.date_end
	  ,case when rasx.ab_calc_adr is null then 1 else 0 end
	  ,ac.maxCalcValue
--into #multy_calc_info
from #tmp_ab ab
     inner join #tmp_ss absc with(nolock)  on absc.nls_id=ab.nls_id --and absc.nullable=0
     inner join __type_service ts with(nolock)  on ts.service_id=absc.service_id
     left outer join partners p with(nolock)  on p.par_id=absc.principal_id
     left outer join __type_unit tu with(nolock)  on tu.unit_type_id=ts.unit_type_id
     left outer join #tmp_calc ac with(nolock)  on ac.nls_id=ab.nls_id and ac.service_id=absc.service_id
     left outer join (	select	nls_id
								,ab_calc_adr
								,_date_beg=min(_date_beg)
								,_date_end=max(_date_end)
								,service_id
								,zone_count=max(zone_count)
								,rasxodD=sum(rasxodD)
								,rasxodP=sum(rasxodP)
								,rasxodN=sum(rasxodN)
								,showD_beg=sum(showD_beg)
								,showP_beg=sum(showP_beg)
								,showN_beg=sum(showN_beg)
								,showD_end=sum(showD_end)
								,showP_end=sum(showP_end)
								,showN_end=sum(showN_end)
						from #tmp_calc_values
						group by service_id, nls_id, ab_calc_adr)
			rasx on rasx.nls_id=ab.nls_id 
						and (ac.calc_adr=rasx.ab_calc_adr or rasx.ab_calc_adr is null) 
						and rasx.service_id=absc.service_id
     left outer join #tmp_multy_rnd rnd on rnd.nls_id=absc.nls_id and (ac.calc_adr=rnd.calc_adr or rnd.calc_adr is null) and rnd.service_id=absc.service_id
	 left outer join (	select	nls_id,
								kart_adr,
								service_id, 
								principal_id, 
								forRecalc, 
								nschet=max(nschet),
								mopD=sum(mopD),
								mopP=sum(mopP),
								mopN=sum(mopN),
								mop_zones0=max(mop_zones0),
								mopD0_parent=sum(mopD0_parent),
								mopP0_parent=sum(mopP0_parent),
								mopN0_parent=sum(mopN0_parent),
								mop_zones10=max(mop_zones10),
								mopD10_parent=sum(mopD10_parent),
								mopP10_parent=sum(mopP10_parent),
								mopN10_parent=sum(mopN10_parent)
						from #tmp_schet
						where forRecalc=0
						group by nls_id, kart_adr, service_id, principal_id, forRecalc
					 ) sc on sc.nls_id=absc.nls_id and sc.service_id=absc.service_id and sc.principal_id=absc.principal_id

--select * from #tmp_ss
--select * from #tmp_multy_rnd
--select * from #tmp_schet

insert into #multy_all_info(nls_id,kart_adr,service_id,service_name,principal_id,principal_name,
							tarif_day, tarif1_day,	tarif_ppik, tarif1_ppik,	tarif_night, tarif1_night,
                            normD,normP,normN,
							summa_lgotD, summa_nachD,	summa_lgotP, summa_nachP,	summa_lgotN, summa_nachN,
							summa_absentD, summa_absentP, summa_absentN,
                            rasxodD, rasxodP, rasxodN,
							rasxodD_mop, rasxodP_mop, rasxodN_mop,
							unit_type_name,recalc,recalc_mop,
							zone,/*mop_zone,*/ dolg, avans, saldo_end, transport, nullable, isNorm, isMOP)
select ab.nls_id
	  ,isnull(absc.kart_adr, ss.kart_adr)
      ,ss.service_id
      ,rtrim(ts.name)
      ,ss.principal_id
      ,cast(p.par_name as varchar(50))
      ,max(absd.tarif )/100
      ,max(absd.tarif_up )/100
      ,max(absd.tarifP )/100
      ,max(absd.tarifP_up )/100
      ,max(absd.tarifN )/100
      ,max(absd.tarifN_up )/100
      ,max(absd.norm1_mm)
      ,max(absd.normP_mm)
      ,max(absd.norm2_mm)
      ,sum(case when absc.simple_schet=1 then absc.summa_lgot
				else isnull(absd.summa_lgot,0) end)
      ,sum(case when absc.simple_schet=1 then absc.summa_nach
				else isnull(absd.summa,0) end)
      ,sum(isnull(absd.summaP_lgot,0))
      ,sum(isnull(absd.summaP,0))
      ,sum(isnull(absd.summaN_lgot,0))
      ,sum(isnull(absd.summaN,0))
      ,sum(isnull(absa.summa,0))
      ,sum(isnull(absa.summaP,0))
      ,sum(isnull(absa.summaN,0))
      ,sum(case when absc.simple_schet=1 then absc.rasxodD
				else isnull(absd.rasxod,0)-isnull(absd.rasxod_mop10,0) end)
      ,sum(case when absc.simple_schet=1 then absc.rasxodP
				else isnull(absd.rasxodP,0)-isnull(absd.rasxodP_mop10,0) end)
      ,sum(case when absc.simple_schet=1 then absc.rasxodN 
				else isnull(absd.rasxodN,0)-isnull(absd.rasxodN_mop10,0) end)
      ,sum(isnull(absd.rasxod_mop10,0))
      ,sum(isnull(absd.rasxodP_mop10,0))
      ,sum(isnull(absd.rasxodN_mop10,0))
      ,max(rtrim(tu.name))
      ,0
	  ,0
      ,max(case when zone_count=0 and isnull(calc.rasxodD,0)=0 and isnull(absd.rasxod,0)<>0 then 1 else isnull(zone_count,1) end)      
      ,isnull(max(saldo_end),0)
      ,isnull(max(case when saldo_end<0 then saldo_end else 0 end),0)
	  ,cast(null as money)
      ,sum(isnull(tarif_comp1,0))
	  ,min(nullable)
	  ,isnull(isNorm,2)
	  ,0
from #tmp_ab ab
	 inner join #tmp_ss ss on ss.nls_id=ab.nls_id
     left join #tmp_schet absc with(nolock) on absc.nls_id=ss.nls_id and absc.service_id=ss.service_id and absc.principal_id=ss.principal_id and absc.forRecalc=0
     left join __type_service ts with(nolock) on ts.service_id=ss.service_id
     left outer join partners p with(nolock) on p.par_id=ss.principal_id
     left outer join #tmp_schet_detail absd with(nolock) on absd.schet_adr=absc.schet_adr
     left outer join (select nls_id
                                    ,rasxodD=sum(rasxodD) 
                                    ,rasxodP=sum(rasxodP)
                                    ,rasxodN=sum(rasxodN)
                                    ,unit_type_name=max(rtrim(unit_type_name))
                                    ,principal_id=principal_id
                                    ,service_id=service_id
                                    ,zone_count=max(zone_count)
									,isNorm
                      from #multy_calc_info group by nls_id, service_id, principal_id, isNorm) 		calc 
					on calc.nls_id=ab.nls_id and calc.service_id=absc.service_id
                     and calc.principal_id=absc.principal_id and ((isNorm=0 and absd.type_rasx<>2) or (isNorm=1 and absd.type_rasx=2))
	left outer join (select	nls_id
							,kart_adr
							,principal_id
							,service_id
							,saldo_beg=sum(saldo_beg)
							,saldo_end=sum(saldo_end)
					 from _saldo
					 where (saldo_beg<>0 or saldo_end<>0)
					       and rperiod_beg=dateadd(mm,-1,@date_beg)
				     group by nls_id, kart_adr, principal_id, service_id) sal
	           on sal.nls_id=ab.nls_id and sal.kart_adr=isnull(absc.kart_adr, ss.kart_adr) and sal.principal_id=ss.principal_id and sal.service_id=ss.service_id

     left outer join _ab_schet_tarif_comp stc with(nolock) on stc.schet_adr=absc.schet_adr
     left outer join _ab_schet_absent absa on absa.schet_adr=absc.schet_adr
	 left outer join __type_unit tu with(nolock)  on tu.unit_type_id=ts.unit_type_id
group by ab.nls_id, absc.kart_adr, ss.kart_adr, ss.service_id, ss.principal_id, p.par_name, ts.name, isNorm

	union all

select ab.nls_id
	  ,isnull(absc.kart_adr, ss.kart_adr)
      ,ss.service_id
      ,rtrim(ts.name)
      ,ss.principal_id
      ,cast(p.par_name as varchar(50))
      ,max(absd.tarif )/100
      ,max(absd.tarif_up )/100
      ,max(absd.tarifP )/100
      ,max(absd.tarifP_up )/100
      ,max(absd.tarifN )/100
      ,max(absd.tarifN_up )/100
      ,max(absd.norm1_mm)
      ,max(absd.normP_mm)
      ,max(absd.norm2_mm)
      ,sum(isnull(absd.rasxod_mop10,0))*max(absd.tarif_up)/100
      ,sum(isnull(absd.rasxod_mop10,0))*max(absd.tarif_up)/100
      ,sum(isnull(absd.rasxodP_mop10,0))*max(absd.tarifP_up)/100
      ,sum(isnull(absd.rasxodP_mop10,0))*max(absd.tarifP_up)/100
      ,sum(isnull(absd.rasxodN_mop10,0))*max(absd.tarifN_up)/100
      ,sum(isnull(absd.rasxodN_mop10,0))*max(absd.tarifN_up)/100
      ,0
      ,0
      ,0
      ,sum(isnull(absd.rasxod_mop10,0))
      ,sum(isnull(absd.rasxodP_mop10,0))
      ,sum(isnull(absd.rasxodN_mop10,0))
      ,0
      ,0
      ,0
      ,max(rtrim(tu.name))
      ,0
	  ,0
	  ,isnull(case	when (	select count(*) 
							from #tmp_ss s 
							where	s.nls_id=ab.nls_id and s.service_id=ss.service_id 
									and s.principal_id=ss.principal_id and nullable=0)=0 
					then(	select max(	case	when isnull(sc.mop_zones0,0)>isnull(sc.mop_zones10,0) then isnull(sc.mop_zones0,0) 
												else isnull(sc.mop_zones10,0) 
										end)
							from #tmp_schet sc 
							where	sc.nls_id=ab.nls_id 
									and sc.service_id=ss.service_id
									and sc.principal_id=ss.principal_id
						)
					else	max(case	when (isnull(absc.mop_zones0,0)>isnull(absc.mop_zones10,0)) then  isnull(absc.mop_zones0,0)
										else isnull(absc.mop_zones10,0)
								end)
					end
		,0)
      ,isnull(max(saldo_end),0)
      ,isnull(max(case when saldo_end<0 then saldo_end else 0 end),0)
	  ,cast(null as money)
      ,sum(isnull(tarif_comp1,0))
	  ,min(nullable)
	  ,0
	  ,1
from #tmp_ab ab
	 inner join #tmp_ss ss on ss.nls_id=ab.nls_id
     left join #tmp_schet absc with(nolock) on absc.nls_id=ss.nls_id and absc.service_id=ss.service_id and absc.principal_id=ss.principal_id and absc.forRecalc=0
     left join __type_service ts with(nolock) on ts.service_id=ss.service_id
     left outer join partners p with(nolock) on p.par_id=ss.principal_id
     left outer join #tmp_schet_detail absd with(nolock) on absd.schet_adr=absc.schet_adr 
     left outer join (select nls_id
                                    ,rasxodD=sum(rasxodD) 
                                    ,rasxodP=sum(rasxodP)
                                    ,rasxodN=sum(rasxodN)
                                    ,unit_type_name=max(rtrim(unit_type_name))
                                    ,principal_id=principal_id
                                    ,service_id=service_id
                                    ,zone_count=max(zone_count)
									,isNorm
                      from #multy_calc_info group by nls_id, service_id, principal_id, isNorm) 		calc 
					on calc.nls_id=ab.nls_id and calc.service_id=absc.service_id
                     and calc.principal_id=absc.principal_id and ((isNorm=0 and absd.type_rasx<>2) or (isNorm=1 and absd.type_rasx=2))
	left outer join (select	nls_id
							,kart_adr
							,principal_id
							,service_id
							,sum(saldo_beg)saldo_beg
							,sum(saldo_end)saldo_end
					 from _saldo
					 where (saldo_beg<>0 or saldo_end<>0)
					       and rperiod_beg=dateadd(mm,-1,@date_beg)
				     group by nls_id, kart_adr, principal_id, service_id) sal
	           on sal.nls_id=ab.nls_id and sal.kart_adr=absc.kart_adr and sal.principal_id=ss.principal_id and sal.service_id=ss.service_id
     left outer join _ab_schet_tarif_comp stc with(nolock) on stc.schet_adr=absc.schet_adr
	 left outer join __type_unit tu with(nolock)  on tu.unit_type_id=ts.unit_type_id
where ((isnull(absd.rasxod_mop10, 0)<>0)or(isnull(absd.rasxodP_mop10, 0)<>0)or(isnull(absd.rasxodN_mop10, 0)<>0))
group by ab.nls_id, absc.kart_adr, ss.kart_adr, ss.service_id, ss.principal_id, p.par_name, ts.name

--select * from #tmp_ss
--select * from #tmp_schet



select * 
into #tmp_rec_schet
from _ab_schet
where	(rperiod_beg=@date_beg or rperiod_beg_storno=@date_beg)
		and kart_adr in (select kart_adr from #tmp_kart)


--выставление счетов за предыдущие периоды
select	absc.nls_id,
		absc.service_id,
		absc.principal_id,
		kart_adr=absc.kart_adr,
		summa_nach=case when absc.simple_schet=1 then absc.summa_nach
						else isnull(absd.summa,0)+isnull(absd.summaP,0)+isnull(absd.summaN,0) end,
						--else isnull(absd.summa_lgot,0)+isnull(absd.summaP_lgot,0)+isnull(absd.summaN_lgot,0) end,
		summa_mop=cast(0 as money),
		rasxodD_mop=isnull(mopD,0),
		rasxodP_mop=isnull(mopP,0),
		rasxodN_mop=isnull(mopN,0),
		tarif_day=isnull(absd.tarif,absd.tarif_up)/100,
		tarif_pday=isnull(absd.tarifP,absd.tarifP_up)/100,
		tarif_night=isnull(absd.tarifN,absd.tarifN_up)/100
		,r=1
		,recalcOnly=0
		,np=0
into #tmp_recalc
from  #tmp_schet absc
	  left outer join #tmp_schet_detail absd on absd.schet_adr=absc.schet_adr
where (absc.rperiod_beg=@date_beg and (absc.date_beg<@_date_beg or absc.date_beg>=@_date_end) and (absc.storno=0 or (absc.storno=1 and absc.rperiod_beg_storno>@date_beg)))

	union all
	
--сторнирование счетов в текущем периоде
select	absc.nls_id,
		absc.service_id,
		absc.principal_id,
		kart_adr=absc.kart_adr,
		summa_nach= case when absc.simple_schet=1 then absc.summa_nach
					else -isnull(absd.summa,0)-isnull(absd.summaP,0)-isnull(absd.summaN,0) end,
					--else -isnull(absd.summa_lgot,0)-isnull(absd.summaP_lgot,0)-isnull(absd.summaN_lgot,0) end,
		summa_mop=cast(0 as money),
		rasxodD_mop=isnull(mopD,0),
		rasxodP_mop=isnull(mopP,0),
		rasxodN_mop=isnull(mopN,0),
		tarif_day=isnull(absd.tarif,absd.tarif_up)/100,
		tarif_pday=isnull(absd.tarifP,absd.tarifP_up)/100,
		tarif_night=isnull(absd.tarifN,absd.tarifN_up)/100
		,r=0
		,recalcOnly=0
		,np=0		
from  #tmp_schet absc
	  left outer join #tmp_schet_detail absd on absd.schet_adr=absc.schet_adr
where (absc.storno=1 and (absc.rperiod_beg_storno=@date_beg and absc.rperiod_beg<@date_beg))
--select * from #tmp_recalc where service_id=7
--select * from #tmp_schet where service_id=7

select	absc.nls_id,
		absc.service_id,
		absc.principal_id,
		kart_adr=absc.kart_adr,
		summa=-isnull(absa.summa,0)-isnull(absa.summaP,0)-isnull(absa.summaN,0)
into #tmp_absent
from	#tmp_schet absc
		inner join _ab_schet_absent absa on absa.schet_adr=absc.schet_adr
where (absc.rperiod_beg=@date_beg and (absc.date_beg<@_date_beg or absc.date_beg>=@_date_end) and (absc.storno=0 or (absc.storno=1 and absc.rperiod_beg_storno>@date_beg)))

	union all
	
select	absc.nls_id,
		absc.service_id,
		absc.principal_id,
		kart_adr=absc.kart_adr,
		summa=isnull(absa.summa,0)+isnull(absa.summaP,0)+isnull(absa.summaN,0)
from	#tmp_schet absc
		inner join _ab_schet_absent absa on absa.schet_adr=absc.schet_adr
where absc.rperiod_beg<@date_beg and absc.storno=1 and absc.rperiod_beg_storno=@date_beg



update #tmp_recalc set recalcOnly=1 where (	select count(*) 
											from #tmp_schet tt 
											where	tt.forRecalc=0 and tt.nls_id=#tmp_recalc.nls_id
													and tt.kart_adr=#tmp_recalc.kart_adr
													and tt.service_id=#tmp_recalc.service_id
													and tt.principal_id=#tmp_recalc.principal_id)=0


update #tmp_recalc set summa_mop= case	when r=0 then -(isnull(rasxodD_mop*tarif_day,0)+isnull(rasxodP_mop*tarif_pday,0)+isnull(rasxodN_mop*tarif_night,0))
										else (isnull(rasxodD_mop*tarif_day,0)+isnull(rasxodP_mop*tarif_pday,0)+isnull(rasxodN_mop*tarif_night,0)) end


update #multy_all_info set	recalc_mop=	isnull((select sum(summa_mop)
												from #tmp_recalc absc
												where	#multy_all_info.nls_id=absc.nls_id
														and #multy_all_info.kart_adr=absc.kart_adr
														and #multy_all_info.service_id=absc.service_id
														and #multy_all_info.principal_id=absc.principal_id),0)
								
update #multy_all_info set	recalc=	-isnull(recalc_mop,0)
									-isnull(summa_absentD,0)-isnull(summa_absentP,0)-isnull(summa_absentN,0)
									+case when (isNorm=1 and
												(select count(*) 
												from #multy_all_info tt 
												where	tt.nls_id=#multy_all_info.nls_id
														and tt.kart_adr=#multy_all_info.kart_adr
														and tt.service_id=#multy_all_info.service_id
														and	tt.principal_id=#multy_all_info.principal_id and tt.isNorm<>1)=0) or
												(isNorm=2 and
												(select count(*) 
												from #multy_all_info tt 
												where	tt.nls_id=#multy_all_info.nls_id
														and tt.kart_adr=#multy_all_info.kart_adr
														and tt.service_id=#multy_all_info.service_id
														and	tt.principal_id=#multy_all_info.principal_id and tt.isNorm=0)=0) or
												isNorm=0 then isnull((select sum(summa_nach)
																		from #tmp_recalc absc
																		where	#multy_all_info.nls_id=absc.nls_id
																				and absc.kart_adr=#multy_all_info.kart_adr
																				and #multy_all_info.service_id=absc.service_id
																				and #multy_all_info.principal_id=absc.principal_id),0)+
																isnull((select sum(summa)
																from #tmp_absent tt
																where	tt.nls_id=#multy_all_info.nls_id
																		and tt.kart_adr=#multy_all_info.kart_adr
																		and tt.service_id=#multy_all_info.service_id
																		and	tt.principal_id=#multy_all_info.principal_id),0)
										else 0 end
	
insert into #multy_all_info(nls_id, kart_adr, service_id, service_name, principal_id, principal_name,
							isMOP, isNorm, nullable, zone, recalc_mop, unit_type_name, tarif1_day, rasxodD)
select nls_id
	  ,r.kart_adr
      ,r.service_id
      ,rtrim(ts.name)
      ,r.principal_id
      ,cast(p.par_name as varchar(50))
      ,1
      ,0
      ,0
      ,1
      ,sum(summa_mop)
      ,unit_type_name=max(rtrim(tu.name))
      ,max(tarif_day)
      ,0
from	#tmp_recalc r
     left join __type_service ts with(nolock) on ts.service_id=r.service_id
     left outer join partners p with(nolock) on p.par_id=r.principal_id
     left outer join __type_unit tu with(nolock)  on tu.unit_type_id=ts.unit_type_id
where isnull(summa_mop,0)<>0 and
	 (	select count(*)
		from #multy_all_info tt
		where	tt.isMOP=1 and tt.nls_id=r.nls_id
				and tt.kart_adr=r.kart_adr
				and tt.service_id=r.service_id
				and tt.principal_id=r.principal_id)=0
group by nls_id, r.kart_adr, r.service_id, ts.name, r.principal_id, p.par_name
--select * from #tmp_recalc

insert into #multy_lgota_info(nls_id,lgota_name)
select absc.nls_id
      ,cast(rtrim(lg.name) as varchar(50))
from _ab_schet absc
     inner join _ab_schet_lg_tarif ablg with(nolock)  on ablg.schet_adr=absc.adr
     inner join __lgota lg with(nolock)  on lg.lgota_id=ablg.lgota_id
where absc.kart_adr in (select kart_adr from #tmp_kart)

--select * from #multy_ab_info
--select * from #multy_calc_info
--select * from #multy_all_info
--select * from #tmp_schet


Сообщение было отредактировано: 10 июл 12, 12:01
10 июл 12, 11:34    [12843474]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
У вас не видно в ошибок журнале.
Нельзя запустить повторно работающего агента. Скорее всего, монитор отображает неправильный статус.
10 июл 12, 11:45    [12843562]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37059
andreykond,

Убирайте, пожалуйста, портянки невероятных размеров в тег spoiler. Спасибо.
10 июл 12, 12:02    [12843682]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
invm
У вас не видно в ошибок журнале.
Нельзя запустить повторно работающего агента. Скорее всего, монитор отображает неправильный статус.

В этом и вопрос почему монитор так работает. Самое интересное что через 20 минут работы выдается сообщение "Агент репликации не зарегистрировал сообщение о ходе выполнения в 10 минутах", т.е. какой-то процесс идет.
10 июл 12, 13:07    [12844130]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
andreykond,

Ну работает он так. На 2008 R2 такое тоже иногда встречается. В этом случае нужно вручную остановить соответствующий джоб.
Т.к. журнал у вас ошибок не содержит, то остается только профайлером отследить проблемное место.
10 июл 12, 13:29    [12844338]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
invm
andreykond,

Ну работает он так. На 2008 R2 такое тоже иногда встречается. В этом случае нужно вручную остановить соответствующий джоб.
Т.к. журнал у вас ошибок не содержит, то остается только профайлером отследить проблемное место.

Профайлер на издателе и подписчике, тоже не показывает ошибок.
10 июл 12, 13:33    [12844377]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
Значит смотрите на чем подвисает агент и пробуйте воспроизвести это вручную.
10 июл 12, 14:37    [12844947]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
Во всем виноваты кривые руки разработчиков репликации MSSQL.
После нескольких дней мучений понял что причина наличие комментариев в процедуре. после удаления всех комментариев изменение процедуры прошло. Это видимо старая проблема еще с SQL2000, когда при выполнении процедуры часть кода не выполнялась из-за наличия перед кодом комментария (очень редкая ситуация но несколько раз сталкивался с данной проблемой).
11 июл 12, 14:30    [12850840]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
Советую всем кто будет в репликацию добавлять процедуры удалять комментарии.
11 июл 12, 14:32    [12850857]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы репликации слиянием при изменении структуры БД  [new]
andreykond
Member

Откуда:
Сообщений: 65
После удаления всех комментариев проблема осталась но уже в других скриптах. Возможно, что на самом деле проблема с размерами файлов. Когда работал SQL2000 была проблема с командой TEXTCOPY не могла загружать файлы размер которых кратен 1024, наверное и здесь аналогичный косяк.
В конечном итоге удалил все процедуры из схемы репликации, буду передавать их вручную на удаленные отделения.
21 июл 12, 11:03    [12896308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить