Süper, dediğim gibi Birimler tablosundan vazgeçip sorguyu daha da küçültebilirsin.
Eline sağlık. Başarılar.
Query ile rapor alma ?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Query ile rapor alma ?
Sayenizde akşam akşam sizi de uğraştırdım çok teşekkür ederim Hocam hayırlı akşamlar dilerim.
Re: Query ile rapor alma ?
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;
Re: Query ile rapor alma ?
Sonunda FREE etmeyeceksen sorun olur
(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.
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.

(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.

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.

Re: Query ile rapor alma ?
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;
Re: Query ile rapor alma ?
İlgili Form üzerinde UniQuery1 isminde bir bileşen yoksa evet budur. Zaten hata verir. Bunun için
ile unisex bir kurulum ile başlayıp, aynı with bloğu içerisinde sadece free desen dahi olur.
Kod: Tümünü seç
With TUniQuery.Create(nil) do