Sorgulama ve sonucu dosyaya yazdırmada süre

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Sorgulama ve sonucu dosyaya yazdırmada süre

Mesaj gönderen naile »

Bir sql cümlem var, sonucu ise ortalama 350.000 oluyor. Sorgulamayı yapması çok kısa zaman alıyor 2 dk da falan. Bu sonucu dosyaya yazdırmak istiyorum ama okadar uzun zaman alıyorki.

Queryi while döngüsü ile next yaparak her satırı tek tek dosyaya yazdırıyorum.

Her field arasına ise kullanıcının comboboxdan seçtiği ayıracı koyuyorum ('|',',',';',tab)

Kod şu şekilde:

Kod: Tümünü seç

  if (sd.Execute) then
  begin
    try
    Assignfile(dosya,sd.FileName);
    Rewrite(dosya);
    for I := 0 to DBGrid1.FieldCount - 1 do
    begin
      if i=0 then baslik := DBGrid1.Fields[I].DisplayName
      else baslik := baslik +ayirac[cb_ayirac.itemindex]+ DBGrid1.Fields[I].DisplayName;
    end;
    qry_select.First;
    writeln(dosya,baslik);
    writeln(dosya,'');
    while not(qry_select.Eof) do
    begin
      satir := '';
      satir := qry_select.Fields[0].AsString + ayirac[cb_ayirac.itemindex] +qry_select.Fields[1].AsString + qry_select.Fields[2].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[3].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[4].AsString + ayirac[cb_ayirac.itemindex] +
               qry_select.Fields[5].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[6].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[7].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[8].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[9].AsString + ayirac[cb_ayirac.itemindex] +
               qry_select.Fields[10].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[11].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[12].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[13].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[14].AsString + ayirac[cb_ayirac.itemindex] +
               qry_select.Fields[15].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[16].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[17].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[18].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[19].AsString + ayirac[cb_ayirac.itemindex] +
               qry_select.Fields[20].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[21].AsString + ayirac[cb_ayirac.itemindex] + qry_select.Fields[22].AsString;
      writeln(dosya,satir);
      qry_select.Next;
    end;
    CloseFile(dosya);
    except CloseFile(dosya); end;
  end;
Sabah 10 dan beri çalışıyor ve hala çalışıyor,daha da çalışacak gibi... 5 saat oldu yazamadı gitti :( Sizce bu zamanı nasıl kısaltabilirim?
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Kullnadığınız veritabanının doğrufan text file'a yazan bir komutu olup olmadığına bakarak onu kullanının. Örneğin Sybase'de su sekilde bunu yapmak mumkun

Kod: Tümünü seç

UNLOAD FROM TABLE TABLO_ADI TO TEXT_FILE_ADI DELIMITED BY ';'
veya bir Query sonucunu bir text file gondermek icin de

Kod: Tümünü seç

SELECT *
FROM employee;
OUTPUT TO employee.txt
FORMAT ASCII
DELIMITED BY ';'
Bilgi olarak soyluyorum, bu komutların terlei de yani text dosyadan tabloya alan komutlar da var. Kullandığınız veritabanında benzer komutlar varsa eminim çok daha hızlı olarak bu işi dakikalar bazında bir sürede halledebilirsiniz....
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Merhaba

Bu döngüyü hızlandırmak için aklıma iki yol geldi.

1. Döngüyü DisableControls ve EnableControls metotları arasına al.
2. Dosyaya satırları tek tek yazmak yerine önce StringListe alıp oradan texte aktar. (Bunun hızlandıracağından pek emin değilim.)

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var 
  k: String;
  s: TStringList;
begin
  if SD.Execeute then
  begin
    s:=TStringList.Create;

    Table1.DisableControls;

    Table1.First;
    while not Table1.Eof do
    begin
      k:=Table1.FieldByName('a').AsString + ......
      s.Add(k);
      Table1.Next;
    end;

    Table1.EnableControls;

    s.SaveToFile(SD.FileName);

    s.Free;
  end;
end;
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

StringList'in win98/me icin belli bir sınırı var
yani 100 binlere falan kesinlikle varmıyor
aynı olayı bir sayac ile deneyebilirsiniz
bir memonun lines ina sayacı ekleyin belli bir zaman sonra eklememeye baslayacak
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Hocam problem Memo'nun sınırı olmasın sakın :!: :?:

TStringList'i hiç bu kadar büyük sayılarda denemedim ama Memo'nun 64 KB sınırı olduğunu biliyorum.

Kolay gelsin.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

memonun lines ozelligi TStrings
TStringList te bende deneme yapmadım sadece tahmin ama memo da dedigim gibi
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Cevaplayan herkese teşekkürler.. Aslında benim de düşündüğüm şet Fahrettin Bey'in bahsettiği gibi birşeydi ama nasıl mümkün böyle birşey bilmiyorum. SQL Server kullanıyorum. En kısa zamanda araştıracağım bu meseleyi, acil yetiştirmem gereken şeyler çıktığı için şimdilik 5 saatte alsın bakalım, önceden hiç alamıyordu bu raporu :lol:
Tekrar teşekkürler..
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

eğer quantumgrid kullanıyorsan dxDBGrid.SaveToText() veya dxDBGrid.SaveToXLS() ile daha hızlı aktarabilirsin. XLS de 65535 sınırı olduğundan parçalayıp birleştirmen gerekecek.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

DBGrid kullanıyorum.
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Merhaba

Ben Memoyu da denedim TStringListi de.
Adminin söylediği gibi memonun bir sınırı var. Belli bir yerden sonra daha fazla veri almıyor.
Win9x/WinMe nin NotePadinde de aynı sınır var. Win2000 ve XPde yok.

Ama StringListde bir sınır olduğunu sanmıyorum.
Çünkü 50 kadar field sayısı olan 35.000 kayıtlık bir veritabanın tamamını StringListe alıp oradan Excel sayfasına gönderme işini bir programımda kullanıyorum.

Nailenin sorusuna gelince (Nihayet gelebildim) ...

SQL Serverda export seçenekleri arasında en sonda text dosyaya aktarma seçeneği var. Ayıracı da seçebiliyorsun. (Tab, virgül ...)
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Bunu programın içinden yapabilirmiyiz? Sorguyu çalıştırdıktan sonra dbgridi dosyaya yazacak?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

DevExpress in QuantumGrid ini kullanarak yapabilirsin.
bilmusa
Üye
Mesajlar: 18
Kayıt: 21 Nis 2004 11:31

Mesaj gönderen bilmusa »

rsimsek yazdı:eğer quantumgrid kullanıyorsan dxDBGrid.SaveToText() veya dxDBGrid.SaveToXLS() ile daha hızlı aktarabilirsin. XLS de 65535 sınırı olduğundan parçalayıp birleştirmen gerekecek.
dxdbgridi parçalarken nasıl bir yöntem izliyorsunuz
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

fahrettin yazdı:Kullnadığınız veritabanının doğrufan text file'a yazan bir komutu olup olmadığına bakarak onu kullanının. Örneğin Sybase'de su sekilde bunu yapmak mumkun
Valla VT ile ilgili bir sorun olursa hemen Fahrettin Abi Sybase diyor :D bende sonunda Sybase ci olucam mı ne? 8)
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Merhaba.

- Peki bunu bir "Stored Procedure" ile yapmayı düşündünüz mü? (Belirtmeliyim ki, denemedim, nasıl bir sonuç verir kestiremiyorum).

- Sql Server için muhtemelen bir "Extract" toolu vardır, ancak bu da olmazsa en basitinden "QuickReport" ile arka planda rapor alıp Export etmek suretiyle bir txt dosyasına aktarabilirsiniz sanırım.

Kolay gelsin.
Cevapla