none
PRECISO SELECIONAR OS LOTES E AS QUANTIDADES ATÉ QUE COMPLETEM A QUANTIDADE DA VENDA. É POSSÍVEL ISSO PELO SQL SERVER? RRS feed

  • Pergunta



  • ----TABELA PRODUTO

    IDPRODUTO    NOME
    1            XXXXXXX
    2            YYYYYYY


    ----TABELA LOTE

    IDLOTE  IDPRODUTO  NUMLOTE  SALDO   VALIDADE
    A1      1          123      20,00   01/10/20
    A5      1          524       5,00   22/11/20
    A88     1          177      80,00   17/01/21


    ----TABELA VENDA

    IDVENDA  IDPRODUTO  QUANTIDADE
    008      1           30,00


    PRECISO SELECIONAR OS LOTES E AS QUANTIDADES ATÉ QUE COMPLETEM A QUANTIDADE DA VENDA QUE SERIA 30 NESSE EXEMPLO.
    -- RESULTADO ESPERADO 
    IDLOTE IDPRODUTO QUANTIDADE
    A1     1         20,00
    A5     1         5,00
    A88    1         5,00
    quarta-feira, 1 de abril de 2020 19:27

Todas as Respostas

  • Boa tarde,

    Experimente fazer uns testes utilizando uma CTE recursiva mais ou menos conforme o exemplo abaixo:

    with 
        CTE_RN as
        (
            select
                v.IDPRODUTO,
                v.QUANTIDADE,
                l.IDLOTE,
                l.SALDO,
                row_number() over(partition by l.IDPRODUTO order by l.Validade) as RN
            from VENDA as v
            inner join LOTE as l
                on l.IDPRODUTO = v.IDPRODUTO
        ),
        
        CTE_REC as
        (
            select
                IDLOTE,
                IDPRODUTO,
                case when QUANTIDADE > SALDO
                    then SALDO
                    else QUANTIDADE
                end as QUANTIDADE,
                case when QUANTIDADE > SALDO
                    then cast(QUANTIDADE - SALDO as numeric(19, 2))
                    else 0
                end as RESTO,
                RN
            from CTE_RN
            where 
                RN = 1 
                
            union all
            
            select
                n.IDLOTE,
                r.IDPRODUTO,
                case when r.RESTO > n.SALDO
                    then n.SALDO
                    else r.RESTO
                end,
                case when r.RESTO > n.SALDO
                    then cast(r.RESTO - n.SALDO as numeric(19, 2))
                    else 0
                end,
                n.RN     
            from CTE_REC as r
            inner join CTE_RN as n
                on n.IDPRODUTO = r.IDPRODUTO and n.RN = r.RN + 1
            where
                r.RESTO > 0
        )
        
    select 
        IDLOTE,
        IDPRODUTO,
        QUANTIDADE 
    from CTE_REC

    Espero que ajude


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

    • Marcado como Resposta Romeu Souza quinta-feira, 2 de abril de 2020 13:32
    • Não Marcado como Resposta Romeu Souza quinta-feira, 2 de abril de 2020 13:33
    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 3 de abril de 2020 18:43
    quarta-feira, 1 de abril de 2020 21:03
  • Olá, isso será muito útil, agora tenho uma ideia melhor de como fazer. Muito obrigado.
    quinta-feira, 2 de abril de 2020 13:34