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:
a primeira parte do codigo eu consegui fazer com um loop, Segue o codigo:
a segunda parte não tem loop porque o Mysql nao esta aceitando. Como seria a procedure Mysql baseada na procedure do firebird??
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
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)