Forum
See question

Inconsistências de stocks em artigos com tratamentos de lotes   

5 views
0
0

Existem vários artigos em que o stock está errado, trata-se de artigos com tratamentos de lote.

Faça login para poder traduzir
Inventário
Primavera
Marked as spam
Criado há 3 anos e 5 meses maria
maria Most Valuable Professional
2 answers
0
Private answer

Validar se existem artigos com tratamento de lotes sem lote associado:

EXEC STD_DropTempTable '#tmpArtigo'

GO

EXEC STD_DropTempTable '#tmpINV_ValoresActuaisStock'

GO

EXEC STD_DropTempTable '#tmpArtigo'

GO

SELECT * INTO #tmpArtigo FROM Artigo

--WHERE Artigo = '94201'

SELECT Id= NEWID(), A.* INTO #tmpINV_ValoresActuaisStock

FROM

(

SELECT DISTINCT m.Artigo, Armazem, Localizacao, Lote, EstadoStock, DataStock = CONVERT(datetime,NULL),IdMovimentoStock = CONVERT(uniqueidentifier,NULL),Stock = CONVERT(DECIMAL(28,10),0)

FROM INV_Movimentos m INNER JOIN #tmpArtigo tmp ON tmp.Artigo = m.Artigo

) A

UPDATE stk

SET stk.DataStock = mov.Data

, stk.IdMovimentoStock = mov.Id

, Stock = CASE WHEN ISNULL(mov.Armazem, '') = '' AND ISNULL(mov.Localizacao, '') = ''

THEN ISNULL(mov.StockLoc_Actual, 0)

ELSE

CASE WHEN ISNULL(mov.Localizacao, '') <> ''

THEN

CASE WHEN mov.Lote = '<L01>'

THEN mov.StockLoc_Actual

ELSE mov.StockLocLot_Actual

END

ELSE

CASE WHEN ISNULL(mov.Armazem, '') <> ''

THEN

CASE WHEN tmp.TratamentoLotes = 0 THEN mov.StockArm_Actual

ELSE mov.StockArmLot_Actual

END

END

END

END

FROM #tmpINV_ValoresActuaisStock stk WITH (NOLOCK)

INNER JOIN #tmpArtigo tmp on tmp.Artigo = stk.Artigo

OUTER APPLY (

SELECT TOP 1 mv.*

FROM INV_Movimentos mv WITH(READPAST)

WHERE stk.Artigo = mv.Artigo

AND ISNULL(stk.Armazem, '') = ISNULL(mv.Armazem, '')

AND ISNULL(stk.Localizacao, '') = ISNULL(mv.Localizacao, '')

AND ISNULL(stk.Lote, '') = ISNULL(mv.Lote, '')

AND ISNULL(stk.EstadoStock, '') = ISNULL(mv.EstadoStock, '')

ORDER BY [Data] DESC, [NumRegisto] DESC

) mov

 

--- Artigos com tratamento de lotes e com stock em <L01>

SELECT tmp.*

FROM #tmpINV_ValoresActuaisStock tmp

CROSS APPLY

(

SELECT TOP 1 TmpCross.Artigo FROM #tmpINV_ValoresActuaisStock TmpCross

INNER JOIN #tmpArtigo tmpArt on tmpArt.Artigo = TmpCross.Artigo

WHERE tmpArt.TratamentoLotes = 1 AND (TmpCross.Lote = '<L01>' AND TmpCross.Stock<>0)

AND TmpCross.Artigo = tmp.Artigo

) A

WHERE tmp.Lote ='<L01>'

Order by tmp.Artigo, tmp.Armazem, tmp.Lote

 

Para corrigir o problema exposto executar o seguinte comando SQL:

3 - Lotes <L01>

Artigos com Lotes <L01> no meio de registos com lote

*/

begin tran

EXEC STD_DropTempTable '#TempDocsInserir'

GO

EXEC STD_DropTempTable '#tmpArtigo'

GO

EXEC STD_DropTempTable '#tmpArtigoCalc'

GO

EXEC STD_DropTempTable '#tmpLinhasInternos'

GO

EXEC STD_DropTempTable '#tmpINV_ValoresActuaisStock'

GO

EXEC STD_DropTempTable '#tmpArtigo'

GO

SELECT * INTO #tmpArtigo FROM Artigo

WHERE TratamentoLotes = 1

SELECT Id= NEWID(), A.* INTO #tmpINV_ValoresActuaisStock

FROM

(

SELECT DISTINCT m.Artigo, Armazem, Localizacao, Lote, EstadoStock, DataStock = CONVERT(datetime,NULL),IdMovimentoStock = CONVERT(uniqueidentifier,NULL),Stock = CONVERT(DECIMAL(28,10),0)

FROM INV_Movimentos m INNER JOIN #tmpArtigo tmp ON tmp.Artigo = m.Artigo

) A

UPDATE stk

SET stk.DataStock = mov.Data

, stk.IdMovimentoStock = mov.Id

, Stock = CASE WHEN ISNULL(mov.Armazem, '') = '' AND ISNULL(mov.Localizacao, '') = ''

THEN ISNULL(mov.StockLoc_Actual, 0)

ELSE

CASE WHEN ISNULL(mov.Localizacao, '') <> ''

THEN

CASE WHEN mov.Lote = '<L01>'

THEN mov.StockLoc_Actual

ELSE mov.StockLocLot_Actual

END

ELSE

CASE WHEN ISNULL(mov.Armazem, '') <> ''

THEN

CASE WHEN tmp.TratamentoLotes = 0 THEN mov.StockArm_Actual

ELSE mov.StockArmLot_Actual

END

END

END

END

FROM #tmpINV_ValoresActuaisStock stk WITH (NOLOCK)

INNER JOIN #tmpArtigo tmp on tmp.Artigo = stk.Artigo

OUTER APPLY (

SELECT TOP 1 mv.*

FROM INV_Movimentos mv WITH(READPAST)

WHERE stk.Artigo = mv.Artigo

AND ISNULL(stk.Armazem, '') = ISNULL(mv.Armazem, '')

AND ISNULL(stk.Localizacao, '') = ISNULL(mv.Localizacao, '')

AND ISNULL(stk.Lote, '') = ISNULL(mv.Lote, '')

AND ISNULL(stk.EstadoStock, '') = ISNULL(mv.EstadoStock, '')

ORDER BY [Data] DESC, [NumRegisto] DESC

) mov

 

--- Artigos com tratamento de lotes e com stock em <L01>

SELECT distinct tmp.Artigo

INTO #tmpArtigoCalc

FROM #tmpINV_ValoresActuaisStock tmp

CROSS APPLY

(

SELECT TOP 1 TmpCross.Artigo FROM #tmpINV_ValoresActuaisStock TmpCross

INNER JOIN #tmpArtigo tmpArt on tmpArt.Artigo = TmpCross.Artigo

WHERE tmpArt.TratamentoLotes = 1 AND (TmpCross.Lote = '<L01>' AND TmpCross.Stock<>0)

AND TmpCross.Artigo = tmp.Artigo

) A

WHERE tmp.Lote ='<L01>'

--Order by tmp.Artigo, tmp.Armazem, tmp.Lote

---- Atualização ----

update INV_Movimentos

SET Lote = 'L01'

WHERE Lote = '<L01>'

AND Artigo IN (SELECT Artigo FROM #tmpArtigoCalc)

update c

SET c.Lote = 'L01'

from INV_Custeio c

inner join INV_GruposCustos gc on gc.Grupo = c.GrupoCustos

WHERE c.Lote = '<L01>' and gc.ValorizacaoLote = 1

AND c.Artigo IN (SELECT Artigo FROM #tmpArtigoCalc)

DELETE FROM INV_ValoresActuaisStock

WHERE Lote = '<L01>'

AND Artigo IN (SELECT Artigo FROM #tmpArtigoCalc)

UPDATE v

SET v.Lote = 'L01'

FROM INV_ValoresActuaisCusteio v

inner join INV_GruposCustos gc on gc.Grupo = v.GrupoCustos

WHERE Lote = '<L01>' and gc.ValorizacaoLote = 1

AND Artigo IN (SELECT Artigo FROM #tmpArtigoCalc)

 

-- Recálculo Stocks

exec dbo.std_droptemptable '#tempregistoscalcstock'

Go

select product = im.artigo

, [data] = min(im.[data])

, lot = im.lote

, [location] = im.localizacao

, warehouse = im.armazem

, stockstate = im.estadostock

, lastmovement = 0

, ruturastocks = cast(0 as tinyint)

, tratamentolotes = CASE WHEN im.Lote = '<L01>' THEN 0 ELSE 1 END

into #tempregistoscalcstock

from inv_movimentos im

inner join INV_Origens o on o.Id = im.IdOrigem

inner join Artigo a on a.Artigo = im.Artigo

--WHERE o.Documento = 'ge 2019/1'

where im.Artigo IN (SELECT Artigo FROM #tmpArtigoCalc)

AND im.Lote = 'L01'

group by im.artigo

, im.armazem

, im.localizacao

, im.lote

, im.estadostock

, a.tratamentolotes

exec inv_actualizastockbulk 1, ''

GO

Commit

 

--Artigos Alterados

SELECT * from #tmpArtigoCalc

Faça login para poder traduzir
Marked as spam
Criado há 3 anos e 5 meses maria
maria Most Valuable Professional
    0
    Private answer

    estes procedimentos acima (que se encontram no site de apoio nas migrações) são seguros de aplicar sem data de limitação?
    existe alguma coisa que possa ser afetada além das próprias tabelas onde são feitas as alterações? (contabilidade, inventarios, iva,...)

    Faça login para poder traduzir
    Marked as spam
    Criado há 3 anos e 2 meses nunovidalsoares