none
Cursor de data RRS feed

  • Pergunta

  • Boa tarde pessoal,
    estou criando uma query para popular uma tabela onde constará os valores de estoque diários de cada item de nossa empresa.
    Contudo, como temos dados desde 2016, eu não gostaria de colocar dia por dia no script.
    É possível fazer um cursor para que o script rode dia após dia, eu colocando uma data inicial e uma final?
    Abaixo minha query para o SAP B1.
    Muito obrigado a todos!

    Declare @Datex Datetime
    SET @Datex = '2020-09-30'
    
    SELECT 
    T1.WhsName, 
    T0.ItemCode, 
    Max(T0.Dscription) 'Item Name', 
    SUM(T0.InQty-T0.OutQty) 'On Hand', 
    SUM(T0.TransValue)/SUM(T0.InQty-T0.OutQty) 
    'Avg Price', SUM(T0.TransValue) 'Amount',
    @Datex AS DATAESTOQUE
    
    FROM OINM T0
    JOIN OWHS T1 ON T1.WhsCode=T0.Warehouse
    WHERE T0.DocDate <= @Datex
    and T0.TransValue != 0
    and t0.ItemCode = 'eb014'
    
    GROUP BY T1.WhsName,T0.ItemCode
    
    Having SUM(T0.InQty-T0.OutQty) > 0

    terça-feira, 13 de outubro de 2020 19:03

Respostas

  • Boa tarde,

    Acho que você pode utilizar um While. Ex:

    Declare @Datex Datetime
    SET @Datex = '2020-09-30';
    Declare @DateFim Datetime;
    set @DateFim = '2020-10-31';
    
    while @Datex <= @DateFim
      begin
      
        -- query
      
        set @Datex = dateadd(day, 1, @Datex);
      end;
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 13 de outubro de 2020 20:15
  • Mateus,

    Não sei se entendi bem o sua necessidade, mas talvez poderíamos pensar em trabalhar com uma CTE gerando o calendário de datas e depois relacionar a mesma com a sua query.

    Veja se este exemplo poderá lhe ajudar:

    Declare @DataIni Date, @DataFim Date
    
    Set @DataIni = '20200901'
    Set @DataFim = '20201030'
    
    ;With CTE_Datas as
    (
        Select @DataIni As DataInicio, @DataFim As DataFim
        
        Union All
        
        Select DateAdd(Day, 1, DataInicio), DataFim
        From CTE_Datas
        Where DataInicio < DataFim
    )
    SELECT T1.WhsName, T0.ItemCode, 
           Max(T0.Dscription) 'Item Name', 
           SUM(T0.InQty-T0.OutQty) 'On Hand', 
           SUM(T0.TransValue)/SUM(T0.InQty-T0.OutQty) 
           'Avg Price', SUM(T0.TransValue) 'Amount',
           CTE.DataFim AS DATAESTOQUE
    FROM OINM T0 Inner JOIN OWHS T1 
                  ON T1.WhsCode=T0.Warehouse
                 Inner Join CTEDatas CTE
                  On T0.DocDate >= CTE.DataInicio And T0.DocDate <= CTE.DataFim
    Where T0.TransValue != 0
    and t0.ItemCode = 'eb014'
    GROUP BY T1.WhsName,T0.ItemCode, CTE.DataFim
    Having SUM(T0.InQty-T0.OutQty) > 0
    Go

    Ressalto que em nenhum momento levei em consideração as suas regras de negócio, bem como, o código acima é uma representação adaptada, pode contar erros, bem como não retornar os dados que você deseja.


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

    quarta-feira, 14 de outubro de 2020 16:34

Todas as Respostas

  • Boa tarde,

    Acho que você pode utilizar um While. Ex:

    Declare @Datex Datetime
    SET @Datex = '2020-09-30';
    Declare @DateFim Datetime;
    set @DateFim = '2020-10-31';
    
    while @Datex <= @DateFim
      begin
      
        -- query
      
        set @Datex = dateadd(day, 1, @Datex);
      end;
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 13 de outubro de 2020 20:15
  • Mateus,

    Não sei se entendi bem o sua necessidade, mas talvez poderíamos pensar em trabalhar com uma CTE gerando o calendário de datas e depois relacionar a mesma com a sua query.

    Veja se este exemplo poderá lhe ajudar:

    Declare @DataIni Date, @DataFim Date
    
    Set @DataIni = '20200901'
    Set @DataFim = '20201030'
    
    ;With CTE_Datas as
    (
        Select @DataIni As DataInicio, @DataFim As DataFim
        
        Union All
        
        Select DateAdd(Day, 1, DataInicio), DataFim
        From CTE_Datas
        Where DataInicio < DataFim
    )
    SELECT T1.WhsName, T0.ItemCode, 
           Max(T0.Dscription) 'Item Name', 
           SUM(T0.InQty-T0.OutQty) 'On Hand', 
           SUM(T0.TransValue)/SUM(T0.InQty-T0.OutQty) 
           'Avg Price', SUM(T0.TransValue) 'Amount',
           CTE.DataFim AS DATAESTOQUE
    FROM OINM T0 Inner JOIN OWHS T1 
                  ON T1.WhsCode=T0.Warehouse
                 Inner Join CTEDatas CTE
                  On T0.DocDate >= CTE.DataInicio And T0.DocDate <= CTE.DataFim
    Where T0.TransValue != 0
    and t0.ItemCode = 'eb014'
    GROUP BY T1.WhsName,T0.ItemCode, CTE.DataFim
    Having SUM(T0.InQty-T0.OutQty) > 0
    Go

    Ressalto que em nenhum momento levei em consideração as suas regras de negócio, bem como, o código acima é uma representação adaptada, pode contar erros, bem como não retornar os dados que você deseja.


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

    quarta-feira, 14 de outubro de 2020 16:34
  • Muito obrigado Junior!
    Deu certinho aqui, assim como a do nosso amigo Gapimex.
    No caso, eu utilizei a sugestão dele neste script atual pois preciso que todos os dias eu tenha um registro e, como alguns dias não há movimentação, o CTE deixou de inseri-los.
    De qualquer forma, sou muito grato pela ajuda!

    Abraços!!

    quarta-feira, 14 de outubro de 2020 18:51
  • Show de bola!!
    Me atendeu perfeitamente.
    Todos os dias com dados do estoque.
    Muito obrigado!!!

    Abraços!

    quarta-feira, 14 de outubro de 2020 18:52
  • Muito obrigado Junior!
    Deu certinho aqui, assim como a do nosso amigo Gapimex.
    No caso, eu utilizei a sugestão dele neste script atual pois preciso que todos os dias eu tenha um registro e, como alguns dias não há movimentação, o CTE deixou de inseri-los.
    De qualquer forma, sou muito grato pela ajuda!

    Abraços!!

    Mateus,

    Que bom, fico feliz, ótimo agora você tem duas alternativas para resolver o mesmo problema.


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

    quarta-feira, 14 de outubro de 2020 22:54