Deletar registros de várias tabelas usando execute block

03/02/2013

2

Olá amigos do fórum
tenho um problema que já está me persiguindo há alguns dias e talvez alguém dos amigos do fórum possa me ajudar.
tenho 4 tabelas Vendas(VENDAS), Itens da Venda(VENDAITENS), Lançamentos do Caixa(LANCAMENTOS)e Contas Pagas(CTAPAGAS).Montei um execute block para zerar a movimentação dessas tabelas dado um período inicial e final. O script é este abaixo:
EXECUTE BLOCK(
DATA1 DATE = :DATA1,
DATA2 DATE = :DATA2
)
AS
DECLARE VARIABLE DATAVENDA DATE;
DECLARE VARIABLE IDVENDA INTEGER=0;
BEGIN
FOR SELECT
VENDAS.DATA, VENDAS.IDVENDA FROM VENDAS
WHERE
VENDAS.DATA BETWEEN :DATA1 AND :DATA2 AND VENDAS.COO IS NULL
INTO :DATAVENDA, :IDVENDA
AS CURSOR CRVENDAS
DO
BEGIN
DELETE FROM VENDAITENS WHERE VENDAITENS.IDVENDA = :IDVENDA;
DELETE FROM VENDAS WHERE CURRENT OF CRVENDAS;
DELETE FROM LANCAMENTOS WHERE DATA = :DATAVENDA;
DELETE FROM CTAPAGAS WHERE DATA = :DATAVENDA;
END
END


Dessa forma ele exclui, só que para um período de 2 dias exemplo: 10/01/2013 a 12/01/2013 ela demora cerca de 5 minutos para excluir, está muito lento. Algum dos amigos conhece uma outra forma de otimizar essa operação ? Pq suponho o seguinte, se para excluir a movimentação de 2 dias demora 5 minutos imaginem para excluir 2 meses então...
Desde já agradeço a quem possa me ajudar!
Responder

Posts

04/02/2013

Rafael Cunha

Tenta conforme abaixo, caso o seu relacionamento com VENDAITENS for Delete Cascate ao deletar uma venda o mesmo irá deleta os itens da venda.

EXECUTE BLOCK(
DATA1 DATE = :DATA1,
DATA2 DATE = :DATA2
)
AS
BEGIN
DELETE FROM VENDAS
VENDAS.DATA BETWEEN :DATA1 AND :DATA2 AND VENDAS.COO IS NULL

DELETE FROM LANCAMENTOS WHERE DATA BETWEEN :DATA1 AND :DATA2;

DELETE FROM CTAPAGAS WHERE DATA BETWEEN :DATA1 AND :DATA2;
END
Responder
Então Rafael, na tabela de venda e vendasitens eu tinha esse relacionamento, mas o problema é que quando eu excluía com esse relacionamento demorava mais ainda.... por essa razão eu tirei a foreign key, dessa forma eu deleto primeiro os itens e depois a venda, entendeu?
Responder