Query ile rapor alma ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Query ile rapor alma ?

Mesaj gönderen mrmarman »

Süper, dediğim gibi Birimler tablosundan vazgeçip sorguyu daha da küçültebilirsin.

Eline sağlık. Başarılar.
Resim
Resim ....Resim
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Query ile rapor alma ?

Mesaj gönderen bkantur »

Sayenizde akşam akşam sizi de uğraştırdım çok teşekkür ederim Hocam hayırlı akşamlar dilerim.
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Query ile rapor alma ?

Mesaj gönderen bkantur »

Bu konu ile kafama takılan son bir soru daha sormak istiyorum. Alttaki gibi çalışma anında UniQuery1 oluşturmak programlama açısından bir sakınca oluşturur mu? Yoksa form üzerine UniQuery1 ekleyerek mi kullanmalıyım ?

Kod: Tümünü seç

var
  i         : integer;
  UniQuery1 : TUniQuery;
begin
  UniQuery1 := TUniQuery.Create(nil);
  UniQuery1.connection := uniconnection1;
  With UniQuery1 do
  begin
    close;
    SQL.Clear;
    SQL.Add('SELECT');
    SQL.Add('   B.P_birim_adi');
    SQL.Add(', AB.P_islem_adi');
    SQL.Add(',( SELECT Count(*) FROM bilgiler BIL1 WHERE BIL1.P_birim_adi = AB.P_birim_adi AND BIL1.P_islem_adi = AB.P_islem_adi AND BIL1.P_durumu = ''İslem Yapıldı'' ) as YapilmisSayisi');
    SQL.Add(',( SELECT Count(*) FROM bilgiler BIL2 WHERE BIL2.P_birim_adi = AB.P_birim_adi AND BIL2.P_islem_adi = AB.P_islem_adi AND BIL2.P_durumu = ''İslem Yapılmadı'' ) as BekleyenSayisi');
    SQL.Add(',( SELECT Count(*) FROM bilgiler BIL3 WHERE BIL3.P_birim_adi = AB.P_birim_adi AND BIL3.P_islem_adi = AB.P_islem_adi  ) as ToplamSayisi');
    SQL.Add('FROM      birimler      B');
    SQL.Add('LEFT JOIN alt_birimler AB ON (B.P_birim_adi  = AB.P_birim_adi) ');
    SQL.Add('WHERE 1=1');
    SQL.Add('GROUP BY B.P_birim_adi, AB.P_islem_adi');
    SQL.Add('ORDER BY B.P_birim_adi, AB.P_islem_adi');
    Open;
    advstringgrid1.RowCount := UniQuery1.RecordCount+1;
    UniQuery1.First;
    while not UniQuery1.Eof do
    begin
      for i := 0 to UniQuery1.FieldCount - 1 do
      begin
        advstringgrid1.Cells[0, UniQuery1.RecNo]  := UniQuery1.Fieldbyname('P_birim_adi').AsString;
        advstringgrid1.Cells[1, UniQuery1.RecNo]  := UniQuery1.Fieldbyname('P_islem_adi').AsString;
        advstringgrid1.Cells[2, UniQuery1.RecNo]  := UniQuery1.Fieldbyname('YapilmisSayisi').AsString;
        advstringgrid1.Cells[3, UniQuery1.RecNo]  := UniQuery1.Fieldbyname('BekleyenSayisi').AsString;
        advstringgrid1.Cells[4, UniQuery1.RecNo]  := UniQuery1.Fieldbyname('ToplamSayisi').AsString;
      end;
      UniQuery1.Next;
    end;
  end;
end; 
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Query ile rapor alma ?

Mesaj gönderen mrmarman »

Sonunda FREE etmeyeceksen sorun olur :wink:

(1) Gerektiğinde bir procedure içinde bir araya getirip bağımsız yerlerde aynı procedure çalıştırdığımda (thread'li işlemlerde)
(2) Ağ altında bir kullanımdır ya, Try Except durumlarında hata anında asıl Query nesnesini ve dahi procedure'ü bloke etmeyeceğinden,
(3) Kurulum ve yapısal olarak tavandan tabana her şeyin gözümün önünde olmasından dolayı yazım ve kontrolü kolaylaştırdığından,
kanalda bileşenler bağımsız olduğundan,
(4) Bir ortak procedure içerisinde yapılan güncellemenin tüm proje tarafından kolayca hayata geçeceğinden
(5) Query bileşeni neredeydi, SQL cümlesi neydi, eventleri neye bağlıydı ??? derdim olmadığından,
(6) başka aklıma gelmeyen, proje büyüdükçe ayağıma dolaşacak yan unsurlardan soyutlayabildiğimden...

... ben böyle tercih ediyorum. :wink:

Zamanında ortak bir DataModule içinde tuttuğum için SMS tarfiğinden dolayı bir işlem sonlanmadan ikinci sorguya girdiğini geç farkettiğimden anlamsız cevap SMS'leri kurduğundan beri ortak query kullanmayı bıraktım. Thread safe bir durum oluşturmak için her çağrıda Query'yi soyutlamak çok büyük fayda sağlıyor buna güvenebilirsiniz.

Başta dediğim gibi FREE etmeyi unutmayın yeter. Örnekte unutmuşsunuz. :idea:
Resim
Resim ....Resim
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Query ile rapor alma ?

Mesaj gönderen bkantur »

Olması gereken bu şekilde değil mi Hocam?

Kod: Tümünü seç

var
  UniQuery1 : TUniQuery;
begin
   UniQuery1 := TUniQuery.Create(nil);
   UniQuery1.connection := uniconnection1;
   try
     With UniQuery1 do
     begin
         ..............
         ..............
         ..............
     end;
   finally
     UniQuery1.free;
   end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Query ile rapor alma ?

Mesaj gönderen mrmarman »

İlgili Form üzerinde UniQuery1 isminde bir bileşen yoksa evet budur. Zaten hata verir. Bunun için

Kod: Tümünü seç

With TUniQuery.Create(nil) do
ile unisex bir kurulum ile başlayıp, aynı with bloğu içerisinde sadece free desen dahi olur.
Resim
Resim ....Resim
Cevapla