USE [Vertragsverwaltung_20160404] GO /****** Object: StoredProcedure [dbo].[sp_rpt_fhrlst_aufwand] Script Date: 02.12.2016 09:08:53 ******/ DROP PROCEDURE [dbo].[sp_rpt_fhrlst_aufwand] GO /****** Object: StoredProcedure [dbo].[sp_rpt_fhrlst_aufwand] 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_rpt_fhrlst_aufwand] @von DATETIME = NULL , @bis DATETIME = NULL , @oestruktur INTEGER = NULL , @struktur_Ausschluss VARCHAR(255) = NULL , @Honoris_Ausschluss VARCHAR(255) = NULL, @Mitarbeiter_Ausschluss varchar(255)=null, @layout varchar(20)=null AS BEGIN if @layout='WPI' begin exec dbo.sp_rpt_fhrlst_aufwand_WPI @von, @bis, @oestruktur, @struktur_Ausschluss, @Honoris_Ausschluss return end IF @von IS NULL SET @von = '2015-01-01 00:00:01' IF @bis IS NULL SET @bis = '2015-06-30 23:59:50' IF @oestruktur IS NULL SET @oestruktur = 24 IF @struktur_ausschluss IS NULL SET @struktur_ausschluss = '' IF @honoris_ausschluss IS NULL SET @honoris_ausschluss = '' if @Mitarbeiter_Ausschluss is null set @Mitarbeiter_Ausschluss='' declare @dd1 varchar(2) declare @mm1 varchar(2) declare @yy1 varchar(4) declare @datum varchar(255) set @dd1=DAY(@von) set @mm1=MONTH(@von) set @yy1=YEAR(@von) if LEN(@dd1)<2 set @dd1='0'+@dd1 if LEN(@mm1)<2 set @mm1='0'+@mm1 set @datum=@yy1+'-'+@mm1+'-'+@dd1 +' 00:00:00' set @von=convert(datetime,@datum,20) set @dd1=DAY(@bis) set @mm1=MONTH(@bis) set @yy1=YEAR(@bis) if LEN(@dd1)<2 set @dd1='0'+@dd1 if LEN(@mm1)<2 set @mm1='0'+@mm1 set @datum=@yy1+'-'+@mm1+'-'+@dd1 +' 23:59:59' set @bis=convert(datetime,@datum,20) print @von print @bis --'' SET @oestruktur=34 --'' SET @von = '01.02.2013 00:00:01' --'' SET @bis = '28.02.2013 23:59:50' --DECLARE @per DATETIME = NULL , -- @von DATETIME = NULL , -- @bis DATETIME = NULL --SET @per = '01.03.2013' --SET @von = '01.03.2013' --SET @bis = '31.03.2013' SET NOCOUNT ON; DECLARE @tmpa TABLE ( [TGNummer] [varchar](50) NULL , oenr INT , sortierung INT , START DATETIME , Ende DATETIME , [Paufwand] [float] NOT NULL , [RFC_300] [float] NOT NULL , [CTB] [float] NOT NULL , [RTB] [float] NOT NULL , RFC_200 FLOAT NOT NULL , [Total] [float] NOT NULL , [Soll] [float] NOT NULL , [Prod] [float] NOT NULL , [Anteil_CTB] [float] NOT NULL , [Anteil_RTB] [float] NOT NULL , Engagement_Effektiv FLOAT NOT NULL , Soll_Zeit FLOAT NOT NULL ) DECLARE @ansatz FLOAT SET @ansatz = 8.0 --IF @per IS NULL -- SET @per = GETDATE() --*************************************************************************** -- Relevante Mitarbeiter am Per-Datum --*************************************************************************** DECLARE @mnr INT DECLARE @rc INT DECLARE @mm INT DECLARE @yy INT DECLARE xm CURSOR FOR SELECT * FROM dbo.get_monatstabelle(@von, @bis) ORDER BY start_date OPEN xm FETCH NEXT FROM xm INTO @von, @bis WHILE @@FETCH_STATUS = 0 BEGIN DECLARE xc CURSOR FOR SELECT manr FROM ma WHERE aktiv = 1 AND gueltig_bis >= @bis and manr not in (select item from dbo.fnkt_split(@mitarbeiter_ausschluss,',',1)) OPEN xc FETCH NEXT FROM xc INTO @mnr WHILE @@FETCH_STATUS = 0 BEGIN SELECT @rc = COUNT(*) FROM dbo.MADetails WHERE manr = @mnr AND aktiv = 1 AND Gueltig_ab <= @von IF @rc > 0 BEGIN print @mnr INSERT @tmpa SELECT TOP 1 dbo.MA.TGNummer, madetails.OENr, ma.sortierung, @von, @bis, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, dbo.get_anteil(engagement, MitarbeiterTypNr), dbo.get_arbeitstage(madetails.MADetailNr, year(@von),month(@von)) --dbo.get_arbeitstage(year(@von),month(@von)) FROM dbo.MA LEFT OUTER JOIN dbo.MADetails ON dbo.MA.MANr = dbo.MADetails.MANr WHERE dbo.MADetails.manr = @mnr AND dbo.MADetails.Aktiv = 1 AND Gueltig_ab <= @von ORDER BY Gueltig_ab DESC END FETCH NEXT FROM xc INTO @mnr END CLOSE xc DEALLOCATE xc DECLARE @anzahl FLOAT DECLARE @ma VARCHAR(255) -- Honris 200 SELECT dbo.Honoris_JOURNAL.DATUM, dbo.Honoris_JOURNAL.ANZAHLINT, dbo.Honoris_mitarbeiter.NAME, dbo.Honoris_mitarbeiter.VORNAME, dbo.Honoris_PROJEKT.KURZNAME, dbo.Honoris_PROJEKT.BEZEICHNUNG, dbo.Honoris_mitarbeiter.MITARBEITER_ID, dbo.Honoris_JOURNAL.ERFDATUM, dbo.Honoris_PROJEKT.PROJEKT_NR INTO #tmphono FROM dbo.Honoris_JOURNAL INNER JOIN dbo.Honoris_PROJEKT ON dbo.Honoris_JOURNAL.PROJEKT_NR = dbo.Honoris_PROJEKT.PROJEKT_NR INNER JOIN dbo.Honoris_mitarbeiter ON dbo.Honoris_JOURNAL.MITARBEITER_NR = dbo.Honoris_mitarbeiter.MITARBEITER_NR WHERE (dbo.honoris_projekt.BOOL2=1 --( dbo.Honoris_PROJEKT.PROJEKT_NR >= 200 ) --AND ( dbo.Honoris_PROJEKT.PROJEKT_NR < 300 ) ) AND dbo.Honoris_PROJEKT.PROJEKT_NR NOT IN ( SELECT item FROM dbo.fnkt_split(@Honoris_Ausschluss, ',', 1) ) DECLARE xc CURSOR FOR SELECT SUM(ANZAHLINT), MITARBEITER_ID FROM #tmphono WHERE ( DATUM >= @von AND DATUM <= @bis ) GROUP BY MITARBEITER_ID OPEN xc FETCH NEXT FROM xc INTO @anzahl, @ma WHILE @@FETCH_STATUS = 0 BEGIN UPDATE @tmpa SET rfc_200 = @anzahl WHERE tgnummer = @ma AND start = @von AND ende = @bis FETCH NEXT FROM xc INTO @anzahl, @ma END CLOSE xc DEALLOCATE xc DROP TABLE #tmpHono -- Honris 300 SELECT dbo.Honoris_JOURNAL.DATUM, dbo.Honoris_JOURNAL.ANZAHLINT, dbo.Honoris_mitarbeiter.NAME, dbo.Honoris_mitarbeiter.VORNAME, dbo.Honoris_PROJEKT.KURZNAME, dbo.Honoris_PROJEKT.BEZEICHNUNG, dbo.Honoris_mitarbeiter.MITARBEITER_ID, dbo.Honoris_JOURNAL.ERFDATUM, dbo.Honoris_PROJEKT.PROJEKT_NR INTO #tmphono1 FROM dbo.Honoris_JOURNAL INNER JOIN dbo.Honoris_PROJEKT ON dbo.Honoris_JOURNAL.PROJEKT_NR = dbo.Honoris_PROJEKT.PROJEKT_NR INNER JOIN dbo.Honoris_mitarbeiter ON dbo.Honoris_JOURNAL.MITARBEITER_NR = dbo.Honoris_mitarbeiter.MITARBEITER_NR where dbo.honoris_PROJEKT.BOOL4=1 --and dbo.honoris_projekt.bool4=0 and dbo.Honoris_PROJEKT.PROJEKT_NR NOT IN ( SELECT item FROM dbo.fnkt_split(@Honoris_Ausschluss, ',', 1) ) --WHERE (dbo.honoris_PROJEKT.BOOL3=1 and ( dbo.Honoris_PROJEKT.PROJEKT_NR >= 300 ) -- AND ( dbo.Honoris_PROJEKT.PROJEKT_NR <= 399 )) -- AND dbo.Honoris_PROJEKT.PROJEKT_NR NOT IN ( SELECT item -- FROM dbo.fnkt_split(@Honoris_Ausschluss, ',', 1) ) DECLARE xc CURSOR FOR SELECT SUM(ANZAHLINT), MITARBEITER_ID FROM #tmphono1 WHERE ( DATUM >= @von AND DATUM <= @bis ) GROUP BY MITARBEITER_ID OPEN xc FETCH NEXT FROM xc INTO @anzahl, @ma WHILE @@FETCH_STATUS = 0 BEGIN UPDATE @tmpa SET rfc_300 = @anzahl WHERE tgnummer = @ma AND start = @von AND ende = @bis FETCH NEXT FROM xc INTO @anzahl, @ma END CLOSE xc DEALLOCATE xc DROP TABLE #tmphono1 -- Honoris <> 300 SELECT dbo.Honoris_JOURNAL.DATUM, dbo.Honoris_JOURNAL.ANZAHLINT, dbo.Honoris_mitarbeiter.NAME, dbo.Honoris_mitarbeiter.VORNAME, dbo.Honoris_PROJEKT.KURZNAME, dbo.Honoris_PROJEKT.BEZEICHNUNG, dbo.Honoris_mitarbeiter.MITARBEITER_ID, dbo.Honoris_JOURNAL.ERFDATUM, dbo.Honoris_PROJEKT.PROJEKT_NR INTO #tmpHono2 FROM dbo.Honoris_JOURNAL INNER JOIN dbo.Honoris_PROJEKT ON dbo.Honoris_JOURNAL.PROJEKT_NR = dbo.Honoris_PROJEKT.PROJEKT_NR INNER JOIN dbo.Honoris_mitarbeiter ON dbo.Honoris_JOURNAL.MITARBEITER_NR = dbo.Honoris_mitarbeiter.MITARBEITER_NR WHERE dbo.honoris_projekt.BOOL3=1 and dbo.honoris_projekt.bool4=0 AND dbo.Honoris_PROJEKT.PROJEKT_NR NOT IN ( SELECT item FROM dbo.fnkt_split(@Honoris_Ausschluss, ',', 1) ) --WHERE (dbo.honoris_projekt.BOOL3=1 and ( dbo.Honoris_PROJEKT.PROJEKT_NR < 300 ) -- OR ( dbo.Honoris_PROJEKT.PROJEKT_NR > 399 )) -- AND dbo.Honoris_PROJEKT.PROJEKT_NR NOT IN ( SELECT item -- FROM dbo.fnkt_split(@Honoris_Ausschluss, ',', 1) ) DECLARE xc CURSOR FOR SELECT SUM(ANZAHLINT), MITARBEITER_ID FROM #tmpHono2 WHERE ( DATUM >= @von ) AND ( DATUM <= @bis ) GROUP BY MITARBEITER_ID OPEN xc FETCH NEXT FROM xc INTO @anzahl, @ma WHILE @@FETCH_STATUS = 0 BEGIN UPDATE @tmpa SET Paufwand = @anzahl WHERE tgnummer = @ma AND start = @von AND ende = @bis FETCH NEXT FROM xc INTO @anzahl, @ma END CLOSE xc DEALLOCATE xc DROP TABLE #tmpHono2 -- IN DECLARE xc CURSOR FOR SELECT SUM(CalculatedValue) AS Expr1, ForUserID FROM dbo.TXP_LVer_IN_AU WHERE ( ExecutedDateTime >= @von AND ExecutedDateTime <= @bis ) AND ( Ticket_ID LIKE N'IN_%' ) GROUP BY ForUserID OPEN xc FETCH NEXT FROM xc INTO @anzahl, @ma WHILE @@FETCH_STATUS = 0 BEGIN UPDATE @tmpa SET rtb = @anzahl WHERE tgnummer = @ma AND start = @von AND ende = @bis FETCH NEXT FROM xc INTO @anzahl, @ma END CLOSE xc DEALLOCATE xc -- AU DECLARE xc CURSOR FOR SELECT SUM(CalculatedValue) AS Expr1, ForUserID FROM dbo.TXP_LVer_IN_AU WHERE ( ExecutedDateTime >= @von AND ExecutedDateTime <= @bis ) AND ( Ticket_ID LIKE N'AU_%' ) GROUP BY ForUserID OPEN xc FETCH NEXT FROM xc INTO @anzahl, @ma WHILE @@FETCH_STATUS = 0 BEGIN UPDATE @tmpa SET ctb = @anzahl WHERE tgnummer = @ma AND start = @von AND ende = @bis FETCH NEXT FROM xc INTO @anzahl, @ma END CLOSE xc DEALLOCATE xc FETCH NEXT FROM xm INTO @von, @bis END CLOSE xm DEALLOCATE xm --select * from @tmpa where TGNummer='TG8166' UPDATE @tmpa SET total = paufwand + rfc_300 + ctb + rtb + rfc_200 -- Berechnen UPDATE @tmpa SET soll = ( soll_zeit * @ansatz ) / 100 * Engagement_Effektiv SELECT Distinct TOP ( 100 ) PERCENT dbo.OE.Bezeichnung AS OE, dbo.OE.Sortierung AS OESort, dbo.MA.Name, dbo.MA.Vorname, dbo.MA.Sortierung, a.TGNummer, a.START, a.ende, a.sortierung AS Expr1, a.Paufwand, a.RFC_300, a.CTB, a.RTB, a.RFC_200, a.Total, a.Soll, a.Prod, a.Anteil_CTB, a.Anteil_RTB, a.Engagement_Effektiv, a.Soll_Zeit INTO #tmpfhr FROM @tmpa a INNER JOIN dbo.MA ON a.TGNummer = dbo.MA.TGNummer INNER JOIN dbo.OE ON a.oenr = dbo.OE.OeNr WHERE dbo.OE.oenr IN ( SELECT id FROM dbo.fnkt_get_kpi_hierarchie(@oestruktur) ) AND dbo.oe.oenr NOT IN ( SELECT item FROM dbo.fnkt_split(@struktur_Ausschluss, ',', 1) ) and ma.Aktiv=1 ORDER BY OESort, dbo.MA.Sortierung, dbo.MA.Name --select * from #tmpfhr where TGNummer='tg8166' SELECT OE, OESort, Name, Vorname, Sortierung, TGNummer, Expr1 AS Sort, Engagement_Effektiv, SUM(Paufwand) AS PAufwand, SUM(RFC_300) AS RFC_300, SUM(CTB) AS CTB, SUM(RTB) AS RTB, SUM(RFC_200) AS RFC_200, SUM(Total) AS Total, SUM(Soll) AS Soll, CONVERT(NUMERIC(18, 2), 0.00) AS Prod, CONVERT(NUMERIC(18, 2), 0.00) AS Anteil_CTB, CONVERT(NUMERIC(18, 2), 0.00) AS Anteil_Rtb INTO #tmpfhr1 FROM #tmpfhr GROUP BY OE, OESort, Name, Vorname, Sortierung, TGNummer, Expr1, Engagement_Effektiv UPDATE #tmpfhr1 SET prod = ROUND(total / soll * 100, 2) WHERE total > 0 AND soll > 0 UPDATE #tmpfhr1 SET Anteil_CTB = ROUND(( ( paufwand + rfc_300 + ctb ) / Total ) * 100, 2) WHERE total > 0 AND ( paufwand + rfc_300 + ctb ) > 0 UPDATE #tmpfhr1 SET Anteil_rtb = ROUND(( ( rfc_200 + rtb ) / total ) * 100, 2) WHERE total > 0 AND ( rfc_200 + rtb ) > 0 if @layout='intern' begin SELECT * FROM #tmpfhr1 ORDER BY OESort, Sortierung, Name end else begin SELECT *, convert(varchar(20),@layout) as Layout FROM #tmpfhr1 ORDER BY OESort, Sortierung, Name end DROP TABLE #tmpfhr DROP TABLE #tmpfhr1 END GO