Selam;
Programda devir işlemi yapıyorum, yeni çalışma yılına eski verileri aktarmam gerekiyor, 11.415 adet kaydı aktarıyorum. Aktarımı while not eof ile döngüye sokarak stored procedure ile yapıyorum. Tabloda KOD, UYEKODU, TARIH, MAKBUZNO, BORC, ALACAK, ACIKLAMA şeklinde 7 alan var. Aktarım (döngü) bittikten sonrada commitretaining yapıyorum. Fakat döngü bazen 5000, bazende 10.000 gibi rakamlara ulaştığında aşağıdaki hatayı veriyor ve işlemi yarıda kesiyor. Sanırım firebird server ile alakalı bir durum.
Dynamic SQL error
SQL Error Code : -502
Invalid cursor declaration
Statement already has a cursor 14888517 (burdaki rakam değişiyor sürekli) assigned.
şeklinde hata veriyor, acaba sebebi nedir?
firebird veri aktarımı
Re: firebird veri aktarımı
Selamlar,
SPnin kodunu gönderir misin.
Bir de öyle bakalım.
SPnin kodunu gönderir misin.
Bir de öyle bakalım.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Re: firebird veri aktarımı
Kuri_YJ merhaba;
Sorunu şöyle hallettim;
Dediğim gibi kodu devir işlemleri için kullanıyordum, yeni çalışma yılına bütün üyeleri ve hareketleri döngü ile aktarıyordum fakat kayıt sayısı çoğalınca önce yazdığım hatayı vermeye başladı, bende vt yi yedek alıp, yeni vt adında kaydedip, devirde olmaması gereken kayıtları silerek devrediyorum sorunsuz ve çok hızlı çalışan bir şekilde olayı çözdüm.
Önceki hataya gelince, yaptığım araştırmalarda şu cursor olayının bu soruna sebep olduğunu okudum. Döngü çok fazla cursor oluşturuyordu sanırım fakat detaylı olarak neyin böyle bir hataya sebep olduğunu çözemedim. SQL sorgusuna gelince kısaca aşağıda yazacağım şekilde bir döngü idi.
Tablolarım ; UYE , GELIR, GIDER, UYE_HESAP (11475 kayıt bu tabloda idi) vs.vs.
Projede 2 Ayrı DATA bağlantısı ile 2 ayrı veritabanına ulaşıp, eski vt den yeni vt ye bilgileri aktarıyordum.
İşlemi direk sp ye yaptırmıyorum yani.
Sorunu şöyle hallettim;
Dediğim gibi kodu devir işlemleri için kullanıyordum, yeni çalışma yılına bütün üyeleri ve hareketleri döngü ile aktarıyordum fakat kayıt sayısı çoğalınca önce yazdığım hatayı vermeye başladı, bende vt yi yedek alıp, yeni vt adında kaydedip, devirde olmaması gereken kayıtları silerek devrediyorum sorunsuz ve çok hızlı çalışan bir şekilde olayı çözdüm.
Önceki hataya gelince, yaptığım araştırmalarda şu cursor olayının bu soruna sebep olduğunu okudum. Döngü çok fazla cursor oluşturuyordu sanırım fakat detaylı olarak neyin böyle bir hataya sebep olduğunu çözemedim. SQL sorgusuna gelince kısaca aşağıda yazacağım şekilde bir döngü idi.
Tablolarım ; UYE , GELIR, GIDER, UYE_HESAP (11475 kayıt bu tabloda idi) vs.vs.
Kod: Tümünü seç
QueryUYE : SELECT * FROM UYE (45 alanlı tablo)
QueryUYE.First;
WHILE NOT QueryUYE.EOF DO BEGIN
SP_UYE(UYE Kayıtları); // Stored Procedure ile yeni veritabanına uyeleri kaydet
QueryUYE_HESAP : SELECT * FROM UYE_HESAP WHERE uye_id=QueryUYEid.AsInteger (Döngüdeki üye nin hesap hareketlerini getir.)
QueryUYE_HESAP.First;
WHILE NOT QueryUYE_HESAP.EOF DO BEGIN
SP_UYE_HESAP(UYE_HESAP Kayıtları); // Stored Procedure ile yeni veritabanına uye hesaplarını aktar
QueryUYE_HESAP.Next;
END;
QueryUYE.Next;
END;
TRANS.CommitRetaining;
İşlemi direk sp ye yaptırmıyorum yani.
Re: firebird veri aktarımı
bir degisken olusturup döngünün icerisinde degiskenin degerini artiriniz.
degiskenin degeri 100'e ulastiginda commitretaining yapip degiskeni tekrar sifirlayiniz.
döngüden cikista tekrar commitretaining yapiniz.
Kolay gelsin.
degiskenin degeri 100'e ulastiginda commitretaining yapip degiskeni tekrar sifirlayiniz.
döngüden cikista tekrar commitretaining yapiniz.
Kod: Tümünü seç
procedure
begin
I := 0;
while not query.eof do
begin
islem;
Inc(I)
if I = 100 then
begin
Trans.Commitretaining;
I := 0;
end;
query.next;
end;
Trans.Commitretaining;
end;
kıdemsiz üye
Re: firebird veri aktarımı
Selam, her 100 döngüde değilde, her 500, 1000, 1500 döngüde bir denedim yine aynı hatayı verdi, sonuna kadar hiç gitmedi.ikra yazdı:bir degisken olusturup döngünün icerisinde degiskenin degerini artiriniz.
degiskenin degeri 100'e ulastiginda commitretaining yapip degiskeni tekrar sifirlayiniz.
döngüden cikista tekrar commitretaining yapiniz.Kolay gelsin.Kod: Tümünü seç
procedure begin I := 0; while not query.eof do begin islem; Inc(I) if I = 100 then begin Trans.Commitretaining; I := 0; end; query.next; end; Trans.Commitretaining; end;
Re: firebird veri aktarımı
Ben tabloları tek tek aktarmayı herzaman tercih ederim, yani önce üye bilgileri kaydeder ardından hesaplarını kaydederim. Ayrıca bu iş için sp kullanmak yerine delphi tarafında yapardım, kontrol etmesi daha kolay, table yada field değişikliklerinde db güncellemek sıkıntı olabilir. ayrıca
"if I mod 100 = 0 then " daha kısa, hatta 100 yerine değişken koyarak parametrik olarakta kullanabilirsiniz.
Kolay gele
"if I mod 100 = 0 then " daha kısa, hatta 100 yerine değişken koyarak parametrik olarakta kullanabilirsiniz.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Re: firebird veri aktarımı
Selamlar,
Bu tür durumlarda, CommitRetaining yerine Commit Edip Transaction'ı tekrar active hale getirirseniz manyak hızda devam eder. Bir arkadaşın yaptığı programı burada düzeltmiştik, CommitRetaining git gide yavaşlıyordu ama Commit edince Hiç Hız Kaybı Yaşamadan verileri transfer ediyordu.
Bilginiz olsun,
Kolay Gelsin
Bu tür durumlarda, CommitRetaining yerine Commit Edip Transaction'ı tekrar active hale getirirseniz manyak hızda devam eder. Bir arkadaşın yaptığı programı burada düzeltmiştik, CommitRetaining git gide yavaşlıyordu ama Commit edince Hiç Hız Kaybı Yaşamadan verileri transfer ediyordu.
Bilginiz olsun,
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/