adoquery kullanan bir aktarım işleminde eksik kalan satırlar

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

adoquery kullanan bir aktarım işleminde eksik kalan satırlar

Mesaj gönderen akdatilla »

Merhaba
Ben informix veritabaninda kayıtlı iki tablo arasında bilgi transferi yapan bir prosedur yazdım.
Prosedur iki tane ADOQuery kullanıyor. Bunlardan birisi kaynak tablodan bilgileri bir sql komutu ile almayı sağlıyor.
Diğer query "select * from tablo" gibi bir sql ile hedef tabloya bilgi yazmak için kullanılıyor.
Prosedur ilk başta bize doğru çalışıyor gibi gelmişti. Ancak sonra onemli bir sorunun farkına vardık.
87000 satırın tahmini 7000 kadarı aktarılmamış veya doğru bir şekilde aktarılmamış.
Acaba bu sorunu nasıl çözebilirim ilgilenen arkadaşlara şimdiden teşekkür ederim.

Aşağıda prosedurun kopyalama işlemini yapan kodları var.

Kod: Tümünü seç

     DM.IXQOpen(q2,'select * from argsatis');////bu komut q2 isimli adoquery'i kullanarak hedef tabloyu(bilgi aktarılacak tabloyu) listeliyor. Tablo daha once bosaltılmıştır.
     if ga1>0 then
     begin
          if DM.IXQOpen(q1,'select t1.sirkod,t1.mamno,t1.yil,t1.ay,t1.mgzkod,'+
          't1.smiktar,t1.sdmtut from satkum as t1,mamul '+
          ' where mamul.mamno=t1.mamno and (mamul.durum is null or mamul.durum=0) and t1.mgzkod in ('+sq+') and '+
          't1.ay between '+inttostr(ga1)+' and '+inttostr(ga2)+
          ' order by 1,2,3,4,5') then   //////Bu komut bilgilerin alınacağı listeyi veriyor
          begin
               q1.First;////kaynak tablonun ilk satırına konumlanıldı
               islemlbl.Caption:='0/'+inttostr(q1.RecordCount);
               MainF.ProgressGoster('Gecen Yilin Reel Satis Bilgileri Yukleniyor. Lutfen bekleyiniz...',
               q1.RecordCount,0,0,True);

               while not q1.Eof do  ///kaynak tablonun sonuna kadar dongu kuruldu
               begin
                    
                    inc(kno); ///keyno surekli arttırılarak veriliyor
                    ///aşağıdaki komutlar kaynak datasetten bilgi okuyor
                    sirkod:=QIntField(q1,'sirkod');
                    mgzkod:=QStrField(q1,'mgzkod');
                    ay:=QIntField(q1,'ay');
                    yil:=QIntField(q1,'yil');
                    mamno:=QDblField(q1,'mamno');
                    smiktar:=QIntField(q1,'smiktar');
                    sdmtut:=QDblField(q1,'sdmtut');
                    /////////////////////
                    //////Hedef tabloya bilgiler yazılıyor 
                    q2.Append;
                    q2.FieldByName('sts_id').Value:=kno;
                    q2.FieldByName('sts_sir').Value:=sirkod;
                    q2.FieldByName('sts_mgz').Value:=mgzkod;
                    q2.FieldByName('sts_ay').Value:=ay;
                    q2.FieldByName('sts_yil').Value:=yil;
                    q2.FieldByName('sts_mml').Value:=mamno;
                    q2.FieldByName('sts_miktar').Value:=smiktar;
                    q2.FieldByName('sts_tutar').Value:=sdmtut;
                    q2.Post;
                    //////Hedef tabloya bilgiler yazıldı

                    q1.Next;///sonraki kayda geçiliyor

                    //////aradasırada ekranda kopyalama durumu gosteriliyor. Kayıtların aktarılması uzun surduğu için gerekli
                    if q1.RecNo mod 20=0 then
                    begin
                         islemlbl.Caption:=inttostr(q1.RecNo)+'/'+inttostr(q1.RecordCount);
                         MainF.ProgressGoster('Gecen Yilin Reel Satis Bilgileri Yukleniyor. Lutfen bekleyiniz...',
                         q1.RecordCount,0,q1.RecNo,True);
                         Application.ProcessMessages;
                         if ASCProgressSwc then break;   ///aktarma esnasında kopyalama durdurulabiliyor.
                    end;
               end;
               islemlbl.Caption:=inttostr(q1.RecordCount)+'/'+inttostr(q1.RecordCount);
          end;
     end;
Cevapla