Sql- pegar data nula do pedido

SQL Server

24/08/2020

Tenho data de previsão de conclusão nos itens. Exemplo:

UZ134-VM DataPrevisao 27/08/2020
UZ230-VM DataPrevisao 28/08/2020
UZ234-VM DataPrevisao NULL

No pedido eu tenho esses itens. Como um item do pedido tem data null preciso pegar a data null, porém se todos itens tivessem data eu deveria pegar a maior dataprevisao.


A tabela que possui a DataPrevisao é a tabela opitens.

E preciso mostrar essa data ligando com a itensped, provavelmente numa temporária para depois ligar com outras tabelas para exibir a data de previsão por pedido. A data nula ou a maior se não tiver nula.
Bruno

Bruno

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

24/08/2020

tente algo assim:
select
  it.pedido,
  max(case when opi2.pedido is null then opi.dataprevisao else null end) dataprevisao
from
  itensped it
left join
  opitens opi on (opi.pedido = it.pedido) and not (opi.dataprevisao is null)  -- aqui lista registros com data de previsão
left join
  opitens opi2 on (opi2.pedido = it.pedido) and (opi2.dataprevisao is null) -- aqui lista registros sem data de previsão
[where
]
group by
  it.pedido

GOSTEI 0
Bruno

Bruno

24/08/2020

select it.Numero
,max (case
when it.Numero is null
then opi.PrevisaoConclusao
else null
end) as PrevisaoConclusao
from itensped it
left join opitens opi on opi.item = it.Item and opi.Empresa = it.Empresa
and not opi.PrevisaoConclusao is null
left join opitens opi2 on opi2.Item = it.Item and opi.Empresa = it.Empresa
and opi2.PrevisaoConclusao is null
where it.Numero in (2787617,2787388)
group by it.Numero


fiz assim mas traz sempre null e um desse numeros de pedido deveria trazer a maior data. O número do pedido está apenas na itensped.


Segue todo o código:

select it.Numero
,max(case
when opi2.id is null
then opi.PrevisaoConclusao
else null
end) as PrevisaoConclusao
,it.Empresa
into #tempOpitens
from itensped it
left join opitens opi on opi.item = it.Item
and opi.Empresa = it.Empresa
and not opi.PrevisaoConclusao is null
left join opitens opi2 on opi2.Item = it.Item
and opi.Empresa = it.Empresa
and opi2.PrevisaoConclusao is null
--where it.Numero in (2787617, 2787388)
group by it.Numero,it.Empresa;

with TempPedidosEmpenhados
as (
select distinct empresa
,numero
from dbo.pedidosempenhados
group by empresa
,numero
)
select tp.Volumes
,tp.VolumesAcessorios as VolAcessorios
,case
when pf.idPedido is null
then ''Bloqueado''
else ''Liberado''
end LibFinan
,tp.VolumesZero
,tp.TVolumes
,tp.TVolumesColetados
,tp.TVolumesAtendidos
,p.Data_Liberacao as Data
,p.Ordem_Compra
,c.Razao_Social
,e.Estado as UF
,substring(e.cidade, 1, 15) as Cidade
,t1.Fantasia as Transp
,case p.Tipo_Frete
when 1
then ''FOB''
when 2
then ''CIF''
when 3
then ''CORT''
when 4
then ''CIFSP''
else ''INDEF''
end as Frete
,p.Observacao_1 as OBS1
,p.Observacao_2 as OBS2
,p.Observacao_3 as OBS3
,convert(bit, case
when (vd.idPedido is not null)
then 1
else 0
end) as PossuiVidro
,p.Marca
,p.Transportadora
,pp.Descricao as TipoPedido
,t.Empresa
,t.Numero
,convert(bit, case
when ca.Codigo_Cliente is null
then 0
else 1
end) as InfAgenda
,p.Data_Base as PedidoData_Base
,c.Codigo_Cliente as Cliente
,p.bObs1
,p.bObs2
,p.bObs3
,convert(bit, iif((ObsRomaneio & Power(2, 1 - 1)) > 0, 1, 0)) as bObsRomaneio1
,convert(bit, iif((ObsRomaneio & Power(2, 2 - 1)) > 0, 1, 0)) as bObsRomaneio2
,convert(bit, iif((ObsRomaneio & Power(2, 3 - 1)) > 0, 1, 0)) as bObsRomaneio3
,op.PrevisaoConclusao
into #tempCandidatos
from dbo.PedidosCandidatos t
inner join dbo.pedidos p on p.empresa = t.empresa
and p.numero = t.numero
left join dbo.Clientes_Agendamento ca on ca.codigo_cliente = p.cliente
inner join dbo.TiposPedido pp on pp.Codigo = p.Tipo_Pedido --14/09/15 leonice
inner join dbo.pedidosTotais tp on tp.empresa = t.empresa
and tp.numero = t.numero
inner join dbo.Transp t1 on t1.codigo_transp = p.transportadora
inner join dbo.clientes c on c.codigo_cliente = p.cliente
inner join dbo.Endereco e on e.cliente = p.cliente
and e.sequencia = p.endereco_entrega
inner join #tempOpitens op on op.numero = t.numero
and op.empresa = t.empresa
left join dbo.PedidosLiberaFaturamento pf on pf.idPedido = p.id
left join dbo.vPedidosVidrosMyHome vd on vd.idPedido = p.id
left join TempPedidosEmpenhados pd on pd.empresa = t.empresa
and pd.numero = t.numero
-- adicionar Kasa K à regra para trazer pedidos não programados aqui...
where (
(pd.empresa is null)
or (
(p.marca in (6, 9))
and (p.Data_Programacao is null)
)
)

select distinct t.PrevisaoConclusao
,pc.*
,t.Volumes
,t.VolAcessorios
,t.LibFinan
,t.VolumesZero
,t.TVolumes
,t.TVolumesColetados
,t.TVolumesAtendidos
,t.Data
,t.Ordem_Compra
,pc.Faturamento as Data_Base
,t.Razao_Social
,t.UF
,t.Cidade
,t.Transp
,t.Frete
,t.OBS1
,t.OBS2
,t.OBS3
,t.PossuiVidro
,t.TipoPedido
,t.Marca
,pa.Agendado
,t.InfAgenda as Agendamento
,pr.Atendido as Estruturas
,'''' as Lotes
,PedidoData_Base
,t.Cliente
,1 as AdicionaEmRomaneio
,t.Transportadora
,t.bObs1
,t.bObs2
,t.bObs3
,t.bObsRomaneio1
,t.bObsRomaneio2
,t.bObsRomaneio3
from dbo.PedidosCandidatos pc
left join dbo.PrgMetalAtendidos pr on pr.empresa = pc.empresa
and pr.numero = pc.numero
inner join dbo.itensped ip on ip.empresa = pc.empresa
and ip.numero = pc.numero
--inner join dbo.vitenscompostos ic on ic.referencia = ip.item
inner join dbo.vMovel m1 on m1.referencia = ip.item
inner join #tempCandidatos t on t.empresa = pc.empresa
and t.numero = pc.numero
left join [dbo].[Pedidos_Agendamento] pa on pa.empresa = pc.empresa
and pa.numero = pc.numero
-- where (pc.numero = 2258069) or not (suser_sname() = ''KAPPESBERG\\\\juliano'')
where pc.Numero in (2787617, 2787388)
order by pc.Prioridade desc
,pc.Faturamento;

drop table #tempopitens

drop table #tempCandidatos



GOSTEI 0
Bruno

Bruno

24/08/2020

Problema que na opitens tem itens que ficam salvos antigos daí tem data nula não sei o que fazer
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/08/2020

reveja essa query:
select
	it.Empresa
	,it.Numero
	,max(case when opi2.id is null then opi.PrevisaoConclusao else null end) as PrevisaoConclusao
	into #tempOpitens -- retire para testar a query
from
	itensped it
left join
	opitens opi on opi.item = it.Item
	and opi.numero = it.numero -- não seria necessário filtrar o pedido ????
	and opi.Empresa = it.Empresa
	and not opi.PrevisaoConclusao is null
left join
	opitens opi2 on opi2.Item = it.Item
	and opi2.numero = it.numero -- não seria necessário filtrar o pedido ????
	and opi2.Empresa = it.Empresa -- aqui deveria ter colocado opi2; estava opi
	and opi2.PrevisaoConclusao is null
--where it.Numero in (2787617, 2787388)
group by
	it.Numero,it.Empresa
o retorno obitido é o esperado?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/08/2020

corrigindo:
*obtido
GOSTEI 0
Bruno

Bruno

24/08/2020

Problema que na opitens da sequencia do código tem itens que ficam salvos antigos daí tem data nula não sei o que fazer.

Esse código não funciona, pois não traz a data. A data traz nula, pois tem itens antigos no meio e as referências sempre são atualizadas para serem produzidas.

Não posso ligar o número da opitens, pois não tem numero do pedido, apenas a itensped tem numero do pedido.
GOSTEI 0
Bruno

Bruno

24/08/2020

Alguém consegue ajudar?
GOSTEI 0
Imex

Imex

24/08/2020

Bom dia,

Bruno, segue uma sugestão para testes:

select 
    it.Numero,
    case when count(*) = count(opi.PrevisaoConclusao) 
        then max(opi.PrevisaoConclusao) 
    end as PrevisaoConclusao
from itensped it
left join opitens opi 
    on opi.item = it.Item and opi.Empresa = it.Empresa
where 
    it.Numero in (2787617, 2787388)
group by 
    it.Numero


Espero que ajude
GOSTEI 0
Bruno

Bruno

24/08/2020

Ainda não deu certo, traz nulo, mas obrigado por tentar ajudar. Esse chamado está parado não consigo resolver.O código completo segue abaixo

select it.Numero
,max (case
when it.Numero is null
then opi.PrevisaoConclusao
else null
end) as PrevisaoConclusao
from itensped it
left join opitens opi on opi.item = it.Item and opi.Empresa = it.Empresa
and not opi.PrevisaoConclusao is null
left join opitens opi2 on opi2.Item = it.Item and opi.Empresa = it.Empresa
and opi2.PrevisaoConclusao is null
where it.Numero in (2787617,2787388)
group by it.Numero


fiz assim mas traz sempre null e um desse numeros de pedido deveria trazer a maior data. O número do pedido está apenas na itensped.


Segue todo o código:

select it.Numero
,max(case
when opi2.id is null
then opi.PrevisaoConclusao
else null
end) as PrevisaoConclusao
,it.Empresa
into #tempOpitens
from itensped it
left join opitens opi on opi.item = it.Item
and opi.Empresa = it.Empresa
and not opi.PrevisaoConclusao is null
left join opitens opi2 on opi2.Item = it.Item
and opi.Empresa = it.Empresa
and opi2.PrevisaoConclusao is null
--where it.Numero in (2787617, 2787388)
group by it.Numero,it.Empresa;

with TempPedidosEmpenhados
as (
select distinct empresa
,numero
from dbo.pedidosempenhados
group by empresa
,numero
)
select tp.Volumes
,tp.VolumesAcessorios as VolAcessorios
,case
when pf.idPedido is null
then ''Bloqueado''
else ''Liberado''
end LibFinan
,tp.VolumesZero
,tp.TVolumes
,tp.TVolumesColetados
,tp.TVolumesAtendidos
,p.Data_Liberacao as Data
,p.Ordem_Compra
,c.Razao_Social
,e.Estado as UF
,substring(e.cidade, 1, 15) as Cidade
,t1.Fantasia as Transp
,case p.Tipo_Frete
when 1
then ''FOB''
when 2
then ''CIF''
when 3
then ''CORT''
when 4
then ''CIFSP''
else ''INDEF''
end as Frete
,p.Observacao_1 as OBS1
,p.Observacao_2 as OBS2
,p.Observacao_3 as OBS3
,convert(bit, case
when (vd.idPedido is not null)
then 1
else 0
end) as PossuiVidro
,p.Marca
,p.Transportadora
,pp.Descricao as TipoPedido
,t.Empresa
,t.Numero
,convert(bit, case
when ca.Codigo_Cliente is null
then 0
else 1
end) as InfAgenda
,p.Data_Base as PedidoData_Base
,c.Codigo_Cliente as Cliente
,p.bObs1
,p.bObs2
,p.bObs3
,convert(bit, iif((ObsRomaneio & Power(2, 1 - 1)) > 0, 1, 0)) as bObsRomaneio1
,convert(bit, iif((ObsRomaneio & Power(2, 2 - 1)) > 0, 1, 0)) as bObsRomaneio2
,convert(bit, iif((ObsRomaneio & Power(2, 3 - 1)) > 0, 1, 0)) as bObsRomaneio3
,op.PrevisaoConclusao
into #tempCandidatos
from dbo.PedidosCandidatos t
inner join dbo.pedidos p on p.empresa = t.empresa
and p.numero = t.numero
left join dbo.Clientes_Agendamento ca on ca.codigo_cliente = p.cliente
inner join dbo.TiposPedido pp on pp.Codigo = p.Tipo_Pedido --14/09/15 leonice
inner join dbo.pedidosTotais tp on tp.empresa = t.empresa
and tp.numero = t.numero
inner join dbo.Transp t1 on t1.codigo_transp = p.transportadora
inner join dbo.clientes c on c.codigo_cliente = p.cliente
inner join dbo.Endereco e on e.cliente = p.cliente
and e.sequencia = p.endereco_entrega
inner join #tempOpitens op on op.numero = t.numero
and op.empresa = t.empresa
left join dbo.PedidosLiberaFaturamento pf on pf.idPedido = p.id
left join dbo.vPedidosVidrosMyHome vd on vd.idPedido = p.id
left join TempPedidosEmpenhados pd on pd.empresa = t.empresa
and pd.numero = t.numero
-- adicionar Kasa K à regra para trazer pedidos não programados aqui...
where (
(pd.empresa is null)
or (
(p.marca in (6, 9))
and (p.Data_Programacao is null)
)
)

select distinct t.PrevisaoConclusao
,pc.*
,t.Volumes
,t.VolAcessorios
,t.LibFinan
,t.VolumesZero
,t.TVolumes
,t.TVolumesColetados
,t.TVolumesAtendidos
,t.Data
,t.Ordem_Compra
,pc.Faturamento as Data_Base
,t.Razao_Social
,t.UF
,t.Cidade
,t.Transp
,t.Frete
,t.OBS1
,t.OBS2
,t.OBS3
,t.PossuiVidro
,t.TipoPedido
,t.Marca
,pa.Agendado
,t.InfAgenda as Agendamento
,pr.Atendido as Estruturas
,'''' as Lotes
,PedidoData_Base
,t.Cliente
,1 as AdicionaEmRomaneio
,t.Transportadora
,t.bObs1
,t.bObs2
,t.bObs3
,t.bObsRomaneio1
,t.bObsRomaneio2
,t.bObsRomaneio3
from dbo.PedidosCandidatos pc
left join dbo.PrgMetalAtendidos pr on pr.empresa = pc.empresa
and pr.numero = pc.numero
inner join dbo.itensped ip on ip.empresa = pc.empresa
and ip.numero = pc.numero
--inner join dbo.vitenscompostos ic on ic.referencia = ip.item
inner join dbo.vMovel m1 on m1.referencia = ip.item
inner join #tempCandidatos t on t.empresa = pc.empresa
and t.numero = pc.numero
left join [dbo].[Pedidos_Agendamento] pa on pa.empresa = pc.empresa
and pa.numero = pc.numero
-- where (pc.numero = 2258069) or not (suser_sname() = ''KAPPESBERG\\\\\\\\juliano'')
where pc.Numero in (2787617, 2787388)
order by pc.Prioridade desc
,pc.Faturamento;

drop table #tempopitens

drop table #tempCandidatos
GOSTEI 0
Imex

Imex

24/08/2020

Você pode postar um exemplo com uma amostra de dados (2 casos, um com null na PrevisaoConclusao e um sem null, somente colunas relevantes) das tabelas ItensPed e OpItens, e o respectivo resultado esperado?
GOSTEI 0
Bruno

Bruno

24/08/2020

Itensped serve para ligar a opitens, para depois ligar com as outras tabelas,pois nela tem o número do pedido para ligar com outras tabelas e o item para ligar com a opitens.

Exemplo 1:
A PrevisaoConclusao da última programação é null para o item UZ200-VM, antes tem as últimas datas que foram colocadas. Até a mais antiga de 2014 por exemplo que é null também e no meio tem umas datas com previsao de conclusão. No item UZ230-VEM a última data que está em programação tem data de previsao. As datas antigas que não estão em programação não podem ser puxadas. O que ajuda é opi.quantidade>opi.coletada para não pegar as datas que já foram coletadas.

No Exemplo 1:
UZ200-VM
DataBase PrevisaoConclusao
20/06/2014 null
26/08/2018 02/09/2018
30/08/2020 null

UZ230-VEM

20/07/2014 null
27/08/2019 null
31/08/2020 05/09/2020

No exemplo 1: deve pegar a data null, pois o item UZ200-VM tem a data PrevisaoConclusao que está em programação = null.

Exemplo 2:
Exemplo 1:
UZ240-VM
DataBase PrevisaoConclusao
20/06/2014 null
26/08/2018 02/09/2018
30/08/2020 03/09/2020

UZ270-VEM

20/07/2014 null
27/08/2019 null
31/08/2020 05/09/2020

No exemplo 2: deve pegar a data 05/09/2020, pois o item UZ270-VEM tem a maior data de PrevisaoConclusao que está em programação. Que é igual a 05/09/2020.

Obrigado desde já !
GOSTEI 0
Imex

Imex

24/08/2020

Não consegui entender a estrutura das tabelas ItensPed e OpItens. Acho que vai facilitar se você postar um exemplo com as colunas relevantes dessas tabelas separadamente, alguns valores e o respectivo resultado esperado.
Uma dúvida que tenho por exemplo é como você consegue identificar quais são os itens de um determinado pedido?
Nesse exemplo que você postou agora você acrescentou essa coluna Database e também citou esse critério das datas coletadas mas não consegui entender como direito o funcionamento.
GOSTEI 0
Bruno

Bruno

24/08/2020

Na itensped me mostra os itens do pedido.
Por exemplo:
pedido numero 2789183
Possui os itens 054345 e 054459

Na opitens são os itens que estiveram em produção e os que estão em produção.

Por exemplo:
Uz200-vm
Data base(data que foi colocada em produção) exemplo:02/09/2020(a última vez que o item foi colocado em produção)
A previsão para concluir é 07/09/2020 que no caso é a coluna PrevisaoConclusao.

Na opitens aparece as datas bases antigas também.
Por Exemplo:
Uz200-vm
Data base
Exemplo:04/08/2018 com previsão null.
Para diferenciar as novas das antigas pode ser usado as colunas quantidade > coletada .
Exemplo: data base(05/08/2018)
quantidade =70 coletada = 70
Data base 02/09/2020
Quantidade = 80 coletada = 0

Vamos ao exemplo:
Pedido 289765:
Itensped:
Uz100-vm
Uz200-vm
Uz300-vem

Opitens
Item DataBase. PrevisaoConclusao
Uz100-vm. 02/08/2018. Null
Uz100-vm. 02/09/2020. 07/09/2020 em produ
Uz200-vm. 02/07/217. Null
Uz200-vm. 02/09/2020. 08/09/2020. Em produ
Uz300-vem. 07/10/2014. Null
Uz300-vem 02/09/2020. Null. Em producao
Então deve trazer null , pois o item uz300-vem
Que está em produção está null, as datas antigas deve-se desconsiderar como explicado para quantidade > coletada significando que não está em produção.

Se todas datas previsão conclusão estiver com uma data então deve pegar a maior data de um dos três itens.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/08/2020

nessa Opitens deveria ter o número do pedido.
se a produção foi solicitada por um pedido, preenche o campo.
se a procução foi solicitada para compor o estoque, o campo do pedido fica em branco.

se não fizer isso não tem como fazer o link entre a produção e a venda.

GOSTEI 0
Bruno

Bruno

24/08/2020

Problema que esta opitens serve para produzir o item para qualquer pedido que necessite do item ,não em específico para aquele pedido.
GOSTEI 0
Imex

Imex

24/08/2020

Pode existir mais de um pedido para o mesmo item e da mesma empresa?
Se pode, acho que o resultado pode não ser exato para um determinado pedido.
GOSTEI 0
Bruno

Bruno

24/08/2020

Pse aí mora outro problema ,mas queria resolver esse pra depois ver o próximo que teria que olhar o saldo
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/08/2020

se "coletada" serve como filtro, tente algo assim:
select
    it.Empresa
    ,it.Item
    ,max(case when opi2.Item is null then opi.PrevisaoConclusao else null end) as PrevisaoConclusao
    into #tempOpitens -- retire para testar a query
from
    itensped it
left join
    opitens opi on
    opi.Empresa = it.Empresa and
    opi.item = it.Item and
    opi.Coletada < opi.Quantidade and
    not (opi.PrevisaoConclusao is null)
left join
    opitens opi2 on
    opi2.Empresa = it.Empresa and
    opi2.Item = it.Item and
    opi2.Coletada < opi2.Quantidade and
    opi2.PrevisaoConclusao is null
--where it.Numero in (2787617, 2787388)
group by
    it.Empresa, it.Item
GOSTEI 0
Bruno

Bruno

24/08/2020

select
it.Empresa
,max(case when opi2.Item is null then opi.PrevisaoConclusao else null end) as PrevisaoConclusao
,it.Numero
from
itensped it
left join
opitens opi on
opi.Empresa = it.Empresa and
opi.item = it.Item and
opi.Coletada < opi.Quantidade and
not (opi.PrevisaoConclusao is null)
left join
opitens opi2 on
opi2.Empresa = it.Empresa and
opi2.Item = it.Item and
opi2.Coletada < opi2.Quantidade and
opi2.PrevisaoConclusao is null
where it.Numero in (2788986, 2787440)
group by
it.Empresa, it.Numero

Fiz pelo número e deveria me trazer null pois tem datas null, mas por item está trazendo correto
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/08/2020

não tem como fazer por número se você não tem o numero na opitens (e isto é uma falha).
GOSTEI 0
Bruno

Bruno

24/08/2020

A opitens são apenas os itens em produção, depois que são direcionadas para os pedidos, pois não terá sempre uma ordem lógica de pedidos, pode alterar a ordem
GOSTEI 0
POSTAR