İki tablodan birden sorgulama yapmak...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

İki tablodan birden sorgulama yapmak...

Mesaj gönderen Biltes »

Arkadaşlar merhaba;
İki tane tablom var musteritable ve uruntable bu tablolardan gerekli bilgileri toplayıp dbgrid'de göstermek istiyorum ve aynı zamanda bu birleşlen kayıtların içerisinden daha önce kullandığım bir filtreleme metodunu kullanmak istiyorum bu konuda bana yardımcı olabilirseniz çok sevinirim.

Öncelikle alanlarım;

musteritable uruntable
---------------- ------------
cariunvan urunserino
faturatarihi barkod
faturano

Bu 5 alanı iki tabloda birleştirerek tek dbgrid'de göstermek istiyorum. Daha önceden filtreleme için kullandığım kod ise aşağıdaki gibidir.

Kod: Tümünü seç

var
  Cumle : AnsiString;
begin
  if (dxCheckEdit1.Checked = True) or (dxCheckEdit2.Checked = True) or (dxCheckEdit3.Checked = True) or (dxCheckEdit4.Checked = True) or (dxCheckEdit5.Checked = True) Then
    Begin
      Cumle := 'Select * From mafbilgileri where id is not null';
      if dxCheckEdit1.Checked Then Cumle := Cumle+' and (faturatarihi between :ilk and :son)';
      if dxCheckEdit2.Checked Then Cumle := Cumle+' and (faturano=:faturano)';
      if dxCheckEdit3.Checked Then Cumle := Cumle+' and (cunvan=:cunvan)';
      if dxCheckEdit4.Checked Then Cumle := Cumle+' and (vtarihi between :bas and :sn)';
      if dxCheckEdit5.Checked Then Cumle := Cumle+' and (odemedurumu=:odemedurumu)';
      cumle := Cumle+' order by faturatarihi asc';

      with flistetable do
        Begin
          Close;
          SQL.Clear;
          SQL.Add(Cumle);

          if dxCheckEdit1.Checked = True Then
            Begin
              ParamByName('ilk').AsDate := dxDateEdit1.Date;
              ParamByName('son').AsDate := dxDateEdit2.Date;
            End;
          if dxCheckEdit2.Checked = True Then
            Begin
              ParamByName('faturano').AsString := dxEdit1.Text;
            End;
          if dxCheckEdit3.Checked = True Then
            Begin
              ParamByName('cunvan').AsString := RxDBLookupCombo1.Text;
            End;
          if dxCheckEdit4.Checked = True Then
            Begin
              ParamByName('bas').AsDate := dxDateEdit3.Date;
              ParamByName('sn').AsDate := dxDateEdit4.Date;
            End;
          if dxCheckEdit5.Checked = True Then
            Begin
              if RadioButton1.Checked = True Then
                Begin
                  ParamByName('odemedurumu').AsString := 'Ödendi'
                End Else ParamByName('odemedurumu').AsString := 'Ödenmedi';
            End;
          Active := True;
        End;
    End Else Gerigetir;
gibi bir kod ile seçtiğim alanlara göre filtreleme yapıyorum ama iki tabloyu birden birleştirerek başaramadım. Bu konuda yardımlarınızı bekliyorum.
Herkese şimdiden kolay gelsin...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Örnek;

Kod: Tümünü seç

select a.alan1, a.alan2, b.alan1, b.alan2 from atablosu a
left join btablosu b on b.key_alani = a.key_alani
where diğer şartlar....
order by a.alani, b.alani
....
şeklinde LEFT JOIN ile birleştirebilirsin. Dikkat etmen gereken "SELECT * " yerine gerekli alanları tabloların takma adı/alias ları ile yazman :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ikut

Merhaba

Mesaj gönderen ikut »

İşte bu soru neden SQL kullanmak gerektiğinin kanıtıdır.
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkadaşlar tekrar merhaba;
sorumun ilk kısmı olan iki tabloyu birleştirme olayını aşağıdaki gibi hallettim ama sorum şu olacak acaba aşağıdaki gibi bir birleştirme ile rşimşek hocamın dediği gibi left join ile birleştirme arasında bir fark var mı yada bir dezavantajı?
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Pardon istediğimi yazıp kodu yazmamışım kod aşağıdaki gibidir.

Kod: Tümünü seç

Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod from mafbilgileri,maubilgileri
where (mafbilgileri.bfno=maubilgileri.fbid)
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

İlk aklıma gelen şöyle bir fark olabilir; eğer foreign key li bir yapı kurmamışsanız ve bağladığınız tabloda ilk tablodaki alanın karşılığı yoksa o kayıt gözükmeyecektir. Şöyle ki stok birimlerini ayrı bir tabloda tuttuğunuzu varsayın. Ana stok tablosu ile birimleri birlikte sorgulamak istiyorsanız birimi tanımlanmamış bir kayıt sorguda çıkmayacaktır (doğrusu böyle bir duruma meydan vermemek için foreign key kullanmaktır :idea: ) fakat join lerle referans veya karşılık kayıt olmasa da da göster diyebiliyorsunuz.. left/right join... inner/outer/full join gibi..
Bu yazdığınız yapıya da JOIN kelimesi kullanılmasa bile JOIN/birleştirme yapısı denir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkdaşlar iki tabloyu yukarıda bellirttiğim gibi birleştirdi ama aşağıdaki kodda kayıtları bulduramıyorum şöyle ilginç bir durumla karşı kaşıyayım. mesela ürün seri no'ya girilen bir ürün numarası yaptığım zaman tüm kayıtlarımı o satırdaki bilgiler ile değiştiriyor. Neden böyle bir ilginçlik olur anlayamadım.

Kod: Tümünü seç

var
  Cumle : AnsiString;
begin
  if (dxCheckEdit1.Checked = True) or (dxCheckEdit2.Checked = True) or (dxCheckEdit3.Checked = True) or (dxCheckEdit4.Checked = True) or (dxCheckEdit5.Checked = True) Then
    Begin
      Cumle := 'Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod,maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri,maubilgileri';
      cumle := cumle+' where mafbilgileri.bfno=maubilgileri.fbid is not null';
      if dxCheckEdit1.Checked Then Cumle := Cumle+' and (cunvan=:cunvan)';
      if dxCheckEdit2.Checked Then Cumle := Cumle+' and (faturatarihi between :bas and :sn)';
      if dxCheckEdit3.Checked Then Cumle := Cumle+' and (faturano=:faturano)';
      if dxCheckEdit4.Checked Then Cumle := Cumle+' and (serino=:serino)';
      if dxCheckEdit5.Checked Then Cumle := Cumle+' and (barkod=:barkod)';
//      cumle := Cumle+' order by faturatarihi asc';

      with ustable do
        Begin
          Close;
          SQL.Clear;
          SQL.Add(Cumle);

          if dxCheckEdit1.Checked = True Then
            Begin
              ParamByName('cunvan').AsString := dxEdit1.Text;
            End;
          if dxCheckEdit2.Checked = True Then
            Begin
              ParamByName('bas').AsDate := dxDateEdit1.Date;
              ParamByName('sn').AsDate := dxDateEdit2.Date;
            End;
          if dxCheckEdit3.Checked = True Then
            Begin
              ParamByName('faturano').AsString := dxEdit2.Text;
            End;
          if dxCheckEdit4.Checked = True Then
            Begin
              ParamByName('serino').AsString := dxEdit3.Text;
            End;
          if dxCheckEdit5.Checked = True Then
            Begin
              ParamByName('barkod').AsString :=  dxEdit4.Text;
            End;
          Active := True;
        End;
    End Else //Gerigetir;
şu anda çalıştığım kod bu şekilde.
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Tablodaki kayıtları vt'de değiştirmiyor sadece tabloda görüntüde değiştiriyor.

Kod: Tümünü seç

      sorgu := 'Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod,maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri,maubilgileri';
      sorgu := sorgu+' where (mafbilgileri.bfno=maubilgileri.fbid));'
kodunu kullandığım zaman doğru bir şekilde geri getiriyor kayıtları.
ama anlayamadığım neden herhangi bir alandan arama yapmaya kalktığımda tüm kayıtları aynı yapıyor. Ayrıca vt'de olamayan bir alanı arattığımda doğru olarak boş kayıt getiriyor. Sorun sadece kaydı bulmuyor ve neden tüm kayıtları ekranda aynı yapıyor? :(
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Çok yuvarlak laflar var ne demek istediğiniz anlaşılmıyor :?
Örnekliyerek anlatın :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Tabloları birleştirmek için kullandığım SQL cümlesi bu ise burada sorun var zaten :idea:
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Arkadaşlar son olarak iki tabloyu birleştirdikten sonra karşılaştığım sorunlar aynen aşağıdaki gibir;
Aşağıdaki kodu kullanarak kayıtları iki tablodan seçiyorum ve bu şekilde ekrana getiriyorum.

Kod: Tümünü seç

Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod,maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri,maubilgileri
where (mafbilgileri.bfno=maubilgileri.fbid)
Resim 01'de görüldüğü gibi ekrana bilgileri geliyor.

Resim

burada seri no'yu seçip arama yapmak istediğim zaman stoklardaki bir serinoyu yazıp listele dediğim zaman 3 alanı da yani vt'deki tüm ekana gelen kayıtları otomatik olarak hepsini aynı yapıyor. Resim 02.
Resim

sorgulamak için kullandığım kod aşağıdaki gibidir.

Kod: Tümünü seç

var
  Cumle : AnsiString;
begin
  if (dxCheckEdit1.Checked = True) or (dxCheckEdit2.Checked = True) or (dxCheckEdit3.Checked = True) or (dxCheckEdit4.Checked = True) or (dxCheckEdit5.Checked = True) Then
    Begin
      Cumle := 'Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod, maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri,maubilgileri';
      cumle := cumle+' where mafbilgileri.bfno=maubilgileri.fbid is not null';
      if dxCheckEdit1.Checked Then Cumle := Cumle+' and (cunvan=:cunvan)';
      if dxCheckEdit2.Checked Then Cumle := Cumle+' and (faturatarihi between :bas and :sn)';
      if dxCheckEdit3.Checked Then Cumle := Cumle+' and (faturano=:faturano)';
      if dxCheckEdit4.Checked Then Cumle := Cumle+' and (serino=:serino)';
      if dxCheckEdit5.Checked Then Cumle := Cumle+' and (barkod=:barkod)';

      with ustable do
        Begin
          Close;
          SQL.Clear;
          SQL.Add(Cumle);

          if dxCheckEdit1.Checked = True Then
            Begin
              ParamByName('cunvan').AsString := dxEdit1.Text;
            End;
          if dxCheckEdit2.Checked = True Then
            Begin
              ParamByName('bas').AsDate := dxDateEdit1.Date;
              ParamByName('sn').AsDate := dxDateEdit2.Date;
            End;
          if dxCheckEdit3.Checked = True Then
            Begin
              ParamByName('faturano').AsString := dxEdit2.Text;
            End;
          if dxCheckEdit4.Checked = True Then
            Begin
              ParamByName('serino').AsString := dxEdit3.Text;
            End;
          if dxCheckEdit5.Checked = True Then
            Begin
              ParamByName('barkod').AsString :=  dxEdit4.Text;
            End;
          Active := True;
        End;
    End Else Gerigetir;
bu sorgu ile arama yaptığım zaman resim 02'de ki sonuç karşıma çıkıyor kayıtları aşağıdaki kod ile geri getir dediğim zaman

Kod: Tümünü seç

var
  sorgu : AnsiString;
begin
      sorgu := 'Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod,maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri,maubilgileri';
      sorgu := sorgu+' where (mafbilgileri.bfno=maubilgileri.fbid)';
  with ustable do
    Begin
      Close;
      SQL.Clear;
      SQL.Add(sorgu);
      Active := True;
    End;
resim 01'deki görüntünün aynısı geri geliyor.
Sorun bu nasıl bir sorgulama yapmam gerekli yada nerede yanlış yapıyorum. Umarım yeterli derecede açıklayıcı olmuştur. Herkese çok teşekkür ederim cevaplar için...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Yukarıda yazdığım left join li şekilde tabloları bağlamayı dene :wink:
Biltes yazdı:..cumle := cumle+' where mafbilgileri.bfno=maubilgileri.fbid is not null'; ...
in son kısmını anlamadım :?: Ayrıca işlem yapmadan önce sorguyu (cumle) yazdırıp kontrol edersen iyi olur :wink:
Biltes yazdı:if dxCheckEdit4.Checked Then Cumle := Cumle+' and (serino=:serino)';
bunlarda da takma ad/alias kullanmamışsın :!:

Ben olsam bağlama/join olayını eğer kısıtlamalar birinci tablo ile ilgisi ise önce o kısıtları uygular ondan sonra bağlardım.

Kod: Tümünü seç

...and mafbilgileri.bfno=maubilgileri.fbid..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Hocalarım allah hepinizin bir kere değil bin kere razı olsun. Sonunda şükür allahıma yaptım. Özellikle rşimşek hocam ve diğer yardım eden arkaşlar değerli bilgileriniz için çok tşk ederim. Sonunda istediğim olayı aşağıdaki kod bloğu ile çözdüm. Umarım bu kadar uğraş sizlerin de işlerine yarar.
Emeği geçen herkese çok tşk ediyorum. Saygılar...

Kod: Tümünü seç

var
  Cumle : AnsiString;
begin
  if (dxCheckEdit1.Checked = True) or (dxCheckEdit2.Checked = True) or (dxCheckEdit3.Checked = True) or (dxCheckEdit4.Checked = True) or (dxCheckEdit5.Checked = True) Then
    Begin
    Cumle := 'Select mafbilgileri.cunvan,mafbilgileri.faturatarihi,mafbilgileri.faturano,maubilgileri.serino,maubilgileri.ucinsi,maubilgileri.barkod,maubilgileri.satilankisi,maubilgileri.satistarihi from mafbilgileri left join maubilgileri on';
    cumle := cumle+' mafbilgileri.bfno=maubilgileri.fbid where mafbilgileri.bfno=maubilgileri.fbid';

      if dxCheckEdit1.Checked Then Cumle := Cumle+' and (mafbilgileri.cunvan=:mafbilgileri.cunvan)';
      if dxCheckEdit2.Checked Then Cumle := Cumle+' and (mafbilgileri.faturatarihi between :bas and :sn)';
      if dxCheckEdit3.Checked Then Cumle := Cumle+' and (mafbilgileri.faturano=:faturano)';
      if dxCheckEdit4.Checked Then Cumle := Cumle+' and (maubilgileri.serino=:maubilgileri.serino)';
      if dxCheckEdit5.Checked Then Cumle := Cumle+' and (maubilgileri.barkod=:maubilgileri.barkod)';

      with ustable do
        Begin
          Close;
          SQL.Clear;
          SQL.Add(Cumle);

          if dxCheckEdit1.Checked = True Then
            Begin
              ParamByName('mafbilgileri.cunvan').AsString := dxEdit1.Text;
            End;
          if dxCheckEdit2.Checked = True Then
            Begin
              ParamByName('bas').AsDate := dxDateEdit1.Date;
              ParamByName('sn').AsDate := dxDateEdit2.Date;
            End;
          if dxCheckEdit3.Checked = True Then
            Begin
              ParamByName('mafbilgileri.faturano').AsString := dxEdit2.Text;
            End;
          if dxCheckEdit4.Checked = True Then
            Begin
              ParamByName('maubilgileri.serino').AsString := dxEdit3.Text;
            End;
          if dxCheckEdit5.Checked = True Then
            Begin
              ParamByName('maubilgileri.barkod').AsString :=  dxEdit4.Text;
            End;
          Active := True;
        End;
    End Else Gerigetir;
Bu şekilde bir kod bloğu ile birbirine join ile bağlı iki tablodan istediğim alanlara göre sorgu oluşturabildim.
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

JOIN kullandığın için bu kısmı tekrar yazmana gerek yok :wink:

Kod: Tümünü seç

...
mafbilgileri.bfno=maubilgileri.fbid
...
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Hocam eğer orada onu yazmazsam bilgi çektiğim ilktabloda filtreleme yapmıyor sadece ikinci tabloda kayıtları filtreliyor

Kod: Tümünü seç

where mafbilgileri.bfno=maubilgileri.fbid
o yüzden tekrardan yazdım...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Cevapla