USE [Vertragsverwaltung_20160404] GO /****** Object: StoredProcedure [dbo].[sp_vertragsuebersicht_get_struktur] Script Date: 02.12.2016 09:08:53 ******/ DROP PROCEDURE [dbo].[sp_vertragsuebersicht_get_struktur] GO /****** Object: StoredProcedure [dbo].[sp_vertragsuebersicht_get_struktur] Script Date: 02.12.2016 09:08:55 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO CREATE proc [dbo].[sp_vertragsuebersicht_get_struktur] @vertragstypnr int, @vertragspartnernr int, @mitarbeiternr int, @details int, @suchstring varchar(255) as set nocount on CREATE TABLE #tmpd( [vertragselementnr] [int] , [bezeichnung] [varchar] (255) null, [parentid] [int] null, [Vertragstypnr] [int], [aktiv] [bit] null, [vertragselementnrursprung] [int] null, [basevertragstypnr] [int] null, [key] [int] IDENTITY(1,1) NOT NULL, [level] int null, [loopcnt] int null, ) ON [DEFAULT] CREATE TABLE #tmpe( [vertragselementnr] [int] , [bezeichnung] [varchar] (255) null, [parentid] [int] null, [Vertragstypnr] [int], [aktiv] [bit] null, [vertragselementnrursprung] [int] null, [basevertragstypnr] [int] null, [key] [int] NOT NULL, [level] int null, [loopcnt] int null, ) ON [DEFAULT] CREATE TABLE #tmps( [vertragselementnr] [int] , [bezeichnung] [varchar] (255) null, [parentid] [int] null, [Vertragstypnr] [int], [aktiv] [bit] null, [vertragselementnrursprung] [int] null, [basevertragstypnr] [int] null, [key] [int] NOT NULL, [level] int null, [loopcnt] int null, ) ON [DEFAULT] declare @vnr int declare @vtype varchar(255) declare @tmpid int declare @tmpid_base int declare @aktiv bit declare @tmp int declare @loop int declare @keyvalue int declare @keyvalue1 int declare @key int declare @loopcnt int set @tmpid=-100 set @loopcnt = 0 ---------------------------------------------------------------------------------------------------------- -- Struktur nach Partner auslesen / ohne Suchstring - Suchstring berücksichtigt Vertragsinhalt ---------------------------------------------------------------------------------------------------------- Struktur_Nach_Partner: --if @suchstring<>'' goto suche_mit_searchstring -- Vertragstypen mit Vertragselementen insert #tmpd (vertragselementnr, bezeichnung, parentid, vertragstypnr, aktiv) values(0,'Root',null,0,1) set @loop=0 declare @rootvertragstypnr int, @rootvertragstyp varchar(255) declare xc cursor for SELECT DISTINCT dbo.Vertragstyp.Vertragstypnr*-100, dbo.Vertragstyp.Vertragstyp FROM dbo.Vertragstyp INNER JOIN dbo.Vertragselement ON dbo.Vertragstyp.Vertragstypnr = dbo.Vertragselement.VertragstypNr WHERE (dbo.Vertragselement.VertragspartnerNr = @vertragspartnernr) and securitylevelnr in (select SecurityLevelNr from dbo.Get_SecurityLevelTab(@mitarbeiternr)) ORDER BY dbo.Vertragstyp.Vertragstyp open xc fetch next from xc into @rootvertragstypnr, @rootvertragstyp while @@fetch_status=0 begin -- Vertragselemente mit parentid=0 mit entsprechendem Vertragstyp insert #tmpd (vertragselementnr, bezeichnung, parentid, vertragstypnr, aktiv) values(@rootvertragstypnr,@rootvertragstyp,0,@rootvertragstypnr,@aktiv) declare xy cursor for select Vertragselementnr, parentid, vertragstypnr from vertragselement where vertragspartnernr=@vertragspartnernr and vertragstypnr*-100=@rootvertragstypnr and parentid=0 and securitylevelnr in (select SecurityLevelNr from dbo.Get_SecurityLevelTab(@mitarbeiternr)) open xy fetch next from xy into @tmp, @tmpid, @vnr while @@fetch_status=0 begin execute dbo.sp_vertragsuebersicht_get_struktur_down @tmp,1, @vnr, @tmpid, @loopcnt set @loopcnt=@loopcnt+1 fetch next from xy into @tmp, @tmpid, @vnr end close xy deallocate xy -- Vertragselemente mit Parentid<>0 declare xy cursor for select Vertragselementnr, parentid, vertragstypnr from vertragselement where vertragspartnernr=@vertragspartnernr and vertragstypnr*-100=@rootvertragstypnr and parentid<>0 and securitylevelnr in (select SecurityLevelNr from dbo.Get_SecurityLevelTab(@mitarbeiternr)) and vertragselementnr not in (select vertragselementnr from #tmpd) open xy fetch next from xy into @tmp, @tmpid, @vnr while @@fetch_status=0 begin execute dbo.sp_vertragsuebersicht_get_struktur_down @tmp,1, @vnr, @tmpid, @loopcnt set @loopcnt=@loopcnt+1 fetch next from xy into @tmp, @tmpid, @vnr end close xy deallocate xy -- Eindeutige Schlüssel if @loop>0 begin --select * from #tmpd set @keyvalue=(@loop*10000)+100000 set @keyvalue1 = @keyvalue update #tmpd set vertragselementnr=vertragselementnr+@keyvalue where [vertragselementnrursprung]>0 update #tmpd set parentid=parentid+@keyvalue where [vertragselementnrursprung]>0 select top 1 @keyvalue=vertragselementnr, @key=[key] from #tmpd where [vertragselementnrursprung] is null update #tmpd set parentid=@keyvalue where parentid not in (select vertragselementnr from #tmpd) end update #tmpd set basevertragstypnr=@rootvertragstypnr/-100 set @loop=@loop+1 update #tmpd set parentid=@rootvertragstypnr where parentid=0 insert #tmpe select * from #tmpd delete from #tmpd fetch next from xc into @rootvertragstypnr, @rootvertragstyp end close xc deallocate xc update #tmpe set parentid=0 where parentid=vertragselementnr update #tmpe set aktiv=1 where aktiv is null -- update #tmpe set parentid=0 where parentid not in (select vertragselementnr from #tmpe) update #tmpe set parentid=vertragstypnr where parentid not in (select vertragselementnr from #tmpe) if @suchstring='' begin select *, null as Securitylevelnr into #tmpxx from #tmpe order by [key] update #tmpxx set securitylevelnr = (select securitylevelnr from dbo.vertragselement where dbo.vertragselement.vertragselementnr = #tmpxx.vertragselementnrursprung) select * from #tmpxx where securitylevelnr in (select SecurityLevelNr from dbo.Get_SecurityLevelTab(@mitarbeiternr)) or [level] is null order by [key] -- -select * from #tmpe order by [key] drop table #tmpd drop table #tmpe drop table #tmps drop table #tmpxx return end ------------------------------------------------------------------------------------------- -- Suche mit Searchstring ------------------------------------------------------------------------------------------- Suche_Mit_Searchstring: declare @level int declare @pid int declare @xx int declare @xxpid int declare @cnt int declare @elementnr int declare @xxelementnr int declare @xkey int declare @xlevel int declare @xpid int declare @ykey int declare xc cursor for select [key],basevertragstypnr,parentid, level, loopcnt, vertragselementnr from #tmpe where dbo.search_vertragselement([vertragselementnrursprung],@suchstring)=1 open xc fetch next from xc into @tmp,@vnr,@pid, @level, @loopcnt, @elementnr while @@fetch_status=0 begin set @xpid=@pid insert #tmps select * from #tmpe where [key]=@tmp while @pid > 0 begin select @tmp=[key], @pid=parentid from #tmpe where vertragselementnr=@pid insert #tmps select * from #tmpe where [key]=@tmp end declare xx cursor for select [key], parentid, vertragselementnr from #tmpe where loopcnt = @loopcnt and level>@level open xx fetch next from xx into @xx, @xxpid, @xxelementnr while @@fetch_status = 0 begin select @cnt=count([key]) from #tmpe where parentid in (select vertragselementnr from #tmpe) if @cnt > 0 insert #tmps select * from #tmpe where [key]=@xx and @xxelementnr not in (select vertragselementnr from #tmps) fetch next from xx into @xx, @xxpid, @xxelementnr end close xx deallocate xx /* -- insert #tmps select * from #tmpe where (basevertragstypnr=@vnr and [key]<=@tmp and parentid<>@pid) or ([key]=@tmp) and -- @elementnr not in (select vertragselementnr from #tmps) and parentid > 0 -- order by [key] insert #tmps select * from #tmpe where loopcnt=@loopcnt --(basevertragstypnr=@vnr and [key]<=@tmp and parentid<>@pid) or ([key]=@tmp) and declare xx cursor for select [key], parentid, vertragselementnr from #tmpe where loopcnt = @loopcnt and level>@level open xx fetch next from xx into @xx, @xxpid, @xxelementnr while @@fetch_status = 0 begin select @cnt=count([key]) from #tmpe where parentid in (select vertragselementnr from #tmpe) if @cnt > 0 insert #tmps select * from #tmpe where [key]=@xx and @xxelementnr not in (select vertragselementnr from #tmps) fetch next from xx into @xx, @xxpid, @xxelementnr end close xx deallocate xx -- insert #tmps select * from #tmpe where loopcnt = @loopcnt and level > @level and parentid in (select vertragselementnr from #tmps) fetch next from xc into @tmp,@vnr,@pid, @level, @loopcnt, @elementnr end */ fetch next from xc into @tmp,@vnr,@pid, @level, @loopcnt, @elementnr end close xc deallocate xc insert #tmps select * from #tmpe where vertragselementnr in (select parentid from #tmps where parentid < 0) select @cnt=count(*) from #tmps where bezeichnung='Root' if @cnt<1 begin insert #tmps (vertragselementnr, bezeichnung, parentid, vertragstypnr, aktiv,[key]) values(0,'Root',null,0,1,999999) end --alter table #tmps drop column [key] --alter table #tmps drop column [LEVEL] --alter table #tmps drop column [LOOPCNT] -- select distinct * from #tmps order by [key] select distinct *, null as Securitylevelnr into #tmpyy from #tmps order by [key] update #tmpyy set securitylevelnr = (select securitylevelnr from dbo.vertragselement where dbo.vertragselement.vertragselementnr = #tmpyy.vertragselementnrursprung) select * from #tmpyy where securitylevelnr in (select SecurityLevelNr from dbo.Get_SecurityLevelTab(@mitarbeiternr)) or [level] is null order by [key] drop table #tmpd drop table #tmpe drop table #tmps drop table #tmpyy return GO