| ♥ 0 | É comum acontecer ao abrir uma ficha de imobilizado o seguinte erro: “547: The INSERT statement conflicted with the FOREIGN KEY constraint “FichasCriteriosDepreciacao_PlanosCriteriosDepreciacao_FK”. The conflict occurred in database “PRIXXXXXX”, table “dbo.PlanosCriteriosDepreciacao”. 3621: The statement has been terminated.”
Como ultrapassar? Marked as spam |
| Private answer O módulo de EAP necessita que existam definidos todos os exercícios entre o primeiro e o último. Pelo erro reportado podem faltar alguns exercícios. Segue uma script para introduzir os exercícios em falta e reconstruir os dados básicos de EAP para os "novos" exercícios.
-- Insere as Fichas em falta na tabela NovosEquipamentos ------------------------------------------------------------------------------- INSERT INTO NodosEquipamentos SELECT newid(), NULL, '99C0DA87-5FC8-4842-B660-F87143821583', Ficha FROM Fichas WHERE Ficha NOT IN (SELECT Equipamento FROM NodosEquipamentos) GO
------------------------------------------------------------------------------- -- ExerciciosERP vs ParametrosExercicioEAP ------------------------------------------------------------------------------- SELECT * FROM ExerciciosERP SELECT * FROM ParametrosExercicioEAP GO
------------------------------------------------------------------------------- -- Reconstrução dos Exercícios ERP ------------------------------------------------------------------------------- DECLARE @Ano SMALLINT DECLARE @AnoUltimo SMALLINT
SET @Ano = (SELECT MIN(Ano) FROM ExerciciosERP) SET @AnoUltimo = (SELECT MAX(Ano) FROM ExerciciosERP)
DECLARE @tblExercicios TABLE ( Ano SMALLINT , AnoOrigem SMALLINT )
WHILE @Ano < @AnoUltimo BEGIN INSERT INTO @tblExercicios SELECT @Ano, NULL WHERE NOT EXISTS (SELECT Ano FROM ExerciciosERP WHERE Ano = @Ano) SET @Ano = @Ano + 1 END
INSERT INTO ExerciciosERP SELECT * FROM @tblExercicios GO
------------------------------------------------------------------------------- -- Reconstrução Parâmetros Exercício EAP ------------------------------------------------------------------------------- SELECT E.Ano, PE.* INTO #TMP_EXERCICIOS_EAP FROM ExerciciosERP E CROSS JOIN (SELECT TOP 1 * FROM ParametrosExercicioEAP ORDER BY Exercicio DESC) PE WHERE NOT EXISTS (SELECT TOP 1 1 FROM ParametrosExercicioEAP WHERE Exercicio = E.Ano) GO UPDATE #TMP_EXERCICIOS_EAP SET Exercicio = Ano, Fecho = 1 GO ALTER TABLE #TMP_EXERCICIOS_EAP DROP COLUMN Ano GO INSERT INTO ParametrosExercicioEAP SELECT * FROM #TMP_EXERCICIOS_EAP GO DROP TABLE #TMP_EXERCICIOS_EAP GO
------------------------------------------------------------------------------- -- Reconstrução Dados de Depreciação ------------------------------------------------------------------------------- INSERT INTO PlanosCriteriosDepreciacao ( Plano , Exercicio , UnitarioReduzidoValor , TotalReduzidoValor , CoeficienteReduzidoValor , Periodicidade , Metodo , TaxaBase , VariacaoTaxaDepreciacao , NumeroTurnos , NormaExcepcao , ExcluirTaxasPerdidas , TratamentoIndividual ) SELECT Plano = P.Plano , Exercicio = (SELECT Exercicio FROM ParametrosEAP) , UnitarioReduzidoValor = 199.52 , TotalReduzidoValor = 0 , CoeficienteReduzidoValor = 0 , Periodicidade = 1 , Metodo = 0 , TaxaBase = (CASE P.Tipo WHEN 1 THEN 0 ELSE 2 END) , VariacaoTaxaDepreciacao = 0 , NumeroTurnos = 1 , NormaExcepcao = NULL , ExcluirTaxasPerdidas = 0 , TratamentoIndividual = 0 FROM (SELECT Plano, Tipo FROM PlanosDepreciacao) P WHERE NOT EXISTS (SELECT TOP 1 1 FROM PlanosCriteriosDepreciacao WHERE Plano = P.Plano) GO
INSERT INTO PlanosCriteriosDepreciacao ( Plano , Exercicio , UnitarioReduzidoValor , TotalReduzidoValor , CoeficienteReduzidoValor , Periodicidade , Metodo , TaxaBase , VariacaoTaxaDepreciacao , NumeroTurnos , NormaExcepcao , ExcluirTaxasPerdidas , TratamentoIndividual ) SELECT Plano = PE.Plano , Exercicio = P.Exercicio , UnitarioReduzidoValor = PE.UnitarioReduzidoValor , TotalReduzidoValor = PE.TotalReduzidoValor , CoeficienteReduzidoValor = PE.CoeficienteReduzidoValor , Periodicidade = PE.Periodicidade , Metodo = PE.Metodo , TaxaBase = PE.TaxaBase , VariacaoTaxaDepreciacao = PE.VariacaoTaxaDepreciacao , NumeroTurnos = PE.NumeroTurnos , NormaExcepcao = PE.NormaExcepcao , ExcluirTaxasPerdidas = PE.ExcluirTaxasPerdidas , TratamentoIndividual = PE.TratamentoIndividual FROM PlanosCriteriosDepreciacao PE CROSS JOIN ParametrosExercicioEAP P WHERE PE.Exercicio = ( SELECT MAX(Exercicio) FROM PlanosCriteriosDepreciacao WHERE Plano = PE.Plano ) AND P.Exercicio NOT IN ( SELECT DISTINCT Exercicio FROM PlanosCriteriosDepreciacao WHERE Plano = PE.Plano ) GO
INSERT INTO ClassificacoesCriteriosDepreciacao ( IdClassificacao , Plano , Exercicio , Periodicidade , Metodo , TaxaBase , VariacaoTaxaDepreciacao , NumeroTurnos , Imobilizado , Conta , NormaExcepcao , Ajuste , Beneficio , Tributacao , SujeitoDepreciacao , TratamentoIndividual ) SELECT IdClassificacao = CE.IdClassificacao , Plano = CE.Plano , Exercicio = P.Exercicio , Periodicidade = CE.Periodicidade , Metodo = CE.Metodo , TaxaBase = CE.TaxaBase , VariacaoTaxaDepreciacao = CE.VariacaoTaxaDepreciacao , NumeroTurnos = CE.NumeroTurnos , Imobilizado = CE.Imobilizado , Conta = CE.Conta , NormaExcepcao = CE.NormaExcepcao , Ajuste = CE.Ajuste , Beneficio = CE.Beneficio , Tributacao = CE.Tributacao , SujeitoDepreciacao = CE.SujeitoDepreciacao , TratamentoIndividual = CE.TratamentoIndividual FROM ClassificacoesCriteriosDepreciacao CE CROSS JOIN ParametrosExercicioEAP P WHERE CE.Exercicio = ( SELECT MAX(Exercicio) FROM ClassificacoesCriteriosDepreciacao WHERE Plano = CE.Plano AND IdClassificacao = CE.IdClassificacao ) AND P.Exercicio NOT IN ( SELECT DISTINCT Exercicio FROM ClassificacoesCriteriosDepreciacao WHERE Plano = CE.Plano AND IdClassificacao = CE.IdClassificacao ) GO INSERT INTO ClassificacoesCriteriosDepreciacao ( IdClassificacao , Plano , Exercicio , Periodicidade , Metodo , TaxaBase , VariacaoTaxaDepreciacao , NumeroTurnos , Imobilizado , Conta , NormaExcepcao , Ajuste , Beneficio , Tributacao , SujeitoDepreciacao , TratamentoIndividual ) SELECT IdClassificacao = CF.IdClassificacao , Plano = PD.Plano , Exercicio = PE.Exercicio , Periodicidade = 1 , Metodo = 0 , TaxaBase = (CASE PD.Tipo WHEN 1 THEN 0 ELSE 2 END) , VariacaoTaxaDepreciacao = 0 , NumeroTurnos = 1 , Imobilizado = NULL , Conta = NULL , NormaExcepcao = NULL , Ajuste = NULL , Beneficio = NULL , Tributacao = NULL , SujeitoDepreciacao = 1 , TratamentoIndividual = 0 FROM (SELECT IdClassificacao, TaxaFiscal FROM ClassificacoesFiscais) CF CROSS JOIN (SELECT Plano, Tipo FROM PlanosDepreciacao) PD CROSS JOIN (SELECT Exercicio FROM ParametrosExercicioEAP) PE WHERE NOT EXISTS ( SELECT TOP 1 1 FROM ClassificacoesCriteriosDepreciacao WHERE IdClassificacao = CF.IdClassificacao AND Plano = PD.Plano AND Exercicio = PE.Exercicio ) GO
DELETE FROM ClassificacoesCriteriosDepreciacao GO
INSERT INTO ClassificacoesCriteriosDepreciacao ( IdClassificacao , Plano , Exercicio , Periodicidade , Metodo , TaxaBase , VariacaoTaxaDepreciacao , NumeroTurnos , Imobilizado , Conta , NormaExcepcao , Ajuste , Beneficio , Tributacao , SujeitoDepreciacao , TratamentoIndividual , TaxaDepreciacao , VidaUtil ) SELECT IdClassificacao = CF.IdClassificacao , Plano = PD.Plano , Exercicio = PE.Exercicio , Periodicidade = 1 , Metodo = 0 , TaxaBase = (CASE WHEN PD.Tipo = 1 THEN 0 ELSE 2 END) , VariacaoTaxaDepreciacao = 0 , NumeroTurnos = 1 , Imobilizado = NULL , Conta = NULL , NormaExcepcao = NULL , Ajuste = NULL , Beneficio = NULL , Tributacao = NULL , SujeitoDepreciacao = 1 , TratamentoIndividual = 0 , TaxaDepreciacao = (CASE WHEN PD.Tipo = 0 THEN 0 ELSE CF.TaxaFiscal END) , VidaUtil = (CASE WHEN PD.Tipo = 1 THEN 0 ELSE ROUND(CF.VidaMaxima / 2.0, 0) END) FROM (SELECT IdClassificacao, TaxaFiscal, VidaMaxima FROM ClassificacoesFiscais) CF CROSS JOIN (SELECT Plano, Tipo FROM PlanosDepreciacao) PD CROSS JOIN (SELECT Exercicio FROM ParametrosExercicioEAP) PE WHERE NOT EXISTS ( SELECT TOP 1 1 FROM ClassificacoesCriteriosDepreciacao WHERE IdClassificacao = CF.IdClassificacao AND Plano = PD.Plano AND Exercicio = PE.Exercicio ) GO
UPDATE FCD SET TaxaBase = (CASE WHEN PD.Tipo = 0 THEN 2 ELSE FCD.TaxaBase END) , TaxaDepreciacao = (CASE WHEN PD.Tipo = 0 THEN 0 ELSE (CASE FCD.TaxaBase WHEN 0 THEN CF.TaxaFiscal WHEN 1 THEN ROUND(CF.TaxaFiscal / 2.0, 2) ELSE FCD.TaxaDepreciacao END) END) , VidaUtil = (CASE WHEN PD.Tipo = 1 THEN 0 ELSE ROUND(CF.VidaMaxima / 2.0, 0) END) , SujeitoDepreciacao = 1 FROM Fichas F INNER JOIN FichasCriteriosDepreciacao FCD ON FCD.Ficha = F.Ficha INNER JOIN ClassificacoesFiscais CF ON CF.IdClassificacao = F.IdClassificacao INNER JOIN PlanosDepreciacao PD ON PD.Plano = FCD.Plano GO
UPDATE FichasCriteriosDepreciacao SET VidaRemanescente = VidaUtil WHERE VidaUtil <> 0 GO
-- Actualiza a Vida Remanescente DECLARE @Plano AS NVARCHAR(25) DECLARE @IndicePlano AS INT DECLARE @TotalPlanos AS INT
DECLARE @tblPLANOS TABLE ( Indice INT IDENTITY(1,1) , Plano NVARCHAR(25) )
INSERT INTO @tblPLANOS (Plano) SELECT Plano FROM PlanosDepreciacao WHERE Tipo = 0
SET @IndicePlano = 1 SET @TotalPlanos = (SELECT COUNT(1) FROM @tblPLANOS)
WHILE (@IndicePlano <= @TotalPlanos) BEGIN
SELECT @Plano = Plano FROM @tblPLANOS WHERE Indice = @IndicePlano
EXEC dbo.[EAP_ReconstroiFichaCriterioVidaRemanescente] @Plano, 0, 0, 1
SET @IndicePlano = @IndicePlano + 1
END GO
INSERT INTO AlteracoesPatrimoniaisNumeradores SELECT AP.Tipo, AP.Alteracao, PE.Exercicio, 0 FROM AlteracoesPatrimoniais AP CROSS JOIN ParametrosExercicioEAP PE WHERE NOT EXISTS (SELECT 1 FROM AlteracoesPatrimoniaisNumeradores apn WHERE apn.Tipo = AP.Tipo AND apn.Alteracao = AP.Alteracao AND apn.Exercicio = PE.Exercicio) ORDER BY AP.Tipo, AP.Alteracao, PE.Exercicio DESC GO Marked as spam |