GARANTIR DESCONTO

Fórum Migrar banco Firebird para Mysql #559189

12/07/2016

0

Bom dia estou migrando um banco firebird para MySql e a estrutura para criar stored procedure é bem diferente tenho o seguinte código:

create or alter procedure ATUALIZA_PRECOCUSTOENTRADA
as
declare variable ICODCOMPRA integer;
declare variable INUMITEM integer;
declare variable IQUANTITEM double precision;
declare variable IQTDUND double precision;
declare variable IVALORITEM double precision;
declare variable CPDATACOMPRA date;
declare variable CPVLTOTALPRODUTOS double precision;
declare variable LPERC float;
declare variable IVLFRETE float;
declare variable IVLSEGURO float;
declare variable IVLOUTRAS float;
declare variable IVLDESCONTO float;
declare variable IVLIPI float;
declare variable IVLICMSSUBS float;
declare variable LCUSTO float;
declare variable LCUSTOMEDIO float;
declare variable LVALORITEM float;
declare variable PCODPROD varchar(14);
declare variable ICCODPROD varchar(14);
declare variable CPDATAULTIMACOMPRA date;
begin 
    for select itensCompra.codcompraprod, itenscompra.numitem, itenscompra.quantitem, itenscompra.qtdeunid, itenscompra.valoritem, 
               ComprasProd.datacompraprod, ComprasProd.totalprodutoscompraprod, ComprasProd.valorfretecompraprod, 
               ComprasProd.valorsegurocompraprod, ComprasProd.valoroutrasdescompraprod, ComprasProd.desccompraprod, 
               ComprasProd.valoripicompraprod, ItensCompra.valoricmssubs 
        from itensCompra 
        inner join ComprasProd on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
        where ((itensCompra.customedio is null) or (itensCompra.customedio = 0)) 
        order by ComprasProd.datacompraprod, itensCompra.numitem 
        into iCodCompra, iNumItem, iQuantItem, iQtdUnd, iValorItem, cpDataCompra, cpVlTotalProdutos, 
             iVlFrete, iVlSeguro, iVlOutras, iVlDesconto, iVlIPI, iVlIcmsSubs do 
        begin 
            lValorItem = ((iQuantItem * iQtdUnd) * iValorItem); 
            lPerc = (lValorItem / cpVlTotalProdutos) * 100; 
            if (iVlFrete is not null) then 
                iVlFrete = (iVlFrete * lPerc) / 100; 
            if (iVlSeguro is not null) then 
                iVlSeguro = (iVlSeguro * lPerc) / 100; 
            if (iVlOutras is not null) then 
                iVlOutras = (iVlOutras * lPerc) / 100; 
            if (iVlDesconto is not null) then 
                iVlDesconto = (iVlDesconto * lPerc) / 100; 
            if (iVlIPI is not null) then 
                iVlIPI = (iVlIPI * lPerc) / 100; 
            if (iVlIcmsSubs is not null) then 
                iVlIcmsSubs = (iVlIcmsSubs * lPerc) / 100; 
            lCusto = lValorItem - iVlDesconto + iVlSeguro + iVlOutras + iVlFrete + iVlIcmsSubs + iVlIPI; 
            lCustoMedio = lCusto / (iQuantItem * iQtdUnd); 
            update itenscompra set itenscompra.precocusto = :lCusto, itenscompra.customedio = :lCustoMedio 
            where itenscompra.codcompraprod = :iCodCompra and itenscompra.numitem = :iNumItem; 
        end 
/*Atualizando tabela produtos com ultimo custo */ 
        for select Produtos.codprod 
        from Produtos 
        into pCodProd do 
        begin 
             select max(comprasprod.datacompraprod)DtUltimaCompra 
             from ComprasProd 
             inner join ItensCompra on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
             where ItensCompra.codprod = :pCodProd 
             into cpDataUltimaCompra; 
             for select distinct(ItensCompra.CodProd), ItensCompra.customedio 
             from ItensCompra 
             inner join ComprasPRod on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
             where ItensCompra.codprod = :pCodProd and ComprasProd.datacompraprod = :cpDataUltimaCompra 
             into icCodProd, lCustoMedio do 
             begin 
                  update produtos set Produtos.precocusto = :lcustomedio where produtos.codprod = :pCodProd; 
                  break; 
             end 
        end 
end



a primeira parte do codigo eu consegui fazer com um loop, Segue o codigo:


create procedure dados_principal.ATUALIZA_PRECOCUSTOENTRADA()
begin
  declare  ICODCOMPRA int;
  declare  INUMITEM int;
  declare  IQUANTITEM double precision;
  declare  IQTDUND double precision;
  declare  IVALORITEM double precision;
  declare  CPDATACOMPRA date;
  declare  CPVLTOTALPRODUTOS double precision;
  declare  LPERC float;
  declare  IVLFRETE float;
  declare  IVLSEGURO float;
  declare  IVLOUTRAS float;
  declare  IVLDESCONTO float;
  declare  IVLIPI float;
  declare  IVLICMSSUBS float;
  declare  LCUSTO float;
  declare  LCUSTOMEDIO float;
  declare  LVALORITEM float;
  declare  PCODPROD varchar(14);
  declare  ICCODPROD varchar(14);
  declare  CPDATAULTIMACOMPRA date;
  declare  done INT default false;
  
  /*Declarar um cursor é equivalente a criar uma query no delphi e atribuir à query o sql que ela vai execytar*/

  declare cur_itensCompra cursor for select itensCompra.codcompraprod, itenscompra.numitem, itenscompra.quantitem, itenscompra.qtdeunid, itenscompra.valoritem, 
               ComprasProd.datacompraprod, ComprasProd.totalprodutoscompraprod, ComprasProd.valorfretecompraprod, 
               ComprasProd.valorsegurocompraprod, ComprasProd.valoroutrasdescompraprod, ComprasProd.desccompraprod, 
               ComprasProd.valoripicompraprod, ItensCompra.valoricmssubs 
        from itensCompra 
        inner join ComprasProd on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
        where ((itensCompra.customedio is null) or (itensCompra.customedio = 0)) 
        order by ComprasProd.datacompraprod, itensCompra.numitem;
    
  declare cur_Produtos cursor for select Produtos.codprod from Produtos;

  declare continue handler for not found set done = true;

  open cur_itensCompra; /*Abrir o cursor e como abrir uma query no delphi*/

  itensCompra_loop: LOOP  /*Equivalente ao for select do firebird*/
    FETCH cur_itensCompra  into iCodCompra, iNumItem, iQuantItem, iQtdUnd, iValorItem, cpDataCompra, cpVlTotalProdutos, 
             iVlFrete, iVlSeguro, iVlOutras, iVlDesconto, iVlIPI, iVlIcmsSubs;
    IF done THEN
      LEAVE itensCompra_loop; /*Sai do cursor*/
    END IF;
    set lValorItem = ((iQuantItem * iQtdUnd) * iValorItem); 
    set lPerc = (lValorItem / cpVlTotalProdutos) * 100; 
    if (iVlFrete is not null) then
      set iVlFrete = ((iVlFrete * lPerc) / 100); 
    end if;
    if (iVlSeguro is not null) then 
        set iVlSeguro = (iVlSeguro * lPerc) / 100;
    end if;     
    if (iVlOutras is not null) then 
        set iVlOutras = (iVlOutras * lPerc) / 100; 
    end if;
    if (iVlDesconto is not null) then 
        set iVlDesconto = (iVlDesconto * lPerc) / 100; 
    end if;
    if (iVlIPI is not null) then 
        set iVlIPI = (iVlIPI * lPerc) / 100; 
    end if;
    if (iVlIcmsSubs is not null) then 
        set iVlIcmsSubs = (iVlIcmsSubs * lPerc) / 100; 
    end if;
    
    set lCusto = lValorItem - iVlDesconto + iVlSeguro + iVlOutras + iVlFrete + iVlIcmsSubs + iVlIPI; 
    set lCustoMedio = lCusto / (iQuantItem * iQtdUnd); 
      
    update itenscompra set itenscompra.precocusto = lCusto, itenscompra.customedio = lCustoMedio 
            where itenscompra.codcompraprod = iCodCompra and itenscompra.numitem = iNumItem;  

  END LOOP;   
  close cur_itensCompra; /*Fechar o cursor e como fechar uma query no delphi*/
  
    /*Segunda parte procedure*/
  set done = false;
  
  open cur_Produtos;
  
  fetch cur_Produtos into pCodProd;
  
  select max(comprasprod.datacompraprod)DtUltimaCompra 
  from ComprasProd 
  inner join ItensCompra on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
  where ItensCompra.codprod = pCodProd into cpDataUltimaCompra;
  
  select distinct(ItensCompra.CodProd), ItensCompra.customedio 
             from ItensCompra 
             inner join ComprasPRod on (ComprasProd.codcompraprod = ItensCompra.codcompraprod) 
             where ItensCompra.codprod = pCodProd and ComprasProd.datacompraprod = cpDataUltimaCompra 
             into icCodProd, lCustoMedio ;

  update produtos set Produtos.precocusto = lcustomedio where produtos.codprod = pCodProd;
  close cur_Produtos;

end;




a segunda parte não tem loop porque o Mysql nao esta aceitando. Como seria a procedure Mysql baseada na procedure do firebird??
Fabio Cardoso

Fabio Cardoso

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar