SQL qtde <= estoque

SQL Server

24/07/2020

Tenho o seguinte código

iif(sim(qtde)>=estoque,min(data coleta),")

Resumindo: por exemplo tenho duas datas, e uma nula
No estoque eu tenho 1 por exemplo
Na data 27/07 exemplo tenho 1 qtde
Na data 28/07 exemplo tenho 1 qtde
Na nula tenho 2

Mas no código preciso pegar a data que não atende ao estoque . Por exemplo o dia 27 tem qtde 1 e o estoque é 1 então atende a essa data, já o 28 não atende então preciso pegar essa data e caso atendesse a data 28 precisaria pegar a data nula, mas o código que eu fiz não tá funcionando , ele está pegando sempre a menor data
Bruno

Bruno

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

29/07/2020

o que a instrução abaixo te retorna?
select
	t.Item
	,min(t.Coleta) Coleta
from (
	select
		pe.Item
		,coalesce(v.data_coleta, '01/01/1900') as Coleta
		,coalesce(va.estoque, v1.estoque, 0) - (
			select coalesce(sum(xpe.qtde), 0)
			from dbo.PedidosEmpenhados xpe with (nolock)
			inner join dbo.Pedidos xp with (nolock) on xp.empresa = xpe.empresa and xp.numero = xpe.numero
			inner join dbo.Itens xi with (nolock) on xi.item = xpe.item
			left join dbo.RomaneioPedidos xrp with (nolock) on xrp.idPedido = xp.id
			left join dbo.RomaneioPedidosHeader xv with (nolock) on xv.numero = xrp.numero
			left join dbo.vEstoqueMoveisRealConsolidadoBase xva with (nolock) on xva.referencia = xpe.Item
			left join dbo.vEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item and xv1.empresa = 15
			where (xpe.qtde > xpe.coletada)
			and (xpe.Item = pe.Item)
			and (coalesce(xv.data_coleta, '01/01/1900') <= coalesce(v.data_coleta, '01/01/1900'))
		) Saldo
	from dbo.PedidosEmpenhados pe with (nolock)
	inner join dbo.Pedidos p with (nolock) on p.empresa = pe.empresa and p.numero = pe.numero
	inner join dbo.Itens i with (nolock) on i.item = pe.item
	left join dbo.RomaneioPedidos rp with (nolock) on rp.idPedido = p.id
	left join dbo.RomaneioPedidosHeader v with (nolock) on v.numero = rp.numero
	left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
	left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item and v1.empresa = 15
	where (pe.qtde > pe.coletada)
	group by
		pe.item
		,coalesce(v.data_coleta, '01/01/1900')
		,va.Estoque
		,v1.Estoque
) t
where t.Saldo < 0 and t.Item = 'UZ522-TR'
group by t.Item
GOSTEI 1

Mais Respostas

Bruno

Bruno

24/07/2020

Tenho o seguinte código

iif(sim(qtde)>=estoque,min(data coleta),")

Resumindo: por exemplo tenho duas datas, e uma nula
No estoque eu tenho 1 por exemplo
Na data 27/07 exemplo tenho 1 qtde
Na data 28/07 exemplo tenho 1 qtde
Na nula tenho 2

Mas no código preciso pegar a data que não atende ao estoque . Por exemplo o dia 27 tem qtde 1 e o estoque é 1 então atende a essa data, já o 28 não atende então preciso pegar essa data e caso atendesse a data 28 precisaria pegar a data nula, mas o código que eu fiz não tá funcionando , ele está pegando sempre a menor data




Alguém por favor??????
GOSTEI 0
Bruno

Bruno

24/07/2020

Tenho o seguinte código

iif(sim(qtde)>=estoque,min(data coleta),")

Resumindo: por exemplo tenho duas datas, e uma nula
No estoque eu tenho 1 por exemplo
Na data 27/07 exemplo tenho 1 qtde
Na data 28/07 exemplo tenho 1 qtde
Na nula tenho 2

Mas no código preciso pegar a data que não atende ao estoque . Por exemplo o dia 27 tem qtde 1 e o estoque é 1 então atende a essa data, já o 28 não atende então preciso pegar essa data e caso atendesse a data 28 precisaria pegar a data nula, mas o código que eu fiz não tá funcionando , ele está pegando sempre a menor data




Alguém por favor??????



Alguem??
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

eu não entendi a tua necessidade.
se dia 27 e dia 28 têm estoque 1, porque dia 27 atende e dia 28 não?
GOSTEI 0
Bruno

Bruno

24/07/2020

eu não entendi a tua necessidade.
se dia 27 e dia 28 têm estoque 1, porque dia 27 atende e dia 28 não?


Tenho 1 cx no estoque.
Dia 27 preciso de 1 cx então zerou o estoque.
Dia 28 preciso de 1 cx então não tenho mais no estoque, então deve aparecer essa data.

Só que se exemplo eu tivesse 2 cx no estoque , eu atenderia dia 27 e 28, então deveria aparecer nula a data.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

tá... então nos ajude a te ajudar.
de onde você obtém o estoque = 2?
de onde vêm essas datas e quantidades?

publique a estrutura das tabelas envolvidas e também a instrução que você fez.

GOSTEI 0
Bruno

Bruno

24/07/2020

tá... então nos ajude a te ajudar.
de onde você obtém o estoque = 2?
de onde vêm essas datas e quantidades?

publique a estrutura das tabelas envolvidas e também a instrução que você fez.



Item data_coleta estoque_total qtde
Ab. 27/07. 1. 1
Ab. 28/08. 1 0
Ab. Null. 1. 0

Iff(sum(qtde)>=estoque_total,min(data_coleta),")

Esse foi o iff que fiz mas não deu

Preciso que apareça a data do dia 28, que é a menor data onde irá faltar no estoque.
Porém 'se' tivesse 2 no estoque deveria aparecer nulo.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

publique a estrutura das tabelas envolvidas e também a instrução que você fez.
GOSTEI 0
Bruno

Bruno

24/07/2020

publique a estrutura das tabelas envolvidas e também a instrução que você fez.



alter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3] @Marca varchar(50)
,@Item varchar(15)
as
begin
set nocount on

if OBJECT_ID('tempdb..#tempEstoqueMoveisRealConsolidado') is not null
drop table #tempEstoqueMoveisRealConsolidado;

create table #tempEstoqueMoveisRealConsolidado (
referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisRealConsolidado
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock)

if OBJECT_ID('tempdb..#tempEstoqueMoveisReal') is not null
drop table #tempEstoqueMoveisReal;

create table #tempEstoqueMoveisReal (
Referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisReal
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisReal v with (nolock)
where empresa = 15;

if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
drop table #tempRomaneiosPedidos;

select pe.Item
,IIF(sum(pe.qtde) >= coalesce(va.estoque, v1.estoque, 0), min(v.data_coleta), '') as Coleta
into #tempRomaneiosPedidos2
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join #tempEstoqueMoveisRealConsolidado va on va.referencia = pe.Item
left join #tempEstoqueMoveisReal v1 on v1.Referencia = pe.Item
where (pe.qtde > pe.coletada)
group by pe.item
,va.Estoque
,v1.Estoque

select distinct pe.Item
,v2.Coleta

into #tempRomaneiosPedidos
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.PedidosTotais pt on pt.empresa = p.empresa
and pt.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join #tempEstoqueMoveisRealConsolidado va on va.referencia = pe.Item
left join #tempEstoqueMoveisReal v1 on v1.Referencia = pe.Item
inner join #tempRomaneiosPedidos2 v2 on v2.Item = pe.Item
left join dbo.Pedidos_Agendamento pa on pa.Empresa = p.Empresa
and pa.Numero = p.Numero
where (pe.qtde > pe.coletada)
group by pe.Item,v2.Coleta

select distinct opi.Item
,coalesce(v.Estoque, v1.estoque, 0) as Estoque
,coalesce(v.Empenho, v1.empenho, 0) as Empenho
,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
,nullif(isNull(x.Coleta, '01/01/1900'), '01/01/1900')
from dbo.OPItens opi
inner join dbo.OProd op on opi.Empresa = op.Empresa
and opi.Numero = op.Numero
left join #tempEstoqueMoveisRealConsolidado v on v.referencia = opi.Item
left join #tempEstoqueMoveisReal v1 on v1.Referencia = opi.Item
left join #tempRomaneiosPedidos x on x.Item = opi.Item
left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
where v.Marca = @Marca
and opi.Quantidade > opi.Coletada
and v.Empenho > v.Estoque
and (
isnull(@Item, '') = ''
or opi.Item = @Item
)
order by opi.Item
end
/*
param Marca, Marca, Exec(select Id, Descricao from dbo.marcas where Ativo = 1)
param Item, Item, String
*/
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

certo. você pode publicar alguns registros retornados pela stored procedure?
porque estou 'estranhando' aquele distinct na última instrução.
GOSTEI 0
Bruno

Bruno

24/07/2020

certo. você pode publicar alguns registros retornados pela stored procedure?
porque estou 'estranhando' aquele distinct na última instrução.


UZ100-TR
4
10
-6
UZ100-TR 4 10 -6 2020-07-28 00:00:00.000
UZ101-VEM 5 8 -3 2020-07-28 00:00:00.000
UZ101-VM 22 29 -7 2020-07-28 00:00:00.000
UZ113-ROS 0 1 -1 2020-07-28 00:00:00.000
UZ114-ROS 2 5 -3 2020-07-28 00:00:00.000
UZ134-VEM 9 22 -13 2020-07-28 00:00:00.000
UZ134-VM 0 65 -65 2020-07-28 00:00:00.000
UZ147-TR 32 39 -7 2020-07-29 00:00:00.000
UZ172-VM 1 2 -1 2020-07-29 00:00:00.000
UZ182-ROS 5 6 -1 2020-07-28 00:00:00.000
UZ187-AMC 7 11 -4 2020-07-28 00:00:00.000
UZ1880-ROS 0 1 -1 2020-07-28 00:00:00.000
UZ1880-VM 0 101 -101 2020-07-28 00:00:00.000
UZ1881-VEM 0 1 -1 2020-07-28 00:00:00.000
UZ1882-BR 0 4 -4 2020-07-28 00:00:00.000
UZ201-VM 32 36 -4 2020-07-28 00:00:00.000
UZ227-ROS 8 26 -18 2020-07-28 00:00:00.000
UZ230-VM 3 34 -31 2020-07-28 00:00:00.000
UZ237-ROS 2 4 -2 2020-07-28 00:00:00.000
UZ237-VM 0 2 -2 2020-07-29 00:00:00.000
UZ243-BR 23 26 -3 2020-07-28 00:00:00.000
UZ243-VEM 19 53 -34 2020-07-28 00:00:00.000
UZ244-BR 1 33 -32 2020-07-29 00:00:00.000
UZ244-PR 0 37 -37 2020-07-29 00:00:00.000
UZ244-ROS 9 33 -24 2020-07-28 00:00:00.000
UZ244-VM 0 73 -73 2020-07-29 00:00:00.000
UZ255-VM 34 44 -10 2020-07-28 00:00:00.000
UZ284-BR 0 8 -8 2020-07-28 00:00:00.000
UZ284-ROS 0 13 -13 2020-07-28 00:00:00.000
UZ285-COR 5 14 -9 2020-07-28 00:00:00.000
UZ285-ROS 0 10 -10 2020-07-29 00:00:00.000
UZ285-VEM 0 10 -10 2020-07-29 00:00:00.000
UZ285-VM 0 24 -24 2020-07-28 00:00:00.000
UZ286-COR 0 10 -10 2020-07-28 00:00:00.000
UZ286-VM 19 21 -2 2020-07-28 00:00:00.000
UZ287-VEM 19 21 -2 2020-07-28 00:00:00.000
UZ294-COR 1 6 -5 2020-07-28 00:00:00.000
UZ295-VM 37 97 -60 2020-07-28 00:00:00.000
UZ298-VEM 0 1 -1 NULL
UZ298-VM 0 4 -4 2020-07-28 00:00:00.000
UZ306-VEM 0 2 -2 2020-07-28 00:00:00.000
UZ314-ROS 12 13 -1 2020-07-28 00:00:00.000
UZ322-AMC 19 33 -14 2020-07-28 00:00:00.000
UZ325-AMC 0 2 -2 2020-07-28 00:00:00.000
UZ332-PR 10 15 -5 2020-07-28 00:00:00.000
UZ332-ROS 22 37 -15 2020-07-28 00:00:00.000
UZ332-VEM 13 26 -13 2020-07-28 00:00:00.000
UZ335-COR 11 12 -1 2020-07-28 00:00:00.000
UZ335-VEM 61 63 -2 2020-07-28 00:00:00.000
UZ335-VM 87 100 -13 2020-07-28 00:00:00.000
UZ361-BR 0 2 -2 2020-07-28 00:00:00.000
UZ370-COR 0 1 -1 2020-07-28 00:00:00.000
UZ372-M2 9 19 -10 NULL
UZ373-M1 6 7 -1 2020-07-28 00:00:00.000
UZ373-M2 15 23 -8 2020-07-28 00:00:00.000
UZ382-TR 212 236 -24 2020-07-28 00:00:00.000
UZ383-BR 49 84 -35 2020-07-28 00:00:00.000
UZ383-ROS 15 42 -27 2020-07-28 00:00:00.000
UZ394-BR 39 47 -8 2020-07-28 00:00:00.000
UZ394-PR 41 61 -20 2020-07-28 00:00:00.000
UZ394-ROS 31 67 -36 2020-07-28 00:00:00.000
UZ394-VM 15 62 -47 2020-07-28 00:00:00.000
UZ4003-11 54 122 -68 2020-07-28 00:00:00.000
UZ4003-13 5 9 -4 2020-07-29 00:00:00.000
UZ522-TR 77 125 -48 2020-07-28 00:00:00.000
UZ524-PR 31 57 -26 2020-07-29 00:00:00.000
UZ524-TR 34 64 -30 2020-07-28 00:00:00.000
UZ524-VM 13 50 -37 2020-07-28 00:00:00.000
UZ530-BRMT 40 50 -10 2020-07-28 00:00:00.000
UZ530-PRDR 0 13 -13 2020-07-28 00:00:00.000
UZ530-ROSE 10 12 -2 2020-07-28 00:00:00.000
UZ532-PRDR 4 5 -1 2020-07-28 00:00:00.000
UZ661-ROS 22 24 -2 2020-07-29 00:00:00.000
UZ661-TR 0 1 -1 NULL
UZ8007-11 42 65 -23 2020-07-28 00:00:00.000
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

Bruno, eu não vi um caso que se aplique ao que você apresentou como problema.
se eu entendi esses registros retornados, cada registro traz um código, logo basta avaliar a coluna 'saldo' e, se ela for negativa, pegar a data apresentada.

quando você apresentou o problema eu achei que veria algo assim:
item    estoque  empenho  saldo     data
UZ100   4        10       -6        2020-07-22 00:00:00.000
UZ101   8        5        3         2020-07-27 00:00:00.000
UZ101   3        29       -26       2020-07-28 00:00:00.000
UZ113   0        1        -1        2020-07-25 00:00:00.000

então o resultado final seria algo assim:
item    saldo     data
UZ100   -6        2020-07-22
UZ101   -26       2020-07-28
UZ113   -1        2020-07-25

você pode apontar, na lista de registros que você passou, como deveria ser o resultado final?
GOSTEI 0
Bruno

Bruno

24/07/2020

Bruno, eu não vi um caso que se aplique ao que você apresentou como problema.
se eu entendi esses registros retornados, cada registro traz um código, logo basta avaliar a coluna 'saldo' e, se ela for negativa, pegar a data apresentada.

quando você apresentou o problema eu achei que veria algo assim:
item    estoque  empenho  saldo     data
UZ100   4        10       -6        2020-07-22 00:00:00.000
UZ101   8        5        3         2020-07-27 00:00:00.000
UZ101   3        29       -26       2020-07-28 00:00:00.000
UZ113   0        1        -1        2020-07-25 00:00:00.000

então o resultado final seria algo assim:
item    saldo     data
UZ100   -6        2020-07-22
UZ101   -26       2020-07-28
UZ113   -1        2020-07-25

você pode apontar, na lista de registros que você passou, como deveria ser o resultado final?


por exemplo UZ294-COR 1 6 -5 2020-07-28 00:00:00.000 tem estoque 1 e a data 28/07 tem qtde 1 então deve aparecer 29/07 que é o que vai faltar
GOSTEI 0
Bruno

Bruno

24/07/2020

Bruno, eu não vi um caso que se aplique ao que você apresentou como problema.
se eu entendi esses registros retornados, cada registro traz um código, logo basta avaliar a coluna 'saldo' e, se ela for negativa, pegar a data apresentada.

quando você apresentou o problema eu achei que veria algo assim:
item    estoque  empenho  saldo     data
UZ100   4        10       -6        2020-07-22 00:00:00.000
UZ101   8        5        3         2020-07-27 00:00:00.000
UZ101   3        29       -26       2020-07-28 00:00:00.000
UZ113   0        1        -1        2020-07-25 00:00:00.000

então o resultado final seria algo assim:
item    saldo     data
UZ100   -6        2020-07-22
UZ101   -26       2020-07-28
UZ113   -1        2020-07-25

você pode apontar, na lista de registros que você passou, como deveria ser o resultado final?


por exemplo UZ294-COR 1 6 -5 2020-07-28 00:00:00.000 tem estoque 1 e a data 28/07 tem qtde 1 então deve aparecer 29/07 que é o que vai faltar


?
GOSTEI 0
Bruno

Bruno

24/07/2020

Bruno, eu não vi um caso que se aplique ao que você apresentou como problema.
se eu entendi esses registros retornados, cada registro traz um código, logo basta avaliar a coluna 'saldo' e, se ela for negativa, pegar a data apresentada.

quando você apresentou o problema eu achei que veria algo assim:
item    estoque  empenho  saldo     data
UZ100   4        10       -6        2020-07-22 00:00:00.000
UZ101   8        5        3         2020-07-27 00:00:00.000
UZ101   3        29       -26       2020-07-28 00:00:00.000
UZ113   0        1        -1        2020-07-25 00:00:00.000

então o resultado final seria algo assim:
item    saldo     data
UZ100   -6        2020-07-22
UZ101   -26       2020-07-28
UZ113   -1        2020-07-25

você pode apontar, na lista de registros que você passou, como deveria ser o resultado final?


por exemplo UZ294-COR 1 6 -5 2020-07-28 00:00:00.000 tem estoque 1 e a data 28/07 tem qtde 1 então deve aparecer 29/07 que é o que vai faltar


?



ajuda pf?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

vi que na stored procedure você cria algumas tabelas temporárias para ter dados de uma única tabela. desnecessário e só gasta tempo e processamento.
apesar de ser bem difícil fazer esse tipo de ajuste sem os dados, refiz a stored procedure. veja se te ajuda:
alter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3]
	@Marca varchar(50)
	,@Item varchar(15)
as
begin
	set nocount on

	if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
	drop table #tempRomaneiosPedidos;

	select 
		t.Item, min(t.Coleta) Coleta
	into #tempRomaneiosPedidos
	from
		(select
			pe.Item, coalesce(v.data_coleta,'01/01/1900') as Coleta,
			coalesce(va.estoque, v1.estoque, 0) -
			(
				select coalesce(sum(xpe.qtde),0)
				from dbo.PedidosEmpenhados xpe
				inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
					and xpe.numero = xp.numero
				inner join dbo.Itens xi on xpe.item = xi.item
				left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
				left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
				left join dbo.vEstoqueMoveisRealConsolidadoBase xva with (nolock) on xva.referencia = xpe.Item
				left join dbo.vEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item and xv1.empresa = 15
				where (xpe.qtde > xpe.coletada) and (xpe.Item = pe.Item) and (coalesce(xv.data_coleta,'') <= coalesce(v.data_coleta,''))
			) saldo
		from dbo.PedidosEmpenhados pe
		inner join dbo.Pedidos p on pe.empresa = p.empresa
			and pe.numero = p.numero
		inner join dbo.Itens i on pe.item = i.item
		left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
		left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
		left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
		left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item and v1.empresa = 15
		where (pe.qtde > pe.coletada)
		group by pe.item
			,coalesce(v.data_coleta,'01/01/1900')
			,va.Estoque
			,v1.Estoque) t
	where t.saldo < 0
	group by t.Item

	select
		opi.Item
		,coalesce(v.Estoque, v1.estoque, 0) as Estoque
		,coalesce(v.Empenho, v1.empenho, 0) as Empenho
		,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
		,x.Coleta
	from dbo.OPItens opi
	inner join dbo.OProd op on opi.Empresa = op.Empresa
		and opi.Numero = op.Numero
	left join dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock) on v.referencia = opi.Item
	left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item and v1.empresa = 15
	left join #tempRomaneiosPedidos x on x.Item = opi.Item
	left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
	where v.Marca = @Marca
		and opi.Quantidade > opi.Coletada
		and v.Empenho > v.Estoque
		and (
			isnull(@Item, '') = ''
			or opi.Item = @Item
		)
	order by opi.Item, x.Coleta
end

GOSTEI 0
Bruno

Bruno

24/07/2020

alter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3] @Marca varchar(50)
,@Item varchar(15)
as
begin
set nocount on

if OBJECT_ID('tempdb..#tempEstoqueMoveisRealConsolidado') is not null
drop table #tempEstoqueMoveisRealConsolidado;

create table #tempEstoqueMoveisRealConsolidado (
referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisRealConsolidado
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock)

if OBJECT_ID('tempdb..#tempEstoqueMoveisReal') is not null
drop table #tempEstoqueMoveisReal;

create table #tempEstoqueMoveisReal (
Referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisReal
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisReal v with (nolock)
where empresa = 15;

if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
drop table #tempRomaneiosPedidos;

select t.Item
,min(t.Coleta) Coleta
into #tempRomaneiosPedidos
from (
select pe.Item
,coalesce(v.data_coleta, '01/01/1900') as Coleta
,coalesce(va.estoque, v1.estoque, 0) - (
select coalesce(sum(xpe.qtde), 0)
from dbo.PedidosEmpenhados xpe
inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
and xpe.numero = xp.numero
inner join dbo.Itens xi on xpe.item = xi.item
left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
left join #tempEstoqueMoveisRealConsolidado xva with (nolock) on xva.referencia = xpe.Item
left join #tempEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item
where (xpe.qtde > xpe.coletada)
and (xpe.Item = pe.Item)
and (coalesce(xv.data_coleta, '') <= coalesce(v.data_coleta, ''))
) saldo
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item
and v1.empresa = 15
where (pe.qtde > pe.coletada)
group by pe.item
,coalesce(v.data_coleta, '01/01/1900')
,va.Estoque
,v1.Estoque
) t
where t.saldo < 0
group by t.Item

select distinct opi.Item
,coalesce(v.Estoque, v1.estoque, 0) as Estoque
,coalesce(v.Empenho, v1.empenho, 0) as Empenho
,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
,nullif(isnull(x.Coleta,'01/01/1900'),'01/01/1900') as [Coleta Romaneio]
from dbo.OPItens opi
inner join dbo.OProd op on opi.Empresa = op.Empresa
and opi.Numero = op.Numero
left join #tempEstoqueMoveisRealConsolidado v with (nolock) on v.referencia = opi.Item
left join #tempEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item
left join #tempRomaneiosPedidos x on x.Item = opi.Item
left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
where v.Marca = @Marca
and opi.Quantidade > opi.Coletada
and v.Empenho > v.Estoque
and (
isnull(@Item, '') = ''
or opi.Item = @Item
)
order by opi.Item
end
/*
param Marca, Marca, Exec(select Id, Descricao from dbo.marcas where Ativo = 1)
param Item, Item, String
*/ Esse comentário com '/*' deixa, pois eles são parâmetros para os usuários consultarem


Fiz modificações no código. Tive que colocar Distinct e voltar com as temporárias, pois dava tempo excedido,
mas mesmo assim teve itens que não retornaram as datas certas ou as datas que deveriam retornarem nulas.



GOSTEI 0
Bruno

Bruno

24/07/2020

[quotealter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3] @Marca varchar(50)
,@Item varchar(15)
as
begin
set nocount on

if OBJECT_ID('tempdb..#tempEstoqueMoveisRealConsolidado') is not null
drop table #tempEstoqueMoveisRealConsolidado;

create table #tempEstoqueMoveisRealConsolidado (
referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisRealConsolidado
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock)

if OBJECT_ID('tempdb..#tempEstoqueMoveisReal') is not null
drop table #tempEstoqueMoveisReal;

create table #tempEstoqueMoveisReal (
Referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisReal
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisReal v with (nolock)
where empresa = 15;

if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
drop table #tempRomaneiosPedidos;

select t.Item
,min(t.Coleta) Coleta
into #tempRomaneiosPedidos
from (
select pe.Item
,coalesce(v.data_coleta, '01/01/1900') as Coleta
,coalesce(va.estoque, v1.estoque, 0) - (
select coalesce(sum(xpe.qtde), 0)
from dbo.PedidosEmpenhados xpe
inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
and xpe.numero = xp.numero
inner join dbo.Itens xi on xpe.item = xi.item
left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
left join #tempEstoqueMoveisRealConsolidado xva with (nolock) on xva.referencia = xpe.Item
left join #tempEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item
where (xpe.qtde > xpe.coletada)
and (xpe.Item = pe.Item)
and (coalesce(xv.data_coleta, '') <= coalesce(v.data_coleta, ''))
) saldo
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item
and v1.empresa = 15
where (pe.qtde > pe.coletada)
group by pe.item
,coalesce(v.data_coleta, '01/01/1900')
,va.Estoque
,v1.Estoque
) t
where t.saldo < 0
group by t.Item

select distinct opi.Item
,coalesce(v.Estoque, v1.estoque, 0) as Estoque
,coalesce(v.Empenho, v1.empenho, 0) as Empenho
,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
,nullif(isnull(x.Coleta,'01/01/1900'),'01/01/1900') as [Coleta Romaneio]
from dbo.OPItens opi
inner join dbo.OProd op on opi.Empresa = op.Empresa
and opi.Numero = op.Numero
left join #tempEstoqueMoveisRealConsolidado v with (nolock) on v.referencia = opi.Item
left join #tempEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item
left join #tempRomaneiosPedidos x on x.Item = opi.Item
left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
where v.Marca = @Marca
and opi.Quantidade > opi.Coletada
and v.Empenho > v.Estoque
and (
isnull(@Item, '') = ''
or opi.Item = @Item
)
order by opi.Item
end
/*
param Marca, Marca, Exec(select Id, Descricao from dbo.marcas where Ativo = 1)
param Item, Item, String
*/ Esse comentário com '/*' deixa, pois eles são parâmetros para os usuários consultarem


Fiz modificações no código. Tive que colocar Distinct e voltar com as temporárias, pois dava tempo excedido,
mas mesmo assim teve itens que não retornaram as datas certas ou as datas que deveriam retornarem nulas.

GOSTEI 0
Bruno

Bruno

24/07/2020

vi que na stored procedure você cria algumas tabelas temporárias para ter dados de uma única tabela. desnecessário e só gasta tempo e processamento.
apesar de ser bem difícil fazer esse tipo de ajuste sem os dados, refiz a stored procedure. veja se te ajuda:
alter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3]
	@Marca varchar(50)
	,@Item varchar(15)
as
begin
	set nocount on

	if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
	drop table #tempRomaneiosPedidos;

	select 
		t.Item, min(t.Coleta) Coleta
	into #tempRomaneiosPedidos
	from
		(select
			pe.Item, coalesce(v.data_coleta,'01/01/1900') as Coleta,
			coalesce(va.estoque, v1.estoque, 0) -
			(
				select coalesce(sum(xpe.qtde),0)
				from dbo.PedidosEmpenhados xpe
				inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
					and xpe.numero = xp.numero
				inner join dbo.Itens xi on xpe.item = xi.item
				left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
				left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
				left join dbo.vEstoqueMoveisRealConsolidadoBase xva with (nolock) on xva.referencia = xpe.Item
				left join dbo.vEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item and xv1.empresa = 15
				where (xpe.qtde > xpe.coletada) and (xpe.Item = pe.Item) and (coalesce(xv.data_coleta,'') <= coalesce(v.data_coleta,''))
			) saldo
		from dbo.PedidosEmpenhados pe
		inner join dbo.Pedidos p on pe.empresa = p.empresa
			and pe.numero = p.numero
		inner join dbo.Itens i on pe.item = i.item
		left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
		left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
		left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
		left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item and v1.empresa = 15
		where (pe.qtde > pe.coletada)
		group by pe.item
			,coalesce(v.data_coleta,'01/01/1900')
			,va.Estoque
			,v1.Estoque) t
	where t.saldo < 0
	group by t.Item

	select
		opi.Item
		,coalesce(v.Estoque, v1.estoque, 0) as Estoque
		,coalesce(v.Empenho, v1.empenho, 0) as Empenho
		,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
		,x.Coleta
	from dbo.OPItens opi
	inner join dbo.OProd op on opi.Empresa = op.Empresa
		and opi.Numero = op.Numero
	left join dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock) on v.referencia = opi.Item
	left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item and v1.empresa = 15
	left join #tempRomaneiosPedidos x on x.Item = opi.Item
	left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
	where v.Marca = @Marca
		and opi.Quantidade > opi.Coletada
		and v.Empenho > v.Estoque
		and (
			isnull(@Item, '') = ''
			or opi.Item = @Item
		)
	order by opi.Item, x.Coleta
end




alter procedure [dbo].[Consultas - OpItens - Prioridades de produção/carregamento_3] @Marca varchar(50)
,@Item varchar(15)
as
begin
set nocount on

if OBJECT_ID('tempdb..#tempEstoqueMoveisRealConsolidado') is not null
drop table #tempEstoqueMoveisRealConsolidado;

create table #tempEstoqueMoveisRealConsolidado (
referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisRealConsolidado
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock)

if OBJECT_ID('tempdb..#tempEstoqueMoveisReal') is not null
drop table #tempEstoqueMoveisReal;

create table #tempEstoqueMoveisReal (
Referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisReal
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisReal v with (nolock)
where empresa = 15;

if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
drop table #tempRomaneiosPedidos;

select t.Item
,min(t.Coleta) Coleta
into #tempRomaneiosPedidos
from (
select pe.Item
,coalesce(v.data_coleta, '01/01/1900') as Coleta
,coalesce(va.estoque, v1.estoque, 0) - (
select coalesce(sum(xpe.qtde), 0)
from dbo.PedidosEmpenhados xpe
inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
and xpe.numero = xp.numero
inner join dbo.Itens xi on xpe.item = xi.item
left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
left join #tempEstoqueMoveisRealConsolidado xva with (nolock) on xva.referencia = xpe.Item
left join #tempEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item
where (xpe.qtde > xpe.coletada)
and (xpe.Item = pe.Item)
and (coalesce(xv.data_coleta, '') <= coalesce(v.data_coleta, ''))
) saldo
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join dbo.vEstoqueMoveisRealConsolidadoBase va with (nolock) on va.referencia = pe.Item
left join dbo.vEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item
and v1.empresa = 15
where (pe.qtde > pe.coletada)
group by pe.item
,coalesce(v.data_coleta, '01/01/1900')
,va.Estoque
,v1.Estoque
) t
where t.saldo < 0
group by t.Item

select distinct opi.Item
,coalesce(v.Estoque, v1.estoque, 0) as Estoque
,coalesce(v.Empenho, v1.empenho, 0) as Empenho
,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
,nullif(isnull(x.Coleta,'01/01/1900'),'01/01/1900') as [Coleta Romaneio]
from dbo.OPItens opi
inner join dbo.OProd op on opi.Empresa = op.Empresa
and opi.Numero = op.Numero
left join #tempEstoqueMoveisRealConsolidado v with (nolock) on v.referencia = opi.Item
left join #tempEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item
left join #tempRomaneiosPedidos x on x.Item = opi.Item
left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
where v.Marca = @Marca
and opi.Quantidade > opi.Coletada
and v.Empenho > v.Estoque
and (
isnull(@Item, '') = ''
or opi.Item = @Item
)
order by opi.Item
end
/*
param Marca, Marca, Exec(select Id, Descricao from dbo.marcas where Ativo = 1)
param Item, Item, String
*/ Esse comentário com '/*' deixa, pois eles são parâmetros para os usuários consultarem


Fiz modificações no código. Tive que colocar Distinct e voltar com as temporárias, pois dava tempo excedido,
mas mesmo assim teve itens que não retornaram as datas certas ou as datas que deveriam retornarem nulas.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/07/2020

Então, Bruno, sem os dados pra fazer os testes fica quase impossível ajudar.
Desculpe.
GOSTEI 0
Bruno

Bruno

24/07/2020

Então, Bruno, sem os dados pra fazer os testes fica quase impossível ajudar.
Desculpe.


Item Estoque Data_Coleta
UZ522-TR 3 Null Isso está me retornando



Essa é a tabela de romaneios do item UZ522-TR
Item Quantidade Data_Coleta
UZ522-TR 8 Null
UZ522-TR 3 Null
UZ522-TR 10 29/07/2020
UZ522-TR 5 29/07/2020
UZ522-TR 15 29/07/2020
UZ522-TR 5 29/07/2020
UZ522-TR 10 30/07/2020
UZ522-TR 10 30/07/2020
UZ522-TR 3 30/07/2020

Deveria trazer a data do dia 29/07/2020, pois é a primeira data que está faltando,
pois estoque (3) - Quantidade(35) = -32 então está faltando nessa data.
GOSTEI 0
Bruno

Bruno

24/07/2020

Então, Bruno, sem os dados pra fazer os testes fica quase impossível ajudar.
Desculpe.


Item Estoque Data_Coleta
UZ522-TR 3 Null Isso está me retornando



Essa é a tabela de romaneios do item UZ522-TR
Item Quantidade Data_Coleta
UZ522-TR 8 Null
UZ522-TR 3 Null
UZ522-TR 10 29/07/2020
UZ522-TR 5 29/07/2020
UZ522-TR 15 29/07/2020
UZ522-TR 5 29/07/2020
UZ522-TR 10 30/07/2020
UZ522-TR 10 30/07/2020
UZ522-TR 3 30/07/2020

Deveria trazer a data do dia 29/07/2020, pois é a primeira data que está faltando,
pois estoque (3) - Quantidade(35) = -32 então está faltando nessa data.


Emerson tenta de novo por favor tentei de todas as formas mas não consegui resolver pf
GOSTEI 0
Bruno

Bruno

24/07/2020

Hoje pela manhã consegui fazer mas obrigado!

ALTER PROCEDURE [dbo].[Consultas - OpItens - Prioridades de produção/carregamento] @Marca varchar(50)
,@Item varchar(15)
as
begin
set nocount on

if OBJECT_ID('tempdb..#tempEstoqueMoveisRealConsolidado') is not null
drop table #tempEstoqueMoveisRealConsolidado;

create table #tempEstoqueMoveisRealConsolidado (
referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisRealConsolidado
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisRealConsolidadoBase v with (nolock)

if OBJECT_ID('tempdb..#tempEstoqueMoveisReal') is not null
drop table #tempEstoqueMoveisReal;

create table #tempEstoqueMoveisReal (
Referencia varchar(15) primary key
,Estoque int
,Empenho int
,Producao int
,Marca varchar(50)
);

insert into #tempEstoqueMoveisReal
select v.Referencia
,v.Estoque
,v.Empenho
,v.Producao
,v.Marca
from dbo.vEstoqueMoveisReal v with (nolock)
where empresa = 15;

if OBJECT_ID('tempdb..#tempRomaneiosPedidos') is not null
drop table #tempRomaneiosPedidos;

select t.Item
,min(t.Coleta) Coleta
into #tempRomaneiosPedidos
from (
select pe.Item
,coalesce(v.data_coleta, '01/01/1900') as Coleta
,coalesce(va.estoque, v1.estoque, 0) - (
select coalesce(sum(xpe.qtde), 0)
from dbo.PedidosEmpenhados xpe
inner join dbo.Pedidos xp on xpe.empresa = xp.empresa
and xpe.numero = xp.numero
inner join dbo.Itens xi on xpe.item = xi.item
left join dbo.RomaneioPedidos xrp on xrp.idPedido = xp.id
left join dbo.RomaneioPedidosHeader xv on xv.numero = xrp.numero
left join #tempEstoqueMoveisRealConsolidado xva with (nolock) on xva.referencia = xpe.Item
left join #tempEstoqueMoveisReal xv1 with (nolock) on xv1.Referencia = xpe.Item
where (xpe.qtde > xpe.coletada)
and (xpe.Item = pe.Item)
and (coalesce(xv.data_coleta, xv.data_coleta) <= coalesce(v.data_coleta, v.data_coleta))
) saldo
from dbo.PedidosEmpenhados pe
inner join dbo.Pedidos p on pe.empresa = p.empresa
and pe.numero = p.numero
inner join dbo.Itens i on pe.item = i.item
left join dbo.RomaneioPedidos rp on rp.idPedido = p.id
left join dbo.RomaneioPedidosHeader v on v.numero = rp.numero
left join #tempEstoqueMoveisRealConsolidado va with (nolock) on va.referencia = pe.Item
left join #tempEstoqueMoveisReal v1 with (nolock) on v1.Referencia = pe.Item
where (pe.qtde > pe.coletada)
group by pe.item,v.Data_Coleta
,coalesce(v.data_coleta, '01/01/1900')
,va.Estoque
,v1.Estoque
) t
where t.saldo < 0
group by t.Item

select distinct opi.Item
,coalesce(v.Estoque, v1.estoque, 0) as Estoque
,coalesce(v.Empenho, v1.empenho, 0) as Empenho
,coalesce(v.Estoque, v1.estoque, 0) - coalesce(v.Empenho, v1.empenho, 0) as Saldo
,nullif(isnull(x.Coleta,'01/01/1900'),'01/01/1900') as [Coleta Romaneio]
from dbo.OPItens opi
inner join dbo.OProd op on opi.Empresa = op.Empresa
and opi.Numero = op.Numero
left join #tempEstoqueMoveisRealConsolidado v with (nolock) on v.referencia = opi.Item
left join #tempEstoqueMoveisReal v1 with (nolock) on v1.Referencia = opi.Item
left join #tempRomaneiosPedidos x on x.Item = opi.Item
left join dbo.ItensVendaMediaSugestaoPorDia m on m.Item = opi.Item
where v.Marca = @Marca
and opi.Quantidade > opi.Coletada
and v.Empenho > v.Estoque
and (
isnull(@Item, '') = ''
or opi.Item = @Item
)
order by opi.Item
end
/*
param Marca, Marca, Exec(select Id, Descricao from dbo.marcas where Ativo = 1)
param Item, Item, String
*/


GOSTEI 0
POSTAR