USE [Vertragsverwaltung_20160404] GO /****** Object: StoredProcedure [dbo].[sp_mittelfristplanung] Script Date: 02.12.2016 09:08:53 ******/ DROP PROCEDURE [dbo].[sp_mittelfristplanung] GO /****** Object: StoredProcedure [dbo].[sp_mittelfristplanung] Script Date: 02.12.2016 09:08:55 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= CREATE PROCEDURE [dbo].[sp_mittelfristplanung] @datumvon datetime, @datumbis datetime, @mitarbeiternr int AS BEGIN declare @tmptabl1 varchar(255) declare @xsql varchar(4096) declare @cnt int declare @year int -- ============================================= -- Temporäre Tabelle löschen -- ============================================= set @tmptabl1 = str(@mitarbeiternr) while left(@tmptabl1,1)=' ' begin set @tmptabl1=right(@tmptabl1,len(@tmptabl1)-1) end set @tmptabl1 = 'tmp_mfp_' + @tmptabl1 IF EXISTS (SELECT name FROM sysobjects WHERE name = @tmptabl1) begin set @xsql = 'drop table dbo.' + @tmptabl1 execute (@xsql) end set @tmptabl1='dbo.'+@tmptabl1 -- ============================================= -- Temporäre Tabelle mit Anzahl Spalten nach Jahren anlegen -- ============================================= set @xsql='Create table ' + @tmptabl1 + '([Ereignisnr] [int] NULL' set @cnt=YEAR(@datumbis) - YEAR(@datumvon) set @year = YEAR(@datumvon) while @year < YEAR(@datumbis)+1 begin set @xsql = @xsql + ' ,[Kosten_'+LTRIM(str(@year))+'] [decimal] (18,2) NULL' set @xsql = @xsql + ' ,[Mwst_'+LTRIM(str(@year))+'] [decimal] (18,2) NULL' set @xsql = @xsql + ' ,[Total_'+LTRIM(str(@year))+'] [decimal] (18,2) NULL' set @year=@year+1 end set @xsql=@xsql+') on [default]' execute(@xsql) -- ============================================= -- Ereignisse verarbeiten - Initialverarbeitung -- ============================================= declare @enr int declare xc cursor for select ereignisnr from dbo.Vertragsereignis where ereignistypnr=3 and periodizitaetnr <> 0 --and ereignisnr not in (select ereignisnr from Vertragsereignis where Datum<>'1900-01-01' and Start<>'1900-01-01' and Ende <> '1900-01-01') open xc fetch next from xc into @enr while @@FETCH_STATUS=0 begin execute dbo.sp_mittelfristplanung_berechnung @datumvon, @datumbis, @mitarbeiternr, @enr fetch next from xc into @enr end close xc deallocate xc -- ============================================= -- Nullvalues mit 0 ersetzen -- ============================================= set @year = YEAR(@datumvon) while @year < YEAR(@datumbis)+1 begin set @xsql = 'update ' + @tmptabl1 + ' set ' + '[Kosten_'+LTRIM(str(@year))+']' + ' = 0 where ' + '[Kosten_'+LTRIM(str(@year))+']' + ' is null' execute (@xsql) set @xsql = 'update ' + @tmptabl1 + ' set ' + '[Mwst_'+LTRIM(str(@year))+']' + ' = 0 where ' + '[Mwst_'+LTRIM(str(@year))+']' + ' is null' execute (@xsql) set @xsql = 'update ' + @tmptabl1 + ' set ' + '[Total_'+LTRIM(str(@year))+']' + ' = 0 where ' + '[Total_'+LTRIM(str(@year))+']' + ' is null' execute (@xsql) set @year=@year+1 end -- ============================================= -- Resultat ausgeben -- ============================================= set @xsql='SELECT dbo.Kostenart.Bezeichnung AS Kostenart, dbo.Vertragspartner.NameZ1 AS Vertragspartner, Vertragselement_1.Bezeichnung AS Uebergeordnetes_VE, ' set @xsql=@xsql+' dbo.Vertragselement.Nummer AS Vertragsnummer, dbo.Vertragselement.Bezeichnung AS Bezeichnung_VE, dbo.Vertragsereignis.Bezeichnung AS Bezeichnung_EG, ' set @xsql=@xsql+' dbo.Periodizitaet.Bezeichnung AS Periodizitaet, dbo.Vertragsereignis.InklMwSt AS InklMwst, ' + @tmptabl1 +'.*' set @xsql=@xsql+' FROM dbo.Vertragsereignis INNER JOIN' set @xsql=@xsql+' dbo.Vertragselement ON dbo.Vertragsereignis.Vertragselementnr = dbo.Vertragselement.Vertragselementnr INNER JOIN' set @xsql=@xsql+' dbo.Kostenart ON dbo.Vertragsereignis.KostenartNr = dbo.Kostenart.KostenartNr INNER JOIN' set @xsql=@xsql+' dbo.Periodizitaet ON dbo.Vertragsereignis.PeriodizitaetNr = dbo.Periodizitaet.PeriodizitaetNr INNER JOIN' set @xsql=@xsql+' dbo.Vertragspartner ON dbo.Vertragselement.VertragspartnerNr = dbo.Vertragspartner.VertragspartnerNr INNER JOIN' set @xsql=@xsql+' ' + @tmptabl1 + ' ON dbo.Vertragsereignis.EreignisNr = ' + @tmptabl1+'.Ereignisnr LEFT OUTER JOIN' set @xsql=@xsql+' dbo.Vertragselement AS Vertragselement_1 ON dbo.Vertragselement.ParentID = Vertragselement_1.Vertragselementnr' print @xsql execute (@xsql) -- ============================================= -- Temporäre Tabelle löschen -- ============================================= set @tmptabl1 = str(@mitarbeiternr) while left(@tmptabl1,1)=' ' begin set @tmptabl1=right(@tmptabl1,len(@tmptabl1)-1) end set @tmptabl1 = 'tmp_mfp_' + @tmptabl1 IF EXISTS (SELECT name FROM sysobjects WHERE name = @tmptabl1) begin set @xsql = 'drop table dbo.' + @tmptabl1 execute (@xsql) end END GO