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;