SQL qtde <= estoque

24/07/2020

0

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

Responder

Post mais votado

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

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

25/07/2020

Bruno

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??????
Responder

26/07/2020

Bruno

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??
Responder

26/07/2020

Emerson Nascimento

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?
Responder

26/07/2020

Bruno

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.
Responder

27/07/2020

Emerson Nascimento

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.

Responder

27/07/2020

Bruno

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.
Responder

27/07/2020

Emerson Nascimento

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

27/07/2020

Bruno

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
*/
Responder

27/07/2020

Emerson Nascimento

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

27/07/2020

Bruno

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
Responder

27/07/2020

Emerson Nascimento

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?
Responder

27/07/2020

Bruno

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
Responder

27/07/2020

Bruno

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


?
Responder

28/07/2020

Bruno

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?
Responder

28/07/2020

Emerson Nascimento

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

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar