USE [DEV] GO /****** Object: StoredProcedure [dbo].[fk_RozdzielnikPlac_nazwiska] Script Date: 11.10.2016 13:44:05 ******/ SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO -- rozdzielnik płac - nazwiskami -- w jednym stanowisku wiele komórek kosztów - jeżeli <100 procent to reszta na komórki z list płac -- płace - nie uwzględniam osób, do których Uz ma ograniczony dostęp -- Ewa Stachowicz 11-10-2016 ALTER PROCEDURE [dbo].[fk_RozdzielnikPlac_nazwiska] @JK smallint, @Skad tinyint=0, -- 0 z płac, 1 z FK @RokObr nvarchar(10), @Typ tinyint, @RokOd smallint, @MiesOd tinyint, @RokDo smallint, @MiesDO tinyint, @DataWyplOd datetime, @DataWyplDo datetime, @Zatw bit, @Listy varchar(200), @TylkoKwoty bit=1, @Sumowac bit=0, @Uz varchar(20)='', @TakSta bit=0 -- 0 - komórki z list płac, 1- komórki z rozbicia stanowisk, jeżeli nie ma z list płac AS --------------------------------------------------------------------------------------------------------------------------------------------------------------------- DECLARE @SQL varchar(4000), @SQL1 varchar(4000), @SQLw varchar(1000), @UID uniqueidentifier, @UIDp uniqueidentifier, @Komorka varchar(10), @Algorytm varchar(1000), @i int, @xx varchar(20), @xxA varchar(50), @xx1 varchar(50), @x1 varchar(15), @x2 varchar(10), @x3 varchar(10), @x4 varchar(10), @kwota money, @Tak tinyint, @UID_kdtListy_pozycje uniqueidentifier, @UID_tblPracownicy uniqueidentifier, @Skl varchar(20), @TypZ tinyint, @Lp int, @Konto varchar(30), @Strona tinyint, @Opis varchar(100) ----------------------------------------------------------------------------------------- SET DATEFORMAT dmy create table #Kwota ( kw Money, UID_tblPracownicy uniqueidentifier ) create table #Osoby ( UID uniqueidentifier, NrEto int, Tak int ) -- wykaz pozycji z list create table #Tym ( UID_kdtListy_pozycje uniqueidentifier, -- pozycja listy UID_tblPracownicy uniqueidentifier, NrEto int, Rok smallint, Miesiac tinyint, Komorka varchar(10), TypPodatku varchar(1), Numer smallint, Procent money ) create table #Zar ( UID uniqueidentifier default newid(), UID_kdtListy_pozycje uniqueidentifier, -- pozycja listy UID_tblPracownicy uniqueidentifier, NrEto int, Rok smallint, Miesiac tinyint, Komorka varchar(10), TypPodatku varchar(1), Numer smallint, Procent money, Skl varchar(20), Typ tinyint, Kwota money, Kw money ) -- wiele komórek na jedno stanowisko create table #TymS ( UID_tblPracownicy uniqueidentifier, Rok smallint, Miesiac tinyint, Komorka varchar(10), Procent money, DataOd datetime, DataDo datetime, k1 tinyint, k2 tinyint, k3 tinyint, Zatr bit, Zw bit ) create table #Rozdzielnik ( UID uniqueidentifier, Lp int, Komorka varchar(10), Algorytm varchar(2000), Konto varchar(30), Strona tinyint, Opis varchar(100), Kwota money, UID_tblPracownicy uniqueidentifier ) SET @Tak=0 -- osoby if len(IsNull(@Uz,''))=0 begin INSERT INTO #Osoby (UID,NrEto) SELECT UID,NrEto FROM tblPracownicy o WHERE JK=@JK end else begin INSERT INTO #Osoby (UID,NrEto,Tak) SELECT UID,NrEto,dbo.pl_PracTak(o.JK,@Uz,Jedn,Komorka,NrListy) FROM tblPracownicy o WHERE (JK=@JK) if (SELECT count(*) FROM #Osoby WHERE IsNull(Tak,0)=0)>0 begin -- są osoby do których nie ma uprawnien SET @Tak=1 DELETE FROM #Osoby WHERE IsNull(Tak,0)=0 end end -- rozdzielnik if IsNull(@Skad,0)=0 begin -- płace INSERT INTO #Rozdzielnik (UID,Lp,Komorka,Algorytm,Konto,Strona,Opis) SELECT UID,IsNull(Lp,0),Komorka,IsNull(Algorytm,'0'),Konto,Strona,Opis FROM kdsAlgorytmyRozdzielnika WHERE (JK=@JK) AND (Typ=@Typ) ORDER BY Lp end else begin -- FK INSERT INTO #Rozdzielnik (UID,Lp,Komorka,Algorytm,Konto,Strona,Opis,UID_konta,Rozrachunki) SELECT r.UID,IsNull(r.Lp,0),r.Komorka,IsNull(r.Algorytm,'0'),r.Konto,r.Strona,r.Opis,k.UID,k.Rozrachunki FROM kdsAlgorytmyRozdzielnika r INNER JOIN fktPlanKont k ON (r.JK=k.JK) AND (Rtrim(r.Konto)=Rtrim(k.Konto)) WHERE (r.JK=@JK) AND (r.Typ=@Typ) AND (k.RokObr=@RokObr) ORDER BY r.Lp end UPDATE #Rozdzielnik SET Komorka=Replace(Replace(Komorka,'*','%'),'?','_') WHERE Len(IsNull(Komorka,''))>0 -- wybór z list SET @SQLw='' if @RokDo Is Null begin if @RokOd Is Not Null begin SET @SQLw= @SQLw+' AND (w.Rok='+convert(varchar(4),@RokOd)+') AND (w.Miesiac='+convert(varchar(2),@MiesOd)+')' end end else begin SET @SQLw= @SQLw+' AND ((w.Rok>'+convert(varchar(4),@RokOd)+') OR ((w.Rok='+convert(varchar(4),@RokOd)+') AND (w.Miesiac>='+convert(varchar(2),@MiesOd)+'))) AND ((w.Rok<'+convert(varchar(4),@RokDo)+') OR ((w.Rok='+convert(varchar(4),@RokDo)+') AND (w.Miesiac<='+convert(varchar(2),@MiesDo)+')))' end if @DataWyplDo Is Null begin if @DataWyplOd Is Not Null SET @SQLw= @SQLw+' AND (w.DataWyplaty='''+convert(varchar(10),@DataWyplOd,105)+''')' end else begin SET @SQLw= @SQLw+' AND (w.DataWyplaty>='''+convert(varchar(10),@DataWyplOd,105)+''') AND (w.DataWyplaty<='''+convert(varchar(10),@DataWyplDo,105)+''')' end if @Zatw=1 SET @SQLw= @SQLw+' AND (w.DataZatw Is Not Null)' SET @Listy=Rtrim(IsNull(@listy,'')) if len(@listy)>0 begin SET @SQL='' SET @i=PATINDEX('%,%',@Listy) while @i>0 begin SET @xx=Substring(@Listy,1,@i-1) SET @Listy=Substring(@Listy,@i+1,Len(@Listy)-@i) SET @i=PATINDEX('%-%',@xx) if @i>0 SET @SQL= @SQL+' OR ((w.Numer>='+Substring(@xx,1,@i-1)+') AND (w.Numer<='+Substring(@xx,@i+1,Len(@xx)-@i)+'))' else SET @SQL= @SQL+' OR (w.Numer='+@xx+')' SET @i=PATINDEX('%,%',@Listy) end if len(@Listy)>0 begin SET @xx=@Listy SET @i=PATINDEX('%-%',@xx) if @i>0 SET @SQL= @SQL+' OR ((w.Numer>='+Substring(@xx,1,@i-1)+') AND (w.Numer<='+Substring(@xx,@i+1,Len(@xx)-@i)+'))' else SET @SQL= @SQL+' OR (w.Numer='+@xx+')' end if len(@SQL)>4 SET @SQLw=@SQLw+' AND ('+Substring(@SQL,5,len(@SQL)-4)+')' end if len(@SQLw)>5 SET @SQLw=' WHERE '+Substring(@SQLw,6,len(@SQLw)-5) -- wykaz pozycji z list płac z danego okresu SET @SQL='INSERT INTO #Tym (UID_kdtListy_pozycje,UID_tblPracownicy,NrEto,Rok,Miesiac,Komorka,TypPodatku,Numer,Procent) SELECT p.UID,p.UID_tblPracownicy,o.NrEto,w.Rok,w.Miesiac,p.Komorka,p.TypPodatku,w.Numer,100 FROM kdtListy_wykaz w INNER JOIN kdtListy_pozycje p ON w.UID=p.UID_kdtListy_wykaz INNER JOIN #Osoby o ON p.UID_tblPracownicy=o.UID '+@SQLw EXEC(@SQL) if IsNull(@TakSta,0)=1 begin -- jeżeli jest podzial stanowisk INSERT INTO #TymS (UID_tblPracownicy,Rok,Miesiac,Komorka,Procent,DataOd,DataDo,Zatr,Zw,k1,k2) SELECT a.UID_tblPracownicy,a.Rok,a.Miesiac,k.Komorka,k.Procent,s.DataOd,s.DataDo,IsNull(s.Zatrudnienie,0), CASE WHEN (s.DataDo Is Not Null) AND (s.SposobZwolnienia Is Not Null) THEN 1 ELSE 0 END,0,0 FROM (SELECT UID_tblPracownicy, Rok,Miesiac FROM #Tym GROUP BY UID_tblPracownicy, Rok,Miesiac) a INNER JOIN kdtStanowiska s ON (a.UID_tblPracownicy=s.UID_tblPracownicy) AND ((YEAR(s.DataOd)a.Rok) OR ((YEAR(s.DataDo)=a.Rok) AND (Month(s.DataDo)>=a.Miesiac)))) INNER JOIN kdtStanowiskaMPK k ON s.UID=k.UID_kdtStanowiska -- dzień końca miesiąca UPDATE #TymS SET k3=CASE WHEN (Miesiac=2) THEN Day(DATEADD(d,-1,CONVERT(datetime,convert(varchar(4),Rok)+'0301'))) WHEN (Miesiac=4) OR (Miesiac=6) OR (Miesiac=9) OR (Miesiac=11) THEN 30 ELSE 31 END -- początek stanowiska w miesiącu UPDATE #TymS SET k1=1 WHERE (YEAR(DataOd)=Rok) AND (Month(DataOd)=Miesiac)And (DAY(DataOd)>1) -- zatrudnienie w miesiącu nie pomniejsza procentów podziału -- jeżeli nie ma poprzedniego zatrudnienia w tym miesiącu UPDATE #TymS SET k1=0 FROM #TymS t INNER JOIN (SELECT s.UID_tblPracownicy,s.DataOd FROM #TymS s WHERE (s.k1=1) AND (s.Zatr=1) AND ((SELECT COUNT(*) FROM kdtStanowiska WHERE (UID_tblPracownicy=s.UID_tblPracownicy) AND (DataDo=DATEADD(d,-1,s.DataOd)))=0) )a ON (t.UID_tblPracownicy=a.UID_tblPracownicy) AND (t.DataOd=a.DataOd) WHERE t.k1=1 -- koniec stanowiska UPDATE #TymS SET k2=1 WHERE (DataDo Is Not Null) AND (YEAR(DataDo)=Rok) AND (Month(DataDo)=Miesiac)And (DAY(DataDo)100 if IsNull(@TakSta,0)=1 begin -- jeżeli jest podzial stanowisk DECLARE CR0 CURSOR LOCAL FOR SELECT UID_kdtListy_pozycje,UID_tblPracownicy,Typ,Skl, kwS=IsNull(Kwota,0)-IsNull(SUM(Kw),0) FROM #Zar GROUP BY UID_kdtListy_pozycje,UID_tblPracownicy,Typ,Skl, Kwota HAVING IsNull(Kwota,0)<>Isnull(SUM(Kw),0) OPEN CR0 FETCH CR0 INTO @UID_kdtListy_pozycje,@UID_tblPracownicy,@TypZ,@Skl, @kwota WHILE @@FETCH_STATUS >= 0 BEGIN SELECT TOP 1 @UID=UID FROM #Zar WHERE (UID_kdtListy_pozycje=@UID_kdtListy_pozycje) AND (UID_tblPracownicy=@UID_tblPracownicy) AND (Typ=@TypZ) AND (Skl=@Skl) ORDER BY IsNull(Kw,0) DESC,Komorka UPDATE #Zar SET Kw=ISNULL(Kw,0)+@kwota WHERE UID=@UID FETCH CR0 INTO @UID_kdtListy_pozycje,@UID_tblPracownicy,@TypZ,@Skl, @kwota END CLOSE CR0 DEALLOCATE CR0 end DECLARE CR1 CURSOR LOCAL FOR SELECT UID,Komorka,Algorytm,Lp,Konto,Strona,Opis FROM #Rozdzielnik WHERE UID_tblPracownicy Is Null ORDER BY Lp OPEN CR1 FETCH CR1 INTO @UID,@Komorka,@Algorytm,@Lp,@Konto,@Strona,@Opis WHILE @@FETCH_STATUS >= 0 BEGIN SET @Algorytm=RTrim(@Algorytm) INSERT INTO #Rozdzielnik (UID,Lp,Komorka,Algorytm,Konto,Strona,Opis,UID_tblPracownicy) SELECT @UID,@Lp,@Komorka,@Algorytm,@Konto,@Strona,@Opis,UID_tblPracownicy FROM #Tym GROUP BY UID_tblPracownicy -- par(parametr) - kwota parametru SET @xx='%par(%' SET @xxA='par(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+4,20) SET @i=PATINDEX('%)%',@xx1) SET @xx1=substring(@xx1,1,@i-1) SELECT @kwota=Kwota FROM kdsParametryPlac WHERE (Jk=@JK) AND (Parametr=@xx1) SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,''par()'','+convert(nvarchar(20),IsNull(@kwota,0))+') WHERE (UID_tblPracownicy Is Not Null) AND (UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end -- ilOs(typ podatku) - ilość z listami z typem podatku -- typ podatku: spacja - podstawowy, pusty wszystkie SET @xx='%ilOs(%' SET @xxA='ilOs(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+5,20) SET @i=PATINDEX('%)%',@xx1) if @i=1 SET @xx1='' else begin SET @xx1=Ltrim(substring(@xx1,1,@i-1)) if len(@xx1)=0 SET @xx1='UST' end DELETE FROM #Kwota SET @SQL='INSERT INTO #Kwota (kw) SELECT count(*) FROM (SELECT UID_tblPracownicy FROM #Tym' SET @SQLw='' if len(@xx1)>0 begin if @xx1='UST' SET @SQLw=@SQLw+' WHERE ((IsNull(TypPodatku,'''')='''') OR (IsNull(TypPodatku,'''')='' ''))' else SET @SQLw=@SQLw+' WHERE (IsNull(TypPodatku,'''')='''+Rtrim(@xx1)+''')' end SET @SQL=@SQL+@SQLw+' GROUP BY UID_tblPracownicy) a' EXEC(@SQL) SELECT @kwota=kw FROM #Kwota SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',1) FROM #Rozdzielnik r INNER JOIN (SELECT UID_tblPracownicy FROM #Tym '+@SQLw +' GROUP BY UID_tblPracownicy) a ON r.UID_tblPracownicy = a.UID_tblPracownicy WHERE (r.UID_tblPracownicy Is Not Null) AND (r.UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',0) FROM #Rozdzielnik WHERE (UID_tblPracownicy Is Not Null) AND (UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end -- sklK(symbol składnika,typ podatku,nr listy) -suma podanego skladnika -- typ podatku opcjonalanie - spacja to podatek ustawowy, puste to wszysto -- nr listy - opcjonalnie SET @xx='%sklK(%' SET @xxA='sklK(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+5,20) SET @i=PATINDEX('%)%',@xx1) SET @xx1=substring(@xx1,1,@i-1) SET @i=PATINDEX('%,%',@xx1) if @i>0 begin SET @x1=substring(@xx1,1,@i-1)-- składnik płac SET @x2=substring(@xx1,@i+1,len(@xx1)-@i) SET @i=PATINDEX('%,%',@x2) if @i>0 begin SET @x3=substring(@x2,@i+1,len(@x2)-@i) -- lista --SET @x2=substring(@x2,1,@i-1)-- podatek if @i=1 SET @x2='' else begin SET @x2=Substring(Ltrim(@x2),1,1) if @x2=',' SET @x2='UST' end end else begin SET @x3='' end end else begin SET @x1=@xx1 SET @x2='' SET @x3='' end DELETE FROM #Kwota SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Skl='''+Rtrim(@x1)+''')' if len(IsNull(@Komorka,''))>0 SET @SQL=@SQL+' AND (Komorka LIKE '''+@Komorka+''')' if len(@x2)>0 begin if @x2='UST' SET @SQL=@SQL+' AND ((IsNull(TypPodatku,'''')='''') OR (IsNull(TypPodatku,'''')='' ''))' else SET @SQL=@SQL+' AND (IsNull(TypPodatku,'''')='''+Rtrim(@x2)+''')' end if len(@x3)>0 SET @SQL=@SQL+' AND (Numer ='+@x3+')' SET @SQL=@SQL+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SELECT @kwota=SUM(kw) FROM #Kwota SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',convert(varchar(20),IsNull(a.kw,0))) FROM #Rozdzielnik r LEFT OUTER JOIN #Kwota a ON r.UID_tblPracownicy = a.UID_tblPracownicy WHERE (r.UID_tblPracownicy Is Not Null) AND (r.UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end -- sklS(typ składników,typ podatku,nr listy) -suma podanego skladnika -- typ podatku opcjonalanie - spacja to podatek ustawowy, puste to wszysto -- nr listy - opcjonalnie SET @xx='%sklS(%' SET @xxA='sklS(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+5,20) SET @i=PATINDEX('%)%',@xx1) SET @xx1=substring(@xx1,1,@i-1) SET @i=PATINDEX('%,%',@xx1) if @i>0 begin SET @x1=substring(@xx1,1,@i-1)-- typ składnik płac SET @x2=substring(@xx1,@i+1,len(@xx1)-@i) SET @i=PATINDEX('%,%',@x2) if @i>0 begin SET @x3=substring(@x2,@i+1,len(@x2)-@i) -- lista --SET @x2=substring(@x2,1,@i-1)-- podatek if @i=1 SET @x2='' else begin SET @x2=Substring(Ltrim(@x2),1,1) if @x2=',' SET @x2='UST' end end else begin SET @x3='' end end else begin SET @x1=@xx1 SET @x2='' SET @x3='' end DELETE FROM #Kwota SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)='''+Rtrim(@x1)+''')' if len(IsNull(@Komorka,''))>0 SET @SQL=@SQL+' AND (Komorka LIKE '''+@Komorka+''')' if len(@x2)>0 begin if @x2='UST' SET @SQL=@SQL+' AND ((IsNull(TypPodatku,'''')='''') OR (IsNull(TypPodatku,'''')='' ''))' else SET @SQL=@SQL+' AND (IsNull(TypPodatku,'''')='''+Rtrim(@x2)+''')' end if len(@x3)>0 SET @SQL=@SQL+' AND (Numer ='+@x3+')' SET @SQL=@SQL+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SELECT @kwota=SUM(kw) FROM #Kwota SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',convert(varchar(20),IsNull(a.kw,0))) FROM #Rozdzielnik r LEFT OUTER JOIN #Kwota a ON r.UID_tblPracownicy = a.UID_tblPracownicy WHERE (r.UID_tblPracownicy Is Not Null) AND (r.UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end -- sklE(składnik płac,numer pracownika) -suma podanego skladnika dla danej osoby SET @xx='%sklE(%' SET @xxA='sklE(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+5,20) SET @i=PATINDEX('%)%',@xx1) SET @xx1=substring(@xx1,1,@i-1) SET @i=PATINDEX('%,%',@xx1) if @i>0 begin SET @x1=substring(@xx1,1,@i-1)-- składnik płac SET @x2=substring(@xx1,@i+1,len(@xx1)-@i) -- osoba end else begin SET @x1=@xx1 SET @x2='0' end DELETE FROM #Kwota SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Skl='''+Rtrim(@x1)+''') AND (NrEto='+@x2+')' if len(IsNull(@Komorka,''))>0 SET @SQL=@SQL+' AND (Komorka LIKE '''+@Komorka+''')' SET @SQL=@SQL+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SELECT @kwota=kw FROM #Kwota SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',convert(varchar(20),IsNull(a.kw,0))) FROM #Rozdzielnik r LEFT OUTER JOIN #Kwota a ON r.UID_tblPracownicy = a.UID_tblPracownicy WHERE (r.UID_tblPracownicy Is Not Null) AND (r.UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end -- sklP(zmienna,typ podatku,nr listy,numer pracownika) -suma podanej zmiennej -- typ podatku opcjonalanie - spacja to podatek ustawowy, puste to wszysto -- nr listy - opcjonalnie -- numer pracownika - opcjonalnie SET @xx='%sklP(%' SET @xxA='sklP(' SET @i=PATINDEX(@xx,@Algorytm) while @i>0 begin SET @kwota=0 SET @xx1=Substring(@Algorytm,@i+5,20) SET @i=PATINDEX('%)%',@xx1) SET @xx1=substring(@xx1,1,@i-1) SET @i=PATINDEX('%,%',@xx1) if @i>0 begin SET @x1=substring(@xx1,1,@i-1)-- zmienna SET @x2=substring(@xx1,@i+1,len(@xx1)-@i) SET @i=PATINDEX('%,%',@x2) if @i>0 begin SET @x3=substring(@x2,@i+1,len(@x2)-@i) if @i=1 begin SET @x2='' end else begin SET @x2=Substring(Ltrim(@x2),1,1) if @x2=',' SET @x2='UST' end SET @i=PATINDEX('%,%',@x3) if @i>0 begin SET @x4=substring(@x3,@i+1,len(@x3)-@i) -- nr eto SET @x3=substring(@x3,1,@i-1) -- lista end else begin SET @x4='' end end else begin SET @x3='' SET @x4='' end end else begin SET @x1=@xx1 SET @x2='' SET @x3='' SET @x4='' end SET @SQLw='' if len(IsNull(@Komorka,''))>0 begin SET @SQLw=' AND (Komorka LIKE '''+@Komorka+''')' end if len(@x2)>0 begin if @x2='UST' SET @SQLw=@SQLw+' AND ((IsNull(TypPodatku,'''')='''') OR (IsNull(TypPodatku,'''')='' ''))' else SET @SQLw=@SQLw+' AND (IsNull(TypPodatku,'''')='''+Rtrim(@x2)+''')' end if len(@x3)>0 SET @SQLw=@SQLw+' AND (Numer ='+@x3+')' if len(@x4)>0 SET @SQLw=@SQLw+' AND (NrEto='+@x4+')' DELETE FROM #Kwota if @x1='Brutto' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)<>''P'') AND (Substring(Skl,1,1)<>''B'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Place' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''W'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Swiadczenia' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''S'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Pozostale' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''N'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Potracenia' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''P'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Przelewy' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''B'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Ubezpieczenia' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm'') OR (Skl=''SklRe'') OR (Skl=''SklCh'') OR (Skl=''SklZdr'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Ubezp1' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm'') OR (Skl=''SklRe'') OR (Skl=''SklCh'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='UbezpPracodawca' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm1'') OR (Skl=''SklRe1'') OR (Skl=''SklWy'') OR (Skl=''SklFP'') OR (Skl=''SklFG'') OR (Skl=''SklFEP'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='UbezpPrac1' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm1'') OR (Skl=''SklRe1'') OR (Skl=''SklWy'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='UbezpPrac2' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklFP'') OR (Skl=''SklFG'') OR (Skl=''SklFEP'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='Netto' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=-SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm'') OR (Skl=''SklRe'') OR (Skl=''SklCh'') OR (Skl=''SklZdr'') OR (Skl=''ZalPod'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)<>''P'') AND (Substring(Skl,1,1)<>''B'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else if @x1='DoWyplaty' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=-SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm'') OR (Skl=''SklRe'') OR (Skl=''SklCh'') OR (Skl=''SklZdr'') OR (Skl=''ZalPod'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)<>''P'') AND (Substring(Skl,1,1)<>''B'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=-SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)=''P'') '+@SQLw EXEC(@SQL) end else if @x1='Kasa' begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=-SUM(Kw) FROM #Zar WHERE (Typ=1) AND ((Skl=''SklEm'') OR (Skl=''SklRe'') OR (Skl=''SklCh'') OR (Skl=''SklZdr'') OR (Skl=''ZalPod'')) '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=2) AND (Substring(Skl,1,1)<>''P'') AND (Substring(Skl,1,1)<>''B'')'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=-SUM(Kw) FROM #Zar WHERE (Typ=2) AND ((Substring(Skl,1,1)=''P'') OR (Substring(Skl,1,1)=''B''))'+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end else begin SET @SQL='INSERT INTO #Kwota (UID_tblPracownicy,kw) SELECT UID_tblPracownicy,Kwota=SUM(Kw) FROM #Zar WHERE (Typ=1) AND (Skl='''+@x1+''') '+@SQLw+' GROUP BY UID_tblPracownicy' EXEC(@SQL) end SELECT @kwota=SUM(kw) FROM #Kwota SET @xx1=Rtrim(@xxA)+Rtrim(@xx1)+')' SET @Algorytm=Replace(@Algorytm,@xx1,convert(nvarchar(20),IsNull(@kwota,0))) SET @i=PATINDEX(@xx,@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'''+@xx1+''',convert(varchar(20),IsNull(a.kw,0))) FROM #Rozdzielnik r LEFT OUTER JOIN (SELECT UID_tblPracownicy, kw=Sum(Kw) FROM #Kwota GROUP BY UID_tblPracownicy) a ON r.UID_tblPracownicy = a.UID_tblPracownicy WHERE (r.UID_tblPracownicy Is Not Null) AND (r.UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) end SET @Algorytm=Replace(@Algorytm,'--','+') SET @Algorytm=Replace(@Algorytm,'++','+') SET @Algorytm=Replace(@Algorytm,'+-','-') SET @Algorytm=Replace(@Algorytm,'-+','-') SET @SQL='UPDATE #Rozdzielnik SET Kwota='+@Algorytm+' WHERE (UID_tblPracownicy Is Null) AND (UID='''+convert(varchar(40),@UID)+''')' EXEC(@SQL) FETCH CR1 INTO @UID,@Komorka,@Algorytm,@Lp,@Konto,@Strona,@Opis END CLOSE CR1 DEALLOCATE CR1 UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'--','+') WHERE (UID_tblPracownicy Is Not Null) UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'++','+') WHERE (UID_tblPracownicy Is Not Null) UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'+-','-') WHERE (UID_tblPracownicy Is Not Null) UPDATE #Rozdzielnik SET Algorytm=Replace(Algorytm,'-+','-') WHERE (UID_tblPracownicy Is Not Null) DECLARE CR2 CURSOR LOCAL FOR SELECT UID,UID_tblPracownicy,Algorytm FROM #Rozdzielnik WHERE UID_tblPracownicy Is Not Null ORDER BY Lp OPEN CR2 FETCH CR2 INTO @UID,@UIDp, @Algorytm WHILE @@FETCH_STATUS >= 0 BEGIN SET @Algorytm=RTrim(@Algorytm) SET @SQL='UPDATE #Rozdzielnik SET Kwota='+@Algorytm+' WHERE (UID='''+convert(varchar(40),@UID)+''') AND (UID_tblPracownicy='''+convert(varchar(40),@UIDp)+''')' EXEC(@SQL) FETCH CR2 INTO @UID,@UIDp,@Algorytm END CLOSE CR2 DEALLOCATE CR2 if @TylkoKwoty=1 begin DELETE FROM #Rozdzielnik WHERE IsNull(Kwota,0)=0 end else begin DELETE FROM #Rozdzielnik WHERE (IsNull(Kwota,0)=0) AND (UID_tblPracownicy Is Not Null) end -- podstawianie zmiennych SET @xx1='' if @RokOd Is Not Null SET @xx1=convert(varchar(4),@RokOd) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Rko',@xx1),1,100)) SET @xx1='' if @RokDo Is Not Null SET @xx1=convert(varchar(4),@RokDo) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Rkd',@xx1),1,100)) SET @xx1='' if @MiesOd Is Not Null SET @xx1=Rtrim(convert(varchar(2),@MiesOd)) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Mko',@xx1),1,100)) SET @xx1='' if @MiesDo Is Not Null SET @xx1=Rtrim(convert(varchar(2),@MiesDo)) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Mkd',@xx1),1,100)) SET @xx1='' if @DataWyplOd Is Null begin UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Rpo',@xx1),1,100)) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Mpo',@xx1),1,100)) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Dwo',@xx1),1,100)) end else begin SET @xx1=convert(varchar(4),Year(@DataWyplOd)) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Rpo',@xx1),1,100)) SET @xx1=Rtrim(convert(varchar(2),Month(@DataWyplOd))) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Mpo',@xx1),1,100)) SET @xx1=convert(varchar(10),@DataWyplOd,105) UPDATE #Rozdzielnik SET Opis=Rtrim(Substring(Replace(Opis,'%Dwo',@xx1),1,100)) end -- kwoty z dwoma miejscami po przecinku UPDATE #Rozdzielnik SET Kwota=ROUND(IsNull(Kwota,0)*100,0)/100 SELECT Tak=@Tak,r.Lp,Typ=CASE WHEN o.UID IS Null THEN 1 ELSE 0 END, Napis=CASE WHEN o.UID IS Null THEN r.Opis ELSE Rtrim(IsNull(o.Nazwisko,''))+' '+Rtrim(IsNull(o.Imie,''))+' '+Rtrim(IsNull(o.ImieDrugie,'')) END, o.NrEto, r.Konto,r.Strona,r.Opis,Kw=SUM(r.Kwota),Konto1=CASE WHEN o.UID IS Null THEN r.Konto ELSE ' ' END, Wn=SUM(CASE WHEN r.Strona=1 THEN IsNull(r.Kwota,0) ELSE 0 END), Ma=Sum(CASE WHEN r.Strona=0 THEN IsNull(r.Kwota,0) ELSE 0 END) FROM #Rozdzielnik r LEFT OUTER JOIN tblPracownicy o ON r.UID_tblPracownicy=o.UID GROUP BY r.Lp, r.UID, r.Konto,r.Strona,r.Opis, IsNull(o.Nazwisko,''),IsNull(o.Imie,''),o.NrEto,IsNull(o.ImieDrugie,''),o.UID ORDER BY r.Lp, r.UID, IsNull(o.Nazwisko,''),IsNull(o.Imie,''),IsNull(o.ImieDrugie,''),o.NrEto,o.UID GO