none
MIGRAR PROCEDURE FIREBIRD PARA SQL SERVER 2014 RRS feed

  • Pergunta

  • Pessoal, Gostaria de transformar esta procedure firebird em SQLSERVER e estou sem saber como faço.

    Ela funciona perfeitamente no firebird.

    CREATE PROCEDURE ARESSUPRIMENTO(

      PDATA1 DATE,
      PDATA2 DATE,
      PP DOUBLE PRECISION,
      TR DOUBLE PRECISION,
      PFILIAL INTEGER)
    RETURNS(
      CODIGO INTEGER,
      DESCRICAO VARCHAR(80) CHARACTER SET NONE,
      APRESENT VARCHAR(20) CHARACTER SET NONE,
      EST_ATUAL DOUBLE PRECISION,
      CMM DOUBLE PRECISION,
      EMIN DOUBLE PRECISION,
      QR1 DOUBLE PRECISION)
    AS
    declare variable qr double precision;
    begin
        QR=0;
         for select a.codigop,A.descricao, A.apresentacao  from estoque  A
         order by a.descricao
         into   :codigo,:descricao, :apresent
        DO
        BEGIN

        for select  coalesce(sum(B.qtd_disp_und),0)
        from estoque_lote  B
        WHERE b.filial=:pfilial and b.codigop=:CODIGO


        into   :EST_ATUAL
         do
        begin

         for select    coalesce (sum(c.qtd),0)/(:pp)
              from consumopaciente  c
         WHERE  c.filial=:pfilial and c.codigop=:CODIGO  and c.data between :pdata1 and :pdata2
         into   :CMM

        do
        begin

        emin=cmm*tr;

        QR=((cmm*tr)+emin)-EST_ATUAL;

        qr1=qr;
        if (QR1<0) then
        BEGIN
        QR1=0;
        END
        if (CMM<0) then
        BEGIN
        CMM=0;
        END

        if (EMIN<0) then
        BEGIN
        EMIN=0;
        END
         suspend;
        end
    end
    end
    end

    • Editado MARECHAL.AL segunda-feira, 22 de fevereiro de 2016 18:24
    segunda-feira, 22 de fevereiro de 2016 18:11

Respostas

  • Boa tarde,

    Acredito que seja possível obter o resultado esperado com uma query. 

    Experimente fazer alguns testes:

    select 
        a.codigop,
        a.descricao, 
        a.apresentacao,
        est.EST_ATUAL,
        case when con.cmm < 0 then 0 else con.cmm as cmm,
        case when calc.emin < 0 then 0 else calc.emin as emin,
        case when calc.qr1 < 0 then 0 else calc.qr1 as qr1
    from estoque as a
    cross apply
    (
        select coalesce(sum(B.qtd_disp_und), 0) as EST_ATUAL
        from estoque_lote  B
        WHERE 
            b.filial = @pfilial and 
            b.codigop = a.codigop
    ) as est
    cross apply
    (
        select coalesce(sum(c.qtd), 0) / @pp as CMM
        from consumopaciente  c
        WHERE  
            c.filial = @pfilial and 
            c.codigop = a.codigop and 
            c.data between @pdata1 and @pdata2
    ) as con
    cross apply
    (
        select 
            con.cmm * @tr as emin, 
            con.cmm * @tr + con.cmm * @tr - est.EST_ATUAL as QR1
    ) as calc
    order by 
        a.descricao
    

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 19:36
    segunda-feira, 22 de fevereiro de 2016 18:32
  • ESTÁ DANDO ERRO NO CASE, QUANDO RETIRO ELE, ELA COMPILA PORÉM OS VALORES DAS COLUNAS

    ESTOQUE MINIMO, CONSUMO MEDIO MENSAL E QUANTIDADE REPOSIÇÃO SAEM ZERADOS

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 18:53
  • MARECHAL.AL,

    Tente a solução apresentada pelo gapimex.

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 19:00
  • Marechal, faltou o End dos Cases:

        case when con.cmm < 0 then 0 else con.cmm end as cmm,
        case when calc.emin < 0 then 0 else calc.emin end as emin,
        case when calc.qr1 < 0 then 0 else calc.qr1 end as qr1
    

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 19:37
    segunda-feira, 22 de fevereiro de 2016 19:07
  • só mais uma coisa, caso queira listar apenas o que tem estoque_atual >=1?

    Desde já agradeço.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 19:30
  • Acho que você pode acrescentar a clausula Having na query para obter o estoque:

    cross apply
    (
        select sum(B.qtd_disp_und) as EST_ATUAL
        from estoque_lote  B
        WHERE 
            b.filial = @pfilial and 
            b.codigop = a.codigop
        having 
            sum(B.qtd_disp_und) >= 1
    ) as est

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 20:23
    segunda-feira, 22 de fevereiro de 2016 19:46
  • PERFEITO!

    Muito Obrigado pelas dicas!

    Que Deus o abençoe... e cumpra o desejo do seu coração.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:23
    segunda-feira, 22 de fevereiro de 2016 20:09

Todas as Respostas

  • Boa tarde  MARECHAL.AL,

    Tudo bem?

    Você esqueceu de informar o erro/problema que está ocorrendo no desenvolvimento para que a comunidade possa auxiliar.

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 22 de fevereiro de 2016 18:18
  • Oi marcos SJ

    Essa procedure funciona perfeitamente no firebird e não sei como transformá-la para uso no sqlserver 

    segunda-feira, 22 de fevereiro de 2016 18:20
  • Boa tarde,

    Acredito que seja possível obter o resultado esperado com uma query. 

    Experimente fazer alguns testes:

    select 
        a.codigop,
        a.descricao, 
        a.apresentacao,
        est.EST_ATUAL,
        case when con.cmm < 0 then 0 else con.cmm as cmm,
        case when calc.emin < 0 then 0 else calc.emin as emin,
        case when calc.qr1 < 0 then 0 else calc.qr1 as qr1
    from estoque as a
    cross apply
    (
        select coalesce(sum(B.qtd_disp_und), 0) as EST_ATUAL
        from estoque_lote  B
        WHERE 
            b.filial = @pfilial and 
            b.codigop = a.codigop
    ) as est
    cross apply
    (
        select coalesce(sum(c.qtd), 0) / @pp as CMM
        from consumopaciente  c
        WHERE  
            c.filial = @pfilial and 
            c.codigop = a.codigop and 
            c.data between @pdata1 and @pdata2
    ) as con
    cross apply
    (
        select 
            con.cmm * @tr as emin, 
            con.cmm * @tr + con.cmm * @tr - est.EST_ATUAL as QR1
    ) as calc
    order by 
        a.descricao
    

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 19:36
    segunda-feira, 22 de fevereiro de 2016 18:32
  • Olá MARECHAL.AL,

    Então pelo que entendi você não está necessariamente com um erro. O fórum não presta suporte a "how to", de qualquer maneira, seguem alguns links com informações que talvez possam ser úteis para o que você precisa fazer:

    Link 00

    Link 01

    Link 02

    Link 03

    Link 04

    Link 05

    Link 06

    Link 07

    Link 08


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.



    • Editado Marcos SJ segunda-feira, 22 de fevereiro de 2016 18:58
    segunda-feira, 22 de fevereiro de 2016 18:36
  • ESTÁ DANDO ERRO NO CASE, QUANDO RETIRO ELE, ELA COMPILA PORÉM OS VALORES DAS COLUNAS

    ESTOQUE MINIMO, CONSUMO MEDIO MENSAL E QUANTIDADE REPOSIÇÃO SAEM ZERADOS

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 18:53
  • MARECHAL.AL,

    Tente a solução apresentada pelo gapimex.

    Atenciosamente


    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 19:00
  • Marechal, faltou o End dos Cases:

        case when con.cmm < 0 then 0 else con.cmm end as cmm,
        case when calc.emin < 0 then 0 else calc.emin end as emin,
        case when calc.qr1 < 0 then 0 else calc.qr1 end as qr1
    

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 19:37
    segunda-feira, 22 de fevereiro de 2016 19:07
  • só mais uma coisa, caso queira listar apenas o que tem estoque_atual >=1?

    Desde já agradeço.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:24
    segunda-feira, 22 de fevereiro de 2016 19:30
  • Acho que você pode acrescentar a clausula Having na query para obter o estoque:

    cross apply
    (
        select sum(B.qtd_disp_und) as EST_ATUAL
        from estoque_lote  B
        WHERE 
            b.filial = @pfilial and 
            b.codigop = a.codigop
        having 
            sum(B.qtd_disp_und) >= 1
    ) as est

    Espero que ajude


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

    • Marcado como Resposta Marcos SJ segunda-feira, 22 de fevereiro de 2016 20:23
    segunda-feira, 22 de fevereiro de 2016 19:46
  • PERFEITO!

    Muito Obrigado pelas dicas!

    Que Deus o abençoe... e cumpra o desejo do seu coração.

    • Marcado como Resposta MARECHAL.AL segunda-feira, 29 de fevereiro de 2016 17:23
    segunda-feira, 22 de fevereiro de 2016 20:09