-- dbo.ep_Vyroba_ZrusZakazkuPlanuDleFinPrikazu CREATE PROCEDURE dbo.ep_Vyroba_ZrusZakazkuPlanuDleFinPrikazu @idAdvKP INT=NULL, @idVPrFin INT=NULL, @idStroj INT=NULL, @jeUdrzba BIT=0, @idSadaDavek INT=NULL, @errorMsg NVARCHAR(500)=N'' OUT AS -- HD Consulting Strakonice, T. Buzin -- !! proceduru neupravujte, bude stejne pregenerovana pri startu pluginu pro planovani SET NOCOUNT ON IF (@idAdvKP IS NULL) BEGIN SET @errorMsg = N'Neni speficikovan kapacitni plan' RETURN END IF (@idStroj IS NULL) BEGIN SET @errorMsg = N'Neni specifikovan stroj' RETURN END DECLARE @tranPred INT, @cnt INT, @iTemp INT, @xml XML, @retVal INT, @idVPr INT, @idPlan INT, @minCasDo DATETIME=NULL, @maxCasDo DATETIME=NULL, @idDavka INT, @casOd DATETIME, @casOdNew DATETIME, @casDo DATETIME, @idKalendarStroje INT DECLARE @davkyZa TABLE (ID INT, IDPrikaz INT, Mnozstvi NUMERIC(19,6), CasOd DATETIME, CasDo DATETIME) DECLARE @sadaDavek TABLE (ID INT NOT NULL) SET @idKalendarStroje = (SELECT IDPlanKalend FROM dbo.TabCisStroju WHERE ID=@idStroj) SET @maxCasDo = CONVERT(datetime, N'1.1.2020', 104) SET @maxCasDo = @minCasDo -- CONVERT(datetime, N'1.1.2020', 104) DELETE FROM @sadaDavek IF (@idSadaDavek IS NOT NULL) INSERT @sadaDavek (ID) SELECT ID FROM dbo.TabAdvKPDavky_EXT WHERE _VazbaPlgPlan=@idSadaDavek BEGIN TRY SET @tranPred=@@TRANCOUNT IF( @tranPred=0) BEGIN TRAN DECLARE vp CURSOR LOCAL FOR SELECT ID, IDPlan FROM dbo.TabPrikaz WHERE IDPrikazRidici=@idVPrFin AND StavPrikazu<40 ORDER BY UrovenVnoreni DESC OPEN vp WHILE (1=1) BEGIN FETCH NEXT FROM vp INTO @idVPr, @idPlan IF (@@FETCH_STATUS<>0) BREAK IF EXISTS(SELECT 1 FROM dbo.TabAdvKPDavky WHERE Zamek=1 AND IDAdvKapacPlan=@idAdvKP AND IDPrikaz=@idVPr AND IDStroje=@idStroj) CONTINUE IF EXISTS(SELECT ID FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKP AND IDPrikaz=@idVPr AND IDStroje=@idStroj AND CasDo>@maxCasDo) SET @maxCasDo = (SELECT MAX(CasDo) FROM dbo.TabAdvKPDavky WHERE Zamek=0 AND IDAdvKapacPlan=@idAdvKP AND IDPrikaz=@idVPr AND IDStroje=@idStroj AND CasDo>@maxCasDo) -- zkontroluje zda je neco z prikazu uz odvedeno a pripadne smaze vsechny vazby (kusovnik, operace, VC, naradi, OPN, davky advKP, kalk/plan naklady...) EXEC @retVal = dbo.hp_TabPrikaz_TriggerBeforeDelete @ID=@idVPr, @PouzeTestPredZrusenimStavuZadano=0 IF (@@ERROR=0) AND (@retVal=0) DELETE FROM dbo.TabPrikaz WHERE ID=@idVPr -- EXEC @retVal=dbo.hp_TabPlan_TriggerBeforeDelete @ID=@idPlan -- IF (@@ERROR=0) AND (@retVal=0) -- IF NOT EXISTS (SELECT 1 FROM dbo.TabPrikaz WHERE IDPlan=@idPlan) -- DELETE FROM dbo.TabPlan WHERE ID=@idPlan END CLOSE vp DEALLOCATE vp SET @minCasDo = DATEADD(hour, 1, DATEADD(hour, DATEDIFF(hour, 0, @minCasDo), 0)) -- SET @maxCasDo = @minCasDo -- CONVERT(datetime, N'1.1.2020', 104) IF EXISTS (SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKP AND IDStroje=@idStroj AND CasDo<@maxCasDo) BEGIN SELECT @minCasDo=MAX(CasDo) FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKP AND IDStroje=@idStroj AND CasDo<@maxCasDo SET @casOdNew = DATEADD(second, 1, @minCasDo) END IF EXISTS (SELECT 1 FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKP AND IDPrikaz=@idVPrFin AND IDStroje=@idStroj AND CasDo>@maxCasDo) SET @maxCasDo = (SELECT MAX(CasDo) FROM dbo.TabAdvKPDavky WHERE IDAdvKapacPlan=@idAdvKP AND IDPrikaz=@idVPrFin AND IDStroje=@idStroj AND CasDo>@maxCasDo) SELECT @idPlan=IDPlan FROM dbo.TabPrikaz WHERE ID=@idVPrFin -- zkontroluje zda je neco z prikazu uz odvedeno a pripadne smaze vsechny vazby (kusovnik, operace, VC, naradi, OPN, davky advKP, kalk/plan naklady...) EXEC @retVal = dbo.hp_TabPrikaz_TriggerBeforeDelete @ID=@idVPrFin, @PouzeTestPredZrusenimStavuZadano=0 DELETE FROM dbo.TabPrikaz WHERE ID=@idVPrFin EXEC @retVal=dbo.hp_TabPlan_TriggerBeforeDelete @ID=@idPlan IF (@@ERROR=0) AND (@retVal=0) DELETE FROM dbo.TabPlan WHERE ID=@idPlan -- nasledujici neblokovane davky INSERT @davkyZa (ID, CasOd, CasDo) SELECT ID, CasOd, CasDo FROM dbo.TabAdvKPDavky WHERE Zamek=0 AND IDAdvKapacPlan=@idAdvKP AND IDStroje=@idStroj AND CasOd>@maxCasDo SET @xml=(SELECT * FROM @davkyZa FOR XML AUTO) -- presun je dopredu, na konec predchozi prace na tom samem stroji, pokud ma stroj kalendar, koukej i na nej DECLARE dav CURSOR LOCAL FOR SELECT ID, CasOd, CasDo FROM @davkyZa ORDER BY CasOd OPEN dav WHILE (1=1) BEGIN FETCH NEXT FROM dav INTO @idDavka, @casOd, @casDo IF (@@FETCH_STATUS<>0) BREAK SET @casOd = @casOdNew -- 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=@idAdvKP AND IDStroje=@idStroj AND Zamek=1 AND @casOd BETWEEN CasOd AND CasDo) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @casOd = DATEADD(hour, 1, @casOd) SET @cnt = @cnt + 1 END SET @casDo = DATEADD(second, -1, DATEADD(hour, 1, @casOd)) 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=@idAdvKP AND IDStroje=@idStroj AND Zamek=1 AND @casOd BETWEEN CasOd AND CasDo) OR EXISTS(SELECT 1 FROM dbo.TabPlanKalendPol WHERE IDStroje=@idStroj AND @casOd BETWEEN CasOd AND CasDo) ) AND (@cnt<=3000) -- kvuli zamrznuti BEGIN SET @casOd = DATEADD(hour, 1, @casOd) SET @cnt = @cnt + 1 END SET @casDo = DATEADD(second, -1, DATEADD(hour, 1, @casOd)) END -- end: test data/casu zahajeni na kalendar stroje UPDATE dbo.TabAdvKPDavky SET CasOd=@casOd, CasDo=@casDo WHERE ID=@idDavka END CLOSE dav DEALLOCATE dav IF (@tranPred=0) AND (@@TRANCOUNT>0) COMMIT TRAN END TRY BEGIN CATCH IF (@tranPred=0) AND (@@TRANCOUNT>0) ROLLBACK TRAN SET @errorMsg = ERROR_MESSAGE() IF (CURSOR_STATUS('local','dav')>=-1) BEGIN CLOSE dav DEALLOCATE dav END IF (CURSOR_STATUS('local','vp')>=-1) BEGIN CLOSE vp DEALLOCATE vp END END CATCH