Query ile rapor alma ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Query ile rapor alma ?

Mesaj gönderen bkantur »

Hayırlı akşamlar şimdi ben yine yazdığım kodlar ile sağ kulağımı sol elimle tutmaya çalıştım ve yüzüme gözüme bulaştırdım :alsana: .
3 adet tablom var

1. Birimler P_birim_adi
2. Alt Birimler P_birim_adi P_islem_adi
3. Bilgiler P_birim_adi P_islem_adi P_durumu ( İşlem Yapıldı - İşlem Yapılmadı)

Benim Yapmak İstediğim
Birimler
Alt Birimler
İşlem Sayısı Toplamı
Yapılan İşlemler
Bekleyen İşlemler

Örnek Olarak
Adli Büro
Hapsen Tazyik
3 Adet İşlem Var
2 İşlem Yapıldı
1 İşlem Beklemede
Zorla Getirme
5 İşlem Var
3 İşlem Yapıldı
2 İşlem Beklemede
İdari Büro
..............
.................
gibi.

Yazdığım Kod

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  i,k,l : Integer;
begin
  With UniQuery1 do
  begin
    close;
    sql.clear;
    sql.add('SELECT P_birim_adi FROM birimler');
    open;
    UniQuery1.First;
    while not UniQuery1.Eof do
    begin
      for i := 0 to UniQuery1.FieldCount - 1 do
      begin
        Memo1.Lines.Add(UniQuery1.Fieldbyname('P_birim_adi').AsString);
        With UniQuery2 do
        begin
          close;
          sql.clear;
          sql.add('SELECT P_islem_adi FROM alt_birimler where P_birim_adi=(:durum)');
          Params.ParamByName('durum').value := UniQuery1.Fieldbyname('P_birim_adi').AsString;
          open;
          UniQuery2.First;
          while not UniQuery2.Eof do
          begin
            for k := 0 to UniQuery2.FieldCount - 1 do
            begin
              Memo1.Lines.Add(UniQuery2.Fieldbyname('P_islem_adi').AsString);
              With UniQuery3 do
              begin
                close;
                sql.clear;
                sql.add('SELECT Count(P_islem_adi) FROM bilgiler where P_islem_adi=(:durum)');
                Params.ParamByName('durum').value := UniQuery2.Fieldbyname('P_islem_adi').AsString;
                open;
                UniQuery3.First;
                while not UniQuery3.Eof do
                begin
                  for l := 0 to UniQuery3.FieldCount - 1 do
                  begin
                    Memo1.Lines.Add(UniQuery3.FieldByName('Count(P_islem_adi)').AsString);
                  end;
                  UniQuery3.Next;
                end;
              end;
            end;
            UniQuery2.Next;
          end;
        end;
      end;
      UniQuery1.Next;
    end;
  end;
end;
Bu şekilde sadece İşlem Toplamlarını alabildim. Burada Yapılan işlem sayısını ve bekleyen işlem sayısını nasıl alabilirim ?
Ve İkinci bir soru olarak alttaki şekilde stringgride nasıl ekleyebilirim ?
[img]
http://i.hizliresim.com/BZ70lQ.jpg
[/img]
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 »

Şöyle bir dener misin, bakalım sonuç alabilecek misin ?

- Veritabanı olmadığından deneme şansım yok. Sadece yüzeysel olarak kontrol ettim.

- Eğer LEFT JOIN'de hata verirse (MSAccess'deki gibisinden) o zaman parantezlere almayı denersin.

- StringGrid olayında da bunu yapan onu da yapar hocam... Zaten oradaki sıra ile göreceksin, sadece kayıt sayısı kadar ROW tanımlayıp, gereği kadar COLUMN sayısı verecek, tek bir döngü ile bunları oraya atayacaksın.

Forumu biraz araştırınca görebilirsin. :wink:

Kod: Tümünü seç

    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_islem_adi = AB.P_islem_adi WHERE 	BIL1.P_durumu = ''İşlem Yapıldı'' ) as YapilmisSayisi');
    SQL.Add(',( SELECT Count(*) FROM bilgiler BIL2 where BIL2.P_islem_adi = AB.P_islem_adi WHERE 	BIL2.P_durumu = ''İşlem Yapılmadı'' ) as BekleyenSayisi');
    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');
    Active := True;
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 »

Hocam yardım için çok teşekkür ederim ama

#42000 you have an error in your sql syntax; check the manual that corresponds to you mysql server version for
the right syntax to use near 'WHERE BIL1P_durumu = 'İşlem Yapıldı') as YapilmisSayisi ,(SELECT Count(*' at line 4.

hatası verdi :(
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 »

Araya nokta koymayı unutmuşzu...

Kod: Tümünü seç

WHERE BIL1.P_durumu
şeklinde yürüyecek.
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 »

Hocam tekrar kusuruma bakma orada nokta var ben yazarken unutmuşum
bkantur
Üye
Mesajlar: 47
Kayıt: 23 Kas 2013 04:45
Konum: Balıkesir

Re: Query ile rapor alma ?

Mesaj gönderen bkantur »

Tam olarak verdiği hata kodu bu
Dosya ekleri
hata.JPG
hata.JPG (11.84 KiB) 3047 kere görüntülendi
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 »

Verdiğin resim küçük görünüyor okuyamadım ama bir şey dener misin ... Bu iç SQL'in doğru olup olmadığını test etmen gerekecek.

Kod: Tümünü seç

SELECT Count(*) FROM bilgiler BIL1 where BIL1.P_islem_adi = ''Hapsen Tazyik'' WHERE    BIL1.P_durumu = ''İşlem Yapıldı''
sonuç 0 dahi olabilir ama çalışacak mı kontrol eder misin...
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 »

Aynı şekilde ondada hata veriyor hocam :(

[img]
http://i.hizliresim.com/bl7Jpb.jpg
[/img]
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 »

Şimdi bu sorguyu direkt copy/paste yaparak projende MySQL bağlı bir Query içinde deniyorsun değil mi ? Tırnak olarak iki tane tek tırnak yanyana olduğunu hatırlatayım.

Kod: Tümünü seç

    SQL.Add( 'SELECT Count(*) FROM bilgiler BIL1 where BIL1.P_islem_adi = :data1 WHERE BIL1.P_durumu = :data2');
    Params.ParamByName('data1').Value := 'Hapsen Tazyik';
    Params.ParamByName('data2').Value := 'İşlem Yapıldı';
şeklinde de bir dener misin ? Tırnak işareti hatası mı yapılıyor anlamak için. İki tane tek tırnak bitişik idi, şimdi bunları kaldırdık.

Bir de hata resmini yeniden (bu sorguya ait olanı) görsem iyi olur.
Resim
Resim ....Resim
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 »

Çalışırsa bu durumda sorgu şu hale dönecek.

Kod: Tümünü seç

    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_islem_adi = AB.P_islem_adi WHERE BIL1.P_durumu = :data1 ) as YapilmisSayisi');
    SQL.Add(',( SELECT Count(*) FROM bilgiler BIL2 where BIL2.P_islem_adi = AB.P_islem_adi WHERE BIL2.P_durumu = :data2 ) as BekleyenSayisi');
    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');
    Params.ParamByName('data1').Value := 'İşlem Yapıldı';
    Params.ParamByName('data2').Value := 'İşlem Yapılmadı';
    Active := True;
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 »

Kod: Tümünü seç

WHERE BIL1.P_durumu = 'İşlem Yapıldı'
 
kısmında hata veriyor Hocam akşam akşam sizi de uğraştırdım hakkınızı Helal edin hocam

Benim bilgisayar ile alakalı sorun olabilir mi acaba hocam ?
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 »

Ah kafam... Şimdi gördüm... :alsana: Bu domates banaydı... :oops:


İki defa WHERE demişim. Copy/Paste kazası yapmışım. Dediğim gibi veritabanı olmayınca testini yapamıyorum.

Aşağıdakini denersen olacaktır.

Kod: Tümünü seç

    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 = ''İşlem 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 = ''İşlem Yapılmadı'' ) as BekleyenSayisi');
    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');
    Active := True;
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 »

Bu sefer tamamdır hocam :) o domates size değil bana hocam benimde gözümün önünde duruyordu ama bende göremedim Allah sizden razı olsun Hocam zor anlarımızda Hızır gibi yetişip yardımcı oluyorsunuz. Çok fazla olmazsam eğer Son bir şey daha sorabilir miyim Hocam?
Buradaki işleyiş nasıldır ?

SQL.Add(' B.P_birim_adi');
SQL.Add(', AB.P_islem_adi');
BIL1 BIL2
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 »

Sevindim.

- İşleyiş : Aynı TABLO'yu birden fazla defa kullanmak ihtiyacınız olduğunda, bu tabloları sanki farklı tablolarmış gibi farklılaştırmak için ALIAS kullanmak gerekiyor. BIL1 ve BIL2 isminde iki ALIAS kurup aslında tek bir bilgiler tablosunu iki farklı tablo gibi görüntüledik. Tabi buna neden ihtiyaç duyuyoruz, aynı alan adı iki defa oluşunca başlarına bu alias'ları ekleyerek aslında birinci select'deki P_BirimAdi'nı istiyorum, ikincisi değil diyoruz. Kısaca tabiri böyle.

- Başka bir tüyo vereyim: Birden fazla farklı tabloda aynı alan isimlerini kullanmaktan şahsen kaçınırım. Bunun yerine bu tabloların ilk iki harfini her fieldin başına koyarak tablo create ederim. Böylece B_BirimAdi ile AB_BirimAdi için aynı veri alanları kullanmak istesem bile ben bu şekilde her bir fialed'in başındaki B ile Birimler, AB ile AltBirimler tablosuna ait olduğunu anlarım. O zaman alias kullanma gereği kalmaz, çünkü yanyana hiçbir field adı diğerine karışmaz. Sadece iç içe select lazım olduğunda orada alias kullanırım. Bu örnekte olduğu gibi.

Şimdi dikkat ettim de :

:idea: Aslında bu birim adlarını ve işlem adlarını kodlayıp birer rakam ile ifade etsen daha iyi olurdu.
:arrow: Şimdi dikkat ettim de birimler tablondaki P_birim_adi hanesi, alt_birimler tablondaki P_birim_adi hanesindeki içerik ile aynı ise bu durumda birimler tablosuna bu SELECT ifadesinde de ihtiyaç kalmıyor.

- Onu kaldırıp sadece alt_birimler tablosuyla da aynı sorgulama yapılabilir demektir oluyor.

Bu durumda nihai sorgun şöyle oluyor...

Kod: Tümünü seç

    SQL.Clear;
    SQL.Add('SELECT');
    SQL.Add('  AB.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 = ''İşlem 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 = ''İşlem Yapılmadı'' ) as BekleyenSayisi');
    SQL.Add('FROM alt_birimler AB');
    SQL.Add('WHERE 1=1');
    SQL.Add('GROUP BY AB.P_birim_adi, AB.P_islem_adi');
    SQL.Add('ORDER BY AB.P_birim_adi, AB.P_islem_adi');
    Active := True;
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 »

Hocam çok teşekkür ederim ayrıntılı bir şekilde anlattığınız için bu arada bende grid işlemini hallettim

Kod: Tümünü seç

var
 i:Integer;
begin
  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;
Cevapla