-- dbo.ep_Vyroba_AdvPlan_ZapisDavkyPrikazu CREATE PROCEDURE dbo.ep_Vyroba_AdvPlan_ZapisDavkyPrikazu @datumStart DATETIME=NULL, @casOd TINYINT=NULL AS SET NOCOUNT ON -- HD Consulting Strakonice, T. Buzin -- !! proceduru neupravujte, bude stejne pregenerovana pri startu pluginu pro planovani IF OBJECT_ID('tempdb..#TabPrikazyProKapacPlan', 'U') IS NULL RETURN DECLARE @errMsg NVARCHAR(500), @tranPred INT, @majorSqlVer TINYINT, @jeSql2022 BIT=0, @cnt INT, @canCont BIT=0, @sql NVARCHAR(max), @debugXml XML DECLARE @idSadaDavek INT, @idVPr INT, @pocetVlastOper INT, @dokl INT, @alt NCHAR(1), @dilec INT, @mjEvid NVARCHAR(10), @kodZakazModif NVARCHAR(20), @idZakazModif INT, @idStroj INT=NULL, @idKalendarStroje INT, @cntOpProZapis INT, @doklProZapis INT, @altProZapis NCHAR(1), @ksZaHod NUMERIC(19,6), @kaZaHod NUMERIC(19,6), @kusyZad NUMERIC(19,6), @mnozKs NUMERIC(19,6), @mnozKa NUMERIC(19,6), @mnozKsVKA NUMERIC(19,6), @mnozKAnaPal NUMERIC(19,6), @mnoz NUMERIC(19,6), @pocetDavek INT, @cisloDavky INT, @locId INT, @planStartPrikaz DATETIME, @planKonecPrikaz DATETIME, @secCnt INT, @planStart DATETIME, @prepoctiPlanStart BIT, @planStartEnd DATETIME, @planKonec DATETIME, @ksZbytek NUMERIC(19,6), @cas DATETIME, @jeTesto BIT=0 DECLARE @idAdvKPl INT, @idDavky INT, @idVypoctu INT, @idPrac INT, @podm NVARCHAR(80), @idDavkyOld INT, @startOdOld DATETIME, @poradCislo INT DECLARE @jeUdrzba BIT, @pocetHodUdrzba NUMERIC(19,6), @idPrPUdrzba INT -- TabPrPostup.ID z prikazu udrzby DECLARE @davky TABLE (ID INT NOT NULL, CasOd DATETIME, CasDo DATETIME, Zamek BIT DEFAULT 0, PoradoveCislo INT) BEGIN TRY SET @tranPred = @@TRANCOUNT IF (@tranPred=0) BEGIN TRAN -- cisteni SQL seedu SET @cnt = ISNULL( (SELECT MAX(ID) FROM dbo.TabAdvKPVypocty), 1) DBCC CHECKIDENT(TabAdvKPVypocty, RESEED, @cnt) SET @cnt = ISNULL( (SELECT MAX(ID) FROM dbo.TabAdvKPDavky), 1) DBCC CHECKIDENT(TabAdvKPDavky, RESEED, @cnt) SET @majorSqlVer = CONVERT(tinyint, SERVERPROPERTY('ProductMajorVersion')) SET @jeSql2022 = CONVERT(bit, IIF(@majorSqlVer>=16, 1, 0)) SELECT @idAdvKPl=ID FROM dbo.TabAdvKapacPlan WHERE Kod=N'99' SET @idVypoctu=(SELECT TOP(1) ID FROM dbo.TabAdvKPVypocty WHERE IDAdvKapacPlan=@idAdvKPl ORDER BY CisloVypoctu DESC) IF (@idVypoctu IS NULL) BEGIN INSERT dbo.TabAdvKPVypocty (IDAdvKapacPlan, CisloVypoctu, Akce, IDLastMzdy) VALUES (@idAdvKPl, 1, 3, 0) SET @idVypoctu = SCOPE_IDENTITY() END SET @casOd = ISNULL(@casOd, 0) SET @idSadaDavek = 1 + ISNULL( (SELECT MAX(_VazbaPlgPlan) FROM dbo.TabAdvKPDavky_EXT WHERE _VazbaPlgPlan IS NOT NULL), 0) DECLARE c CURSOR LOCAL FOR SELECT ID, JeUdrzba, PocetHodin, IDPrPostup FROM #TabPrikazyProKapacPlan OPEN c WHILE (1=1) BEGIN FETCH NEXT FROM c INTO @idVPr, @jeUdrzba, @pocetHodUdrzba, @idPrPUdrzba IF (@@FETCH_STATUS<>0) BREAK IF (@jeUdrzba=1) BEGIN SET @idPrPUdrzba = ISNULL(@idPrPUdrzba, 0) SET @pocetHodUdrzba = ISNULL(@pocetHodUdrzba, 0) IF (@idPrPUdrzba>0) AND (@pocetHodUdrzba>0) BEGIN IF (@datumStart IS NOT NULL) SET @planStart = DATEADD(hour, @casOd, dbo.hf_TruncDate(@datumStart)) ELSE SET @planStart = DATEADD(hour, @casOd, dbo.hf_TruncDate(GETDATE())) SELECT @idVPr=IDPrikaz, @doklProZapis=Doklad, @altProZapis=Alt, @idPrac=pracoviste, @idStroj=IDStroje FROM dbo.TabPrPostup WHERE ID=@idPrPUdrzba AND IDOdchylkyDo IS NULL SELECT @dilec=IdTabKmen, @idZakazModif=IdZakazModif, @kusyZad=Kusy_zad FROM dbo.TabPrikaz WHERE ID=@idVPr SET @idKalendarStroje = (SELECT IDPlanKalend FROM dbo.TabCisStroju WHERE ID=@idStroj) SET @pocetDavek = @pocetHodUdrzba SET @cisloDavky = 1 -- pokud neni nektera davka daneho prikazu uzamcena, smaz je vsechny -- jinak nastav aby se planovani toho prikazu pri privnim pruchodu WHILE ukoncilo /* IF NOT EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDPrikaz=@idVPr AND IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1) DELETE FROM dbo.TabAdvKPDavky WHERE IDPrikaz=@idVPr AND IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj ELSE SET @cisloDavky=@pocetDavek */ WHILE (1=1) BEGIN IF (@cisloDavky>@pocetDavek) BREAK DELETE FROM @davky IF EXISTS (SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND CasOd>=@planStart AND Zamek=0) BEGIN ;WITH d AS ( SELECT ROW_NUMBER() OVER (ORDER BY CasOd) AS AutoInc, ID, CasOd, CasDo, Zamek FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND CasOd>=@planStart AND Zamek=0 ) INSERT @davky (ID, CasOd, CasDo, Zamek, PoradoveCislo) SELECT ID, CasOd, CasDo, Zamek, AutoInc FROM d; END SET @debugXml = (SELECT * FROM @davky FOR XML AUTO) -- begin: test data/casu zahajeni na kalendar stroje IF (@idKalendarStroje IS NULL) -- pokud kalendar nemam, per to tam BEGIN SET @cnt = 0 WHILE EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @planStart BETWEEN CasOd AND CasDo) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @planStart = DATEADD(hour, 1, @planStart) SET @cnt = @cnt + 1 END SET @planStartEnd = DATEADD(second, -1, DATEADD(hour, 1, @planStart)) END ELSE BEGIN -- pokud kalendar mam, zkontroluj jestli neni na dany datum/cas vyjimka SET @cnt = 0 WHILE (EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @planStart BETWEEN CasOd AND CasDo) OR EXISTS(SELECT 1 FROM dbo.TabPlanKalendPol WHERE IDStroje=@idStroj AND @planStart BETWEEN CasOd AND CasDo) ) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @planStart = DATEADD(hour, 1, @planStart) SET @cnt = @cnt + 1 END SET @planStartEnd = DATEADD(second, -1, DATEADD(hour, 1, @planStart)) END -- end: test data/casu zahajeni na kalendar stroje IF OBJECT_ID('dbo.ep_Vyroba_AdvPlan_ArchivujDavky', 'P') IS NOT NULL EXEC dbo.ep_Vyroba_AdvPlan_ArchivujDavky @IDAdvKapacPlan=@idAdvKPl SET @podm = N'IdAdvKapacPlan=' + CONVERT(nvarchar, @idAdvKPl) EXEC @locId=dbo.hp_NajdiPrvniVolny @Tabulka=N'TabAdvKPDavky', @Atribut=N'LocalID', @Where=@podm, @Odkud=1, @Kam=999999999, @Returnem=1 SET @mnoz = 0 INSERT dbo.TabAdvKPDavky (IDAdvKapacPlan, LocalID, IDVypoctu, ZpusobVznikuDavkyKP, DatumPripadu, IDPrikaz, Dilec, DokladPrPostup, AltPrPostup, IDPrac, IDStroje, CasOd, CasDo, Mnozstvi, PrepravniCas, MeziOperCas, DeadTime, BlokaceZdroje, ProcSplneni, Mnozstvi_Zive) SELECT @idAdvKPl, @locId, @idVypoctu, 0, @planStart, @idVPr, @dilec, @doklProZapis, @altProZapis, @idPrac, @idStroj, @planStart, @planStartEnd, @mnoz, 0, 0, 0, 1, 0, @mnoz SET @idDavky = SCOPE_IDENTITY() IF (@idDavky IS NOT NULL) BEGIN IF NOT EXISTS (SELECT 1 FROM dbo.TabAdvKPDavky_EXT WHERE ID=@idDavky) INSERT dbo.TabAdvKPDavky_EXT (ID) VALUES (@idDavky) UPDATE dbo.TabAdvKPDavky_EXT SET _VazbaPlgPlan=@idSadaDavek WHERE ID=@idDavky END -- begin: posun nasledujicich davek DECLARE dav CURSOR LOCAL FOR SELECT ID, CasOd, PoradoveCislo FROM @davky OPEN dav WHILE (1=1) BEGIN FETCH NEXT FROM dav INTO @idDavkyOld, @startOdOld, @poradCislo IF (@@FETCH_STATUS<>0) BREAK IF (@poradCislo=1) SET @startOdOld = DATEADD(hour, 1, @planStart) ELSE SET @startOdOld = DATEADD(hour, 1, (SELECT CasOd FROM @davky WHERE PoradoveCislo=@poradCislo-1)) IF (@idKalendarStroje IS NULL) BEGIN SET @cnt = 0 WHILE EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @startOdOld BETWEEN CasOd AND CasDo) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @startOdOld = DATEADD(hour, 1, @startOdOld) SET @cnt = @cnt + 1 END END ELSE BEGIN SET @cnt = 0 WHILE (EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @startOdOld BETWEEN CasOd AND CasDo) OR EXISTS(SELECT 1 FROM dbo.TabPlanKalendPol WHERE IDStroje=@idStroj AND @planStart BETWEEN CasOd AND CasDo) ) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @startOdOld = DATEADD(hour, 1, @startOdOld) SET @cnt = @cnt + 1 END END UPDATE @davky SET CasOd=@startOdOld, CasDo=DATEADD(second, -1, DATEADD(hour, 1, @startOdOld)) WHERE PoradoveCislo=@poradCislo UPDATE dbo.TabAdvKPDavky SET CasOd=@startOdOld, CasDo=DATEADD(second, -1, DATEADD(hour, 1, @startOdOld)) WHERE ID=@idDavkyOld END CLOSE dav DEALLOCATE dav -- end: posun nasledujicich davek SET @cisloDavky = @cisloDavky + 1 END END -- @idPrPUdrzba>0 END ELSE BEGIN -- @jeUdrzba=0 SET @pocetVlastOper = ISNULL( (SELECT COUNT(ID) FROM dbo.TabPrPostup WHERE IDPrikaz=@idVPr AND IDOdchylkyDo IS NULL AND priorita=0 AND typ<2), 0) SELECT @dilec=IdTabKmen, @idZakazModif=IdZakazModif, @kusyZad=Kusy_zad, @planStart=Plan_zadani, @planKonec=Plan_Ukonceni FROM dbo.TabPrikaz WHERE ID=@idVPr SET @planStartPrikaz = @planStart SET @planKonecPrikaz = @planKonec IF (@planStartPrikaz0) AND (@doklProZapis IS NOT NULL) BEGIN SET @kaZaHod=0 IF (@mjEvid=N'ka') SET @kaZaHod = ROUND(@ksZaHod/@mnozKsVKA, 2) -- SET @planStart=NULL IF (COL_LENGTH('dbo.TabPrikaz_EXT', '_PlanZahajeni') IS NOT NULL) SET @planStart=(SELECT _PlanZahajeni FROM dbo.TabPrikaz_EXT WHERE ID=@idVPr) IF (@planStart IS NULL) BEGIN /* IF (@jeSql2022=1) SET @planStart=DATEADD(hour, 1, DATETRUNC(hour,GETDATE())) ELSE */ SET @planStart=DATEADD(hour, 1, CONVERT(datetime, FORMAT(@planStartPrikaz, 'dd.MM.yyyy HH', 'de-de') + N':00:00', 104)) SET @prepoctiPlanStart=1 END SET @prepoctiPlanStart=0 IF (@datumStart IS NOT NULL) SET @planStart = DATEADD(hour, @casOd, dbo.hf_TruncDate(@datumStart)) -- SET @planKonec=NULL IF (COL_LENGTH('dbo.TabPrikaz_EXT', '_PlanUkonceni') IS NOT NULL) SET @planKonec=(SELECT _PlanUkonceni FROM dbo.TabPrikaz_EXT WHERE ID=@idVPr) IF (@planKonec IS NULL) SET @planKonec=DATEADD(minute, 60.0 * ROUND(@mnozKs/@ksZaHod,2), @planStart) IF (@prepoctiPlanStart=1) /* BEGIN IF (@jeSql2022=1) SET @planKonec=DATEADD(second, -1, DATEADD(hour, 1, DATETRUNC(hour,@planKonec))) ELSE */ -- SET @planStart=DATEADD(hour, 1, CEILING(DATEDIFF(hour, 0, @planKonec)/60.0)*60) SET @planStart=DATEADD(hour, 1, CONVERT(datetime, FORMAT(@planKonec, 'dd.MM.yyyy HH', 'de-de') + N':00:00', 104)) -- END SET @pocetDavek = CEILING(@mnozKs/@ksZaHod) IF (@pocetDavek>0) BEGIN SET @cisloDavky = 1 -- pokud neni nektera davka daneho prikazu uzamcena, smaz je vsechny -- jinak nastav aby se planovani toho prikazu pri privnim pruchodu WHILE ukoncilo IF NOT EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDPrikaz=@idVPr AND IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1) DELETE FROM dbo.TabAdvKPDavky WHERE IDPrikaz=@idVPr AND IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj ELSE SET @cisloDavky=@pocetDavek WHILE (1=1) BEGIN IF (@cisloDavky>@pocetDavek) BREAK DELETE FROM @davky IF EXISTS (SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND CasOd>=@planStart AND Zamek=0) BEGIN ;WITH d AS ( SELECT ROW_NUMBER() OVER (ORDER BY CasOd) AS AutoInc, ID, CasOd, CasDo, Zamek FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND CasOd>=@planStart AND Zamek=0 ) INSERT @davky (ID, CasOd, CasDo, Zamek, PoradoveCislo) SELECT ID, CasOd, CasDo, Zamek, AutoInc FROM d; END SET @debugXml = (SELECT * FROM @davky FOR XML AUTO) -- begin: test data/casu zahajeni na kalendar stroje IF (@idKalendarStroje IS NULL) -- pokud kalendar nemam, per to tam BEGIN SET @cnt = 0 WHILE EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @planStart BETWEEN CasOd AND CasDo) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @planStart = DATEADD(hour, 1, @planStart) SET @cnt = @cnt + 1 END SET @planStartEnd = DATEADD(second, -1, DATEADD(hour, 1, @planStart)) END ELSE BEGIN -- pokud kalendar mam, zkontroluj jestli neni na dany datum/cas vyjimka SET @cnt = 0 WHILE (EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @planStart BETWEEN CasOd AND CasDo) OR EXISTS(SELECT 1 FROM dbo.TabPlanKalendPol WHERE IDStroje=@idStroj AND @planStart BETWEEN CasOd AND CasDo) ) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @planStart = DATEADD(hour, 1, @planStart) SET @cnt = @cnt + 1 END SET @planStartEnd = DATEADD(second, -1, DATEADD(hour, 1, @planStart)) END -- end: test data/casu zahajeni na kalendar stroje IF (@cisloDavky=@pocetDavek) BEGIN SET @ksZaHod = @mnozKs - ( @ksZaHod * (@cisloDavky-1)) SET @kaZaHod = ROUND(@ksZaHod/@mnozKsVKA, 2) END SET @mnoz = CASE @mjEvid WHEN N'ka' THEN @kaZaHod WHEN N'ks' THEN @ksZaHod END IF OBJECT_ID('dbo.ep_Vyroba_AdvPlan_ArchivujDavky', 'P') IS NOT NULL EXEC dbo.ep_Vyroba_AdvPlan_ArchivujDavky @IDAdvKapacPlan=@idAdvKPl SET @podm = N'IdAdvKapacPlan=' + CONVERT(nvarchar, @idAdvKPl) EXEC @locId=dbo.hp_NajdiPrvniVolny @Tabulka=N'TabAdvKPDavky', @Atribut=N'LocalID', @Where=@podm, @Odkud=1, @Kam=999999999, @Returnem=1 INSERT dbo.TabAdvKPDavky (IDAdvKapacPlan, LocalID, IDVypoctu, ZpusobVznikuDavkyKP, DatumPripadu, IDPrikaz, Dilec, DokladPrPostup, AltPrPostup, IDPrac, IDStroje, CasOd, CasDo, Mnozstvi, PrepravniCas, MeziOperCas, DeadTime, BlokaceZdroje, ProcSplneni, Mnozstvi_Zive) SELECT @idAdvKPl, @locId, @idVypoctu, 0, @planStart, @idVPr, @dilec, @doklProZapis, @altProZapis, @idPrac, @idStroj, @planStart, @planStartEnd, @mnoz, 0, 0, 0, 1, 0, @mnoz SET @idDavky = SCOPE_IDENTITY() IF (@idDavky IS NOT NULL) BEGIN IF NOT EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky_EXT WHERE ID=@idDavky) INSERT dbo.TabAdvKPDavky_EXT (ID) VALUES (@idDavky) UPDATE dbo.TabAdvKPDavky_EXT SET _VazbaPlgPlan=@idSadaDavek WHERE ID=@idDavky END IF NOT EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky_EXT WHERE ID=@idDavky) INSERT dbo.TabAdvKPDavky_EXT (ID) VALUES (@idDavky) UPDATE dbo.TabAdvKPDavky_EXT SET _MnozstviKs=CASE @mjEvid WHEN N'ka' THEN @ksZaHod WHEN N'ks' THEN @ksZaHod ELSE NULL END WHERE ID=@idDavky -- begin: posun nasledujicich davek DECLARE dav CURSOR LOCAL FOR SELECT ID, CasOd, PoradoveCislo FROM @davky OPEN dav WHILE (1=1) BEGIN FETCH NEXT FROM dav INTO @idDavkyOld, @startOdOld, @poradCislo IF (@@FETCH_STATUS<>0) BREAK IF (@poradCislo=1) SET @startOdOld = DATEADD(hour, 1, @planStart) ELSE SET @startOdOld = DATEADD(hour, 1, (SELECT CasOd FROM @davky WHERE PoradoveCislo=@poradCislo-1)) IF (@idKalendarStroje IS NULL) BEGIN SET @cnt = 0 WHILE EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @startOdOld BETWEEN CasOd AND CasDo) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @startOdOld = DATEADD(hour, 1, @startOdOld) SET @cnt = @cnt + 1 END END ELSE BEGIN SET @cnt = 0 WHILE (EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKPl AND IDStroje=@idStroj AND Zamek=1 AND @startOdOld BETWEEN CasOd AND CasDo) OR EXISTS(SELECT 1 FROM dbo.TabPlanKalendPol WHERE IDStroje=@idStroj AND @planStart BETWEEN CasOd AND CasDo) ) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @startOdOld = DATEADD(hour, 1, @startOdOld) SET @cnt = @cnt + 1 END END UPDATE @davky SET CasOd=@startOdOld, CasDo=DATEADD(second, -1, DATEADD(hour, 1, @startOdOld)) WHERE PoradoveCislo=@poradCislo UPDATE dbo.TabAdvKPDavky SET CasOd=@startOdOld, CasDo=DATEADD(second, -1, DATEADD(hour, 1, @startOdOld)) WHERE ID=@idDavkyOld END CLOSE dav DEALLOCATE dav -- end: posun nasledujicich davek SET @planStart = DATEADD(hour, 1, @planStart) SET @cisloDavky = @cisloDavky + 1 END END END -- @ksZaHod<>0 END -- @jeUdrzba=0 END CLOSE c DEALLOCATE c IF (@tranPred=0) AND (@@TRANCOUNT>0) COMMIT TRAN END TRY BEGIN CATCH IF (@tranPred=0) AND (@@TRANCOUNT>0) ROLLBACK TRAN SET @errMsg = ERROR_MESSAGE() END CATCH