locked
Cursor - Data + Function RRS feed

  • Pergunta

  • Bom dia pessoal,

    estou precisando carregar os dados de estoque para uma tabela, e, preciso que seja inserido o saldo do dia nesta tabela, por ex:
    Item   Data                 Saldo
    001   11/01/2019        500
    003   11/01/2019        300
    001   12/01/2019        450
    003   12/01/2019        350

    Tenho uma function do SAP que traz estes dados pra mim, mas, como eu preciso fazer retroativo, gostaria de usar um cursor pra ir colocando as datas automaticamente pra mim.
    A mesma data que passo por parâmetro na function teria que ser a data do campo [Data do Estoque]
    A function que utilizo é esta:

    SELECT 
    		T0.ItemCode, T0.Quantity, T1.WhsName, '2019-11-30' AS [Data Estoque]
    FROM 
    		ufnStockAndCostHistory('2019-11-30','All') t0
    		JOIN OWHS T1 ON  T1.WhsCode=T0.WhsCode
    where 
    T0.whscode in ('0001','0004','0005','0006','0007','0008','0009','0010','0011','0013','EVD')
    
    ORDER BY 1
    Seria possível ?

    Obrigado à todos.

    segunda-feira, 9 de dezembro de 2019 14:24

Respostas

Todas as Respostas

  • Mateus,

    Quais os valores podem ser passados no segundo parâmetro da function ufnStockAndCostHistory?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 9 de dezembro de 2019 16:43
  • Amigos, obrigado pela ajuda.
    A function é esta abaixo.
    O primeiro parâmetro é a data e, o segundo o item, contudo, eu vou colocar uma data por ex: 30/11/2019 (no script '2019-11-30' e o ponteiro preciso que faça recursivo, desde o início das nossas operações (06/2016 :P), mas posso fazer de 100 em 100 se for o caso também.
    Gratidão à todos vocês !!

    CREATE FUNCTION [dbo].[ufnStockAndCostHistory]
    (	
    	@EndDate DATETIME, @ItemCode NVARCHAR(255) = 'All'
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
    	WITH Cost AS (
    		SELECT
    			OINM.TransNum,
    			OINM.ItemCode,
    			OINM.Warehouse,
    			OINM.Balance,
    			OINM.CreateDate
    		FROM OINM (NOLOCK)
    			JOIN OITM (NOLOCK) ON OITM.ItemCode = OINM.ItemCode
    			JOIN OITB (NOLOCK) ON OITM.ItmsGrpCod=OITB.ItmsGrpCod
    		WHERE  OINM.CreateDate <= @EndDate
    
    	),
    	FinalCostByWarehouse AS (
    		SELECT *
    		FROM Cost 
    		WHERE TransNum = (
    			SELECT MAX(TransNum)
    			FROM Cost sub
    			WHERE Cost.ItemCode = sub.ItemCode
    				AND Cost.Warehouse = sub.Warehouse)
    	),
    	Quantity AS (
    		SELECT
    			OINM.ItemCode,
    			OINM.Warehouse,
    			SUM(OINM.InQty) - SUM(OINM.OutQty) [Qty]
    		FROM OINM (NOLOCK)
    			JOIN OITM (NOLOCK) ON OITM.ItemCode = OINM.ItemCode
    			JOIN OITB (NOLOCK) ON OITM.ItmsGrpCod=OITB.ItmsGrpCod
    		WHERE OINM.CreateDate <= @EndDate
    		group by OINM.ItemCode, OINM.Warehouse
    	)
    	SELECT 
    		OITW.ItemCode,
    		OITW.WhsCode,
    		c.Balance [Cost],
    		q.Qty [Quantity]
    	FROM OITW
    		LEFT JOIN FinalCostByWarehouse c ON OITW.ItemCode = c.ItemCode
    			AND OITW.WhsCode = c.Warehouse
    		LEFT JOIN Quantity q ON OITW.ItemCode = q.ItemCode
    			AND OITW.WhsCode = q.Warehouse
    	WHERE (OITW.ItemCode = @ItemCode
    		OR @ItemCode = 'All')
    		AND (ISNULL(c.Balance,0) > 0
    			OR ISNULL(q.Qty,0) > 0)
    )

    segunda-feira, 9 de dezembro de 2019 17:06
  • Mateus,

    O resultado processado por esta Function retornado em um tabela criada dentro da função, de alguma forma será reaproveitado somente na sua query ou armazenado em alguma outra tabela?

    Pois analisando o seu código tenho a impressão que o conjunto de resultados gerados poderá ser útil justamente para filtrar as dados que seja, mas não apresenta uma forma de controle.

    Por isso estou perguntando se você iria direcionar ele para alguma outra tabela?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 9 de dezembro de 2019 18:04
  • Deu certinho o seu cursor José, 

    Eu estou populando uma tabela (Para utilizar no Qliksense posteriormente) com estes dados antigos e, depois, vou rodar apenas 1x por dia, com a data atual, apenas para inserir o saldo daquele dia.
    Cada mês aproximadamete me traz 10.000 linhas, foi super rápido.
    Temos cerca de 800 itens por depósito, quando coloco apenas 1 dia, é instantâneo.

    Muito grato mesmo pela ajuda.
    segunda-feira, 9 de dezembro de 2019 18:31
  • Oi Junior,

    sim, estou armazenando em outra tabela só os valores.
    Eu vou criar dashboards no qliksense com estes dados, para efeito de controle do MRP da área produtiva.

    Muito obrigado pela força !

    segunda-feira, 9 de dezembro de 2019 18:33
  • Oi Junior,

    sim, estou armazenando em outra tabela só os valores.
    Eu vou criar dashboards no qliksense com estes dados, para efeito de controle do MRP da área produtiva.

    Muito obrigado pela força !

    Mateus,

    Ok, qualquer coisa estamos por aqui.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 9 de dezembro de 2019 19:59