Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bom dia Senhores,
Tenho em meu projeto, uma tabela que mostra quando o item entrou em Ruptura, ou seja, quando seu estoque zerou,
em uma segunda tabela, eu tenho a data que foi feito o pedido deste mesmo produto, montei uma estrutura +/- assim:
PROD_RUPTURA:
LOAD
unidade,
codigo_produto,
MIN(DATE(data_ruptura)) as data_ruptura
Resident tbl_produtos
group by
unidade,
codigo_produto;
LEFT JOIN (PROD_RUPTURA)
LOAD
unidade,
codigo_produto,
data_pedido
Resident tbl_pedidos
O problema que nesta estrutura, se o produto X acabou o estoque no dia 22/02 por exemplo,
com o Join, eu vinculo os pedidos anteriores, ou seja, o produto acabou no dia 22 mas teve pedido no dia 18.
Preciso fazer uma condição que diga para vincular apenas os produtos com data do pedido maior ou igual a data da ruptura.
Se não houver pedido, este campo ficará nulo.
Como posso fazer isto?
Entendi Hamilton, e nesse caso voce teria que trazer estes campos na carga tambem mas sem inclui-los no group by... Uma forma de fazer isso (nao sei se vai atender ao que voce precisa) mas seria usando a funcao FirstSortedValue(), o exemplo abaixo tras o numero do pedido com a maior data sem quebrar a agregacao:
LEFT JOIN (TMP_PROD_RUPTURA)
LOAD
unidade,
codigo_produto,
max(data_pedido) as data_pedido,
firstsortedvalue(numero_pedido, -data_pedido) as numero_pedido
Resident tbl_pedidos
GROUP BY
unidade,
codigo_produto;
Ola Hamilton,
Voce pode adicionar uma nova carga depois para remover os pedidos anteriores a data de ruptura, voce pode renomear a sua tabela para TMP_PROD_RUPTURA para fazer o join e depois:
PROD_RUPTURA:
NOCONCATENATE
LOAD
unidade,
codigo_produto,
data_ruptura,
data_pedido
RESIDENT
TMP_PROD_RUPTURA WHERE data_ruptura <= data_pedido OR IsNull(data_pedido);
DROP TABLE TMP_PROD_RUPTURA;
Cesar,
funcionou certinho com um problema,
no primeiro JOIN, seguindo a mesma lógica do exemplo, o produto acabou no dia 22 e o último pedido que eu tenho foi no dia 18, portanto este item ainda não tem pedido, correto?
Se eu fizer esta exclusão data_ruptura <= data_pedido, ele vai deletar este item, ao invés de deixar o valor data_pedido nulo, eu vou ter informação apenas dos itens que foram pedidos, e não dos que não foram.
Tentei fazer um IF seguindo sua logica de carregar novamente a tabela:
if(data_pedido< data_ruptura ,'sem pedido', 'com pedido') as status_pedido
Porém se o produto X teve pedido ANTES e DEPOIS da ruptura, ele vai dizer que tem e que não tem pedido, duplicando a informação.
Entendi Hamilton, e se voce carregar somente os ultimos pedidos de cada produto? Da mesma forma que voce faz com a ruptura mas usando Max(data_pedido). Dessa forma voce pode retirar a clausula WHERE:
PROD_RUPTURA:
NOCONCATENATE
LOAD
unidade,
codigo_produto,
data_ruptura,
if(data_pedido>=data_ruptura,data_pedido,null()) as data_pedido,
if(data_pedido< data_ruptura ,'sem pedido', 'com pedido') as status_pedido
RESIDENT
TMP_PROD_RUPTURA;
DROP TABLE TMP_PROD_RUPTURA;
Cesar, para fazer o MAX(date) eu preciso agrupar por número do pedido, então, qual é a maior data do pedido x? é a data dele mesmo hehe. vou fazer uma condição, exemplo, se a data do pedido for menor que a data do do produto, ele vair criar um campo chamado "Erro" por exemplo, ai eu deleto esse campo depois.
if(data_ruptura<data_pedido, "ERRO", data_pedido) as status_pedido
de momento deve funcionar.
Ola Hamilton,
Voce nao precisa necessariamente agregar pelo numero do pedido, certo? Se voce agregar pelo codigo do produto deve obter a maior data entre os pedidos.
Preciso sim Cesar, agrupar pelo numero do pedido e pela data da baixa ainda,
eu posso ter mais de um pedido no mesmo item, e o pedido pode ou ter sido recebido (baixado)
pois preciso analisar entre pedido e recebimento.
Entendi Hamilton, e nesse caso voce teria que trazer estes campos na carga tambem mas sem inclui-los no group by... Uma forma de fazer isso (nao sei se vai atender ao que voce precisa) mas seria usando a funcao FirstSortedValue(), o exemplo abaixo tras o numero do pedido com a maior data sem quebrar a agregacao:
LEFT JOIN (TMP_PROD_RUPTURA)
LOAD
unidade,
codigo_produto,
max(data_pedido) as data_pedido,
firstsortedvalue(numero_pedido, -data_pedido) as numero_pedido
Resident tbl_pedidos
GROUP BY
unidade,
codigo_produto;
Cesar, muito obrigado. Não conhecia este comando.
Fiz da seguinte forma:
MAX(DATE(data_pedido)) as data_pedido,
firstsortedvalue(ID_PEDIDOC, -data_pedido) as numero_pedido,
firstsortedvalue(data_baixa, -data_pedido) as data_baixapedido
Assim eu trago o numero do pedido com a maior data
e a baixa com a maior data do pedido, acredito que de certo.
Obrigado novamente pelo retorno.
Abraço.