· 7 years ago · Feb 14, 2019, 02:36 PM
1USE [PRICUANGO]
2GO
3/****** Object: StoredProcedure [dbo].[CSA_RECALC_STK_COM_AVISOS] Script Date: 14/02/2019 15:29:44 ******/
4SET ANSI_NULLS ON
5GO
6SET QUOTED_IDENTIFIER ON
7GO
8
9ALTER PROCEDURE [dbo].[CSA_RECALC_STK_COM_AVISOS] @dataProcessamento as date=null
10AS
11DECLARE @data AS DATE
12SET @data = ISNULL(@dataProcessamento,GETDATE())
13
14DECLARE @temptable TABLE ( Lixo nvarchar(max) )
15INSERT INTO @temptable
16EXEC GCP_CST_RecalculoStocks
17@ArtigoInicial='',
18@ArtigoFinal='',
19@ArmazemInicial=N'',
20@ArmazemFinal=N'',
21@ArtNecRecalcPCM=0,
22@RecalcQtdReservada=1,
23@ExecPCMDocs=1,
24@NPartes=0,
25@Posto=N'00',
26@Data=@data
27update t1 set Activo=0 from ArtigoLote t1 inner join (select DISTINCT Artigo, Lote from ##RecalculoStk where Posto='00' AND Lote<>'<L01>' group by Artigo, Lote HAVING SUM(QuantidadeArm)=0) t2 on t1.Artigo=t2.Artigo AND t1.Lote=t2.Lote
28update t1 set Activo=1 from ArtigoLote t1 inner join (select DISTINCT Artigo, Lote from ##RecalculoStk where Posto='00' AND Lote<>'<L01>' group by Artigo, Lote HAVING SUM(QuantidadeArm)>0) t2 on t1.Artigo=t2.Artigo AND t1.Lote=t2.Lote
29--Actualização de tipos de artigo
30--actualiza artigos que não tenham tipo preenchido
31update Artigo SET CDU_Tipo='OOR', CDU_Classificacao='C', CDU_DiasSTKmin=0, CDU_DiasSTKReposicao=0, CDU_DiasSTKMax=0 WHERE CDU_Tipo='' OR CDU_Tipo IS NULL
32AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
33--se é do tipo stock mas deixou de ter movimentos no ultimo ano
34update Artigo SET CDU_Tipo='OOR', STKMaximo=0, STKMinimo=0, STKReposicao=0,
35CDU_DiasSTKmin=0, CDU_DiasSTKReposicao=0, CDU_DiasSTKMax=0, CDU_Classificacao='C'
36WHERE CDU_Tipo='STK' AND Artigo NOT IN (
37select distinct artigo from linhasstk where EntradaSaida='S' and modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
38) AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
39if NOT exists (select * from sys.objects where name = 'TDU_ParamsStockFam' and type = 'u')
40CREATE TABLE TDU_ParamsStockFam (
41CDU_Familia nvarchar(10) NOT NULL,
42CDU_DiasSTKmin Integer NOT NULL,
43CDU_DiasSTKReposicao Integer NOT NULL,
44CDU_DiasSTKMax Integer NOT NULL
45)
46--se é do tipo OOR mas teve um movimento de stock
47--update Artigo SET CDU_Tipo='STK', CDU_Classificacao='B', CDU_DiasSTKmin=31, CDU_DiasSTKReposicao=183, CDU_DiasSTKMax=244 WHERE CDU_Tipo='OOR' AND Artigo IN (
48--select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
49--) AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
50if NOT exists (select * from sys.objects where name = 'TDU_ParamsStockFam' and type = 'u')
51BEGIN
52CREATE TABLE [dbo].[TDU_ParamsStockFam](
53 [CDU_Familia] [nvarchar](10) NOT NULL,
54 [CDU_DiasSTKmin] [int] NOT NULL,
55 [CDU_DiasSTKReposicao] [int] NOT NULL,
56 [CDU_DiasSTKMax] [int] NOT NULL,
57 CONSTRAINT [PK_TDU_ParamsStockFam] PRIMARY KEY CLUSTERED
58(
59 [CDU_Familia] ASC
60)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
61) ON [PRIMARY]
62insert into StdTabelasVar (Tabela, Apl) VALUES ('TDU_ParamsStockFam', 'ERP')
63END
64DECLARE @ContagemRegistos INT
65SELECT @ContagemRegistos=COUNT(*) FROM Familias WHERE Familia NOT IN (select CDU_Familia from TDU_ParamsStockFam)
66IF @ContagemRegistos>0
67BEGIN
68INSERT INTO TDU_ParamsStockFam (CDU_Familia, CDU_DiasSTKmin, CDU_DiasSTKReposicao, CDU_DiasSTKMax)
69SELECT Familia AS CDU_Familia, 31 AS CDU_DiasSTKmin, 183 AS CDU_DiasSTKReposicao, 244 AS CDU_DiasSTKMax FROM Familias WHERE Familia NOT IN (select CDU_Familia from TDU_ParamsStockFam)
70END
71UPDATE Artigo SET
72Artigo.CDU_Tipo='STK',
73Artigo.CDU_Classificacao='B',
74Artigo.CDU_DiasSTKmin=TDU_ParamsStockFam.CDU_DiasSTKmin,
75Artigo.CDU_DiasSTKReposicao=TDU_ParamsStockFam.CDU_DiasSTKReposicao,
76Artigo.CDU_DiasSTKMax=TDU_ParamsStockFam.CDU_DiasSTKMax
77FROM Artigo INNER JOIN TDU_ParamsStockFam ON Artigo.Familia=TDU_ParamsStockFam.CDU_Familia WHERE Artigo.CDU_Tipo='OOR' AND Artigo.Artigo IN (
78select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
79) AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
80--se tem movimentos no ultimo ano então é do tipo stock
81update Artigo SET CDU_Tipo='STK' WHERE Artigo IN (
82select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
83) AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
84--se não tem movimentos no ultimo ano então é do tipo OOR - on order request
85update Artigo SET CDU_Tipo='OOR', STKMaximo=0, STKMinimo=0, STKReposicao=0,
86CDU_DiasSTKmin=0, CDU_DiasSTKReposicao=0, CDU_DiasSTKMax=0, CDU_Classificacao='C'
87WHERE Artigo NOT IN (
88select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
89) AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
90DECLARE @tempArtigoAD TABLE (Artigo nvarchar(50), AnualDemand real)
91INSERT INTO @tempArtigoAD
92SELECT
93LinhasSTK.Artigo,
94dbo.CSA_Devolve_ValorArredondado(SUM(linhasstk.Quantidade*dbo.CSA_Devolve_FactorConversao(linhasstk.Unidade, linhasstk.Artigo))) AS AnualDemand
95FROM linhasstk
96INNER JOIN Artigo ON LinhasSTK.Artigo=Artigo.Artigo
97WHERE EntradaSaida='S' AND Modulo='C' AND linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
98AND Artigo.CDU_Tipo='STK'
99GROUP BY LinhasSTK.Artigo
100DECLARE @numDias as integer
101SET @numDias = DATEDIFF(DD,DATEADD(YY,-1,getdate()), getdate() )
102--actualiza as fichas dos artigos que foram recalculados, stock minimo, maximo e de reposição, arredondado ás unidades
103UPDATE Artigo SET STKMinimo=dbo.CSA_Devolve_ValorArredondado_PorDefeito(ArtigoAD.AnualDemand/@numDias * Artigo.CDU_DiasSTKmin,1),
104 STKMaximo=dbo.CSA_Devolve_ValorArredondado_PorDefeito(ArtigoAD.AnualDemand/@numDias * Artigo.CDU_DiasSTKMax,1),
105 STKReposicao=dbo.CSA_Devolve_ValorArredondado_PorDefeito(ArtigoAD.AnualDemand/@numDias * Artigo.CDU_DiasSTKReposicao,1)
106FROM Artigo INNER JOIN @tempArtigoAD ArtigoAD ON Artigo.Artigo=ArtigoAD.Artigo
107WHERE Artigo.CDU_Tipo='STK' AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
108update Artigo SET CDU_Tipo='STK', STKMaximo=1 WHERE Artigo IN (
109select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
110) AND STKMaximo=0 AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
111update Artigo SET CDU_Tipo='STK', STKMinimo=1 WHERE Artigo IN (
112select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
113) AND STKMinimo=0 AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
114update Artigo SET CDU_Tipo='STK', STKReposicao=1 WHERE Artigo IN (
115select distinct artigo from linhasstk where EntradaSaida='S' and Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
116) AND STKReposicao=0 AND Artigo.Artigo NOT IN (select Artigo from Artigo where cdu_preventrecalc=1)
117DECLARE @tmpTable AS TABLE (Artigo nvarchar(50), Descricao nvarchar(150), AnualDemand real, STKSeguranca real, STKReposicao real, STKMaximo real, STKActual real, QuantidadeEconomica real, QuantidadeOnOrderSTK real, QuantidadeOnOrderReserved real, QuantidadeProposta real, PMU real, NrRequests real)
118INSERT INTO @tmpTable
119select LinhasSTK.Artigo,
120dbo.CSA_Devolve_ArtigoDescricao(LinhasSTK.Artigo) AS Descricao,
121dbo.CSA_Devolve_ValorArredondado(SUM(linhasstk.Quantidade*dbo.CSA_Devolve_FactorConversao(linhasstk.Unidade, linhasstk.Artigo))) AS AnualDemand,
122dbo.CSA_Devolve_ValorArredondado_PorDefeito(dbo.CSA_Devolve_STKSeguranca(LinhasSTK.Artigo),1) AS STKSeguranca,
123dbo.CSA_Devolve_ValorArredondado_PorDefeito(dbo.CSA_Devolve_STKReposicao(LinhasSTK.Artigo),1) AS STKReposicao,
124dbo.CSA_Devolve_ValorArredondado_PorDefeito(dbo.CSA_Devolve_STKMaximo(LinhasSTK.Artigo),1) AS STKMaximo,
125dbo.CSA_Devolve_STKActual(LinhasSTK.Artigo) AS STKActual,
126dbo.CSA_Devolve_ValorArredondado(dbo.CSA_Devolve_QntEconomica(LinhasSTK.Artigo)) AS QuantidadeEconomica,
127dbo.CSA_Devolve_Artigo_OO_Normais(LinhasSTK.Artigo) AS QuantidadeOnOrderSTK,
128dbo.CSA_Devolve_Artigo_OO_Reservas(LinhasSTK.Artigo) AS QuantidadeOnOrderReservada,
129dbo.CSA_Devolve_Qnt_A_COMPRAR(LinhasSTK.Artigo) AS QuantidadeProposta,
130dbo.CSA_Devolve_Artigo_PMU(LinhasSTK.Artigo) AS PMU,
131dbo.CSA_Devolve_Artigo_NrRequests(LinhasSTK.Artigo) AS NrRequests
132from linhasstk
133INNER JOIN Artigo ON LinhasSTK.Artigo=Artigo.Artigo
134where EntradaSaida='S' AND Modulo='C' and linhasstk.Data BETWEEN DATEADD(YY,-1,getdate()) AND getdate()
135AND Artigo.CDU_Tipo='STK'
136GROUP BY LinhasSTK.Artigo
137DECLARE @TranName VARCHAR(20);
138SELECT @TranName = 'TRANS1';
139BEGIN TRANSACTION @TranName;
140BEGIN TRY
141if exists (select * from sys.objects where name = 'tmpAvisos' and type = 'u')
142 drop table tmpAvisos
143SELECT * INTO tmpAvisos FROM @tmpTable
144COMMIT TRANSACTION @TranName;
145END TRY
146BEGIN CATCH
147 ROLLBACK transaction @TranName;
148END CATCH