Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Arif
Üye
Mesajlar: 5
Kayıt: 09 Şub 2023 02:03

Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen Arif »

Öncelikle Herkese Merhaba;

Uzun zamandır takip ettiğim ve yararlandığım bir sitedir. Tüm emeği geçenlere teşekkür ediyorum Farklı yerlerde bu konuda örnekler var inceledim ama bi şekilde sorunumu çözemedim.

Benim takıldığım sql sorgulamada bilgice büyük ve değerli büyüklerim veya
kardeşlerimden yardım istiyorum.
Delphi 7 kullanıyorum. İki farklı Veritabanım var.
1. VT L tablosunda Kişi temel bilgiler tutulmakta, (Örenk: ad, soyad,
TcNo, Mersis_No vs.) Bu tabloda KartNo uniq id olarak tanımlı.
2. VT ise A Adresler tablosu. A-Tablosu Adres Bilgileri(Ev ve İş Adresi Bilgileri. Bir müşterinin birden fazla adresi olabiliyor. Her ayrı adres için ayrı bir kayıt yapılıyor.)
L VT üzerinden seçilen KartNoya id ile çok sayıda farklı işler için farklı veritabanı VT ile bağlantı oluşturuyorum.(Master Detail olarak)

Sorum Şu:
L VT listesi üzerinde müşteri isim listesi DbGrid üzerinde bulunduğum satırdaki kartno id bilgisini alıp, sağ taraftaki pencerede müşterinin hem de kefilin ev adresi, iş adreslerini bilgilerini etiket formatında richedit üzerinde gösteriyorum.

DbGrid müşteri listesi kriterlerine , A tablosundaki Adres Bilgilerini içeren field'lar üzerinden sokak, semt, Ilce, şehir, vs alanları sorgulama ya dahil ettiğimde müşteri Listesi kayıtları DbGrid üzerinde mükerrer çıkıyor.
Adres Bilgilerinde aynı kişinin birden fazla adres bilgisi varsa müşteri Listesi VT'ye bağlı DbGrid üzerinde de o kadar sayıda ayrı row çıkıyor. Bunu farklı Join'ler üzerinden oluşturmak için denedim başaramadım. Select içine Distinct ekleyerek yapmaya çalıştım olmadı.
L tablosundaki Cari kayıt müşteri listesi sorgusunda dbgrid üzerinde her bir müşteri için sadece bir kere kere kayıt gözükecek şekilde, kasmadan çalışacak sql sorgusu nasıl olmalı.
Çok teşekkürler..


Çalıştırdığım Kodum şöyle;
Kapsamx:='%';

Query_Cari_List.SQL.Clear;
Query_Cari_List.SQL.Add(' SELECT Distinct L.KartNo, L.Adi,
L.Sadi,L.Isim, L.SoyIsim, L.cKart_AS, L.cKart_KF, ');
Query_Cari_List.SQL.Add(' L.Avans, L.Kalan, L.Aksayan, L.gecerPara,
L.KlnSayi, L.AksSayi, L.BorcDrm,');
Query_Cari_List.SQL.Add(' L.StPerNo, L.StIsim, L.MersisNo,
L.FirmaAdi,L.TarihSnIs, L.GckTur, ');
Query_Cari_List.SQL.Add(' L.BlgTakibi, L.VerNo, L.VerDA, L.Durumu,
L.Ack, ');

Query_Cari_List.SQL.Add('A.KartNo, A.Adi, A.Sadi, A.Adr_Turu, A.Adres,
A.Tc_No, A.Sehir, A.Ilce, A.Semt, ');
Query_Cari_List.SQL.Add('A.CpTel, A.EvTel, A.IsTel ');
Query_Cari_List.SQL.Add('FROM ''' + vtx1 + ''' L INNER JOIN ''' + vtx2 +
''' A ON (A.KartNo=L.KartNo)');
Query_Cari_List.SQL.Add('WHERE L.Isim Like ''' +Kapsamx + '' +
dmd.Bylt(Edit1.Text) + '%''');
Query_Cari_List.SQL.Add('order by L.Isim');
Çözüm üreteçek, konuya ışık tutacak olan kişilere teşekkür ederim.
Saygılarımla
... ...
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen ertank »

Merhaba,

Müşterinin birden fazla adresleri arasından müşterinin "hangi adresini" göstermek istediğinizi nasıl ayırd ediyorsunuz?
Malum Adresler tablosunda 3-4 adres kaydı olabilir. Listede gösterilecek olan adres nasıl biliniyor? Mesela Adres tablosu içinde aktif adres gibi bir kolonunuz var mı?

Bu tür bir ayrım imkanı olmadığı sürece tüm adresler listeye dahil olur, mükerrer müşteri listelenir.
Arif
Üye
Mesajlar: 5
Kayıt: 09 Şub 2023 02:03

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen Arif »

İlginize önce teşekkür ederim.
Her adresin bir AdrTuru, AdrAdi diye kaydedilen iki field'i var.
Aldığı değerler AdrTuru 'M' (müşteri) veya K(kefil), değerlerini tutuyorum,
Diğer AdrAdi field'ı ise AdresAdi='Ev', veya 'İş' olarak veri tutuluyor.
Bu parametreler yardımıyla hem müşteri hem de kefil aadreslerini çekiyorum. Cari kart hesabıyla ilişkilendirilmiş (KartNo Id ) en fazla şimdilik 4 adres tutuluyor. Ama altyapıda yazlık veya geçici adresler ve kullanım tarihlerine göre otomatik seçilecek şekilde çok sayıda adres kaydı tutabilir.
En son Arif tarafından 14 Şub 2023 09:37 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen ertank »

Merhaba,

Farklı olarak ifade etmeye çalışayım.

Sorununuz şu, CARI 1 kayıt, ADRES 4 kayıt. Join ile birleştirilmesi halinde sonuç 4 kayıt olur. Siz bunu 1 istiyorsanız, 4 tane içinden hangisini kullanacağınızı spesifik olarak biliyor olmalı ve sorguda bunu filtreliyor (filtreleyebiliyor) olmalısınız.

Tahminen "AKTİF ADRES" gibi 4 adres kaydından sadece 1 tanesinde değer içerecek bir kolona ihtiyacınız var diye düşünüyorum. Kullanıcı çoklu adreslerden sadece bir tanesini aktif olarak işaretleyecek, sizde raporlamada sadece bu aktif işaretli adresi listeleyeceksiniz.
Arif
Üye
Mesajlar: 5
Kayıt: 09 Şub 2023 02:03

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen Arif »

Doğrudur. Adres onceliği diye bir alanım var. Uyarı mektuplarında zarf etiketlerine fatura veya ödeme bilgisine öncelikli adres yazılıyor.

Ekranda küçük pencereler halinde tüm adresleri gösteriyorum. Boşluk tuşuna basınca müşteri adresleri ev ve iş , bir daha badınca kefil adresleri ev ve iş, bir daha basınca ödenecek belgeler, taksitler Veya bar üzerinde buttonlar aracılığı ile hangi bilgiyi görmek isterse ilgili buttona basarak doğrudan pencereyi değiştirmek mümkün oluyor.
Cari liste üzerindeki konumlanan satırdaki müşteriye ait, cari işlemler, adresler, satışlar, çek ve senetler, risk analizi vs. Gibi tüm bilgileriine function veya procedureler üzerinden ulaşılıyor.
En son Arif tarafından 13 Şub 2023 05:59 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Arif
Üye
Mesajlar: 5
Kayıt: 09 Şub 2023 02:03

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen Arif »

Cari listede bir kayıt üzerinde iken;
Müşteri için
Adres_Bilgisi Al('M', 'Ev')
Adres_Bilgisi Al('M', 'İş')

Veya Kefil için
Adres_Bilgisi Al('K', 'Ev')
Adres_Bilgisi Al('K', 'İş)

Adres_Bilgisi Al('M', ' ')
İkinci parametreyi boş gönderince hem Ev ve İş Adresi tek seferde pencereye çekiliyor.
Telefon_Bilgisi_Al('M') veya ('K')
Böyle procedure'lerim var.
Parametreleri değiştirerek ilgili bilgileri sql ile çekiyorum.
Bariz sorun Cari_Listededeki kayıt tekrarı.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen ertank »

Arif yazdı: 13 Şub 2023 05:12 Bariz sorun Cari_Listededeki kayıt tekrarı.
Aslında sorunun ne olduğu başından beri belli. O kısımda soru işareti yok. Sadece siz benim sorular ile farkına varmanızı sağlamaya çalıştığım şeyi anlayamadınız.

Sizin SQL komutunuz benim bildiğim tüm SQL veritabanlarında aynı şekilde çok satır çevirecektir. Çünkü master-detail ilişki ve geçekten detail tabloda birden fazla eşleşen kayıt var. Sorunuzda hangi veritabanı sistemini kullandığınızı bildirmemişsiniz. Ancak şöyle düşünün "onbinlerce belki daha fazla kişinin kullandığı XXX veritabanı sistemi bu kadar çok kullanılan bir özellikte hatalı çalışmıyordur".

Sizin detail tablodaki kayıtlardan SADECE BİR TANESİNİ seçebiliyor olmanız gerekli. Bu kayıt hangisi olacağı uygulamanızın mantığına bağlı. Tek kayıt seçimi yapabilmek için buna özel bir kolonunuz ve içinde de doğru değer olması (Örn: bir müşeterinin 4 adet adresinden sadece bir tanesinde 1 (bir) değeri diğerlerinde 0 (sıfır) değeri olması) gerekir.

Bu olduğu halde siz JOIN kısıtlarına ilgili kolon ve değerini yazarak tek satıra düşürebilirsiniz.

Kod: Tümünü seç

select
  L.*,
  A.adres
from
  musteri L
  inner join adres A on A.kartno=L.kartno and A.musteri_bazinda_tekil_isaretli_kolon_adi=1
Tekrar eden sorunuzdan bende JOIN işlemine çok hakim olmadığınız düşüncesi oluştu. Bunun için aşağıdaki bağlantıyı okumanızı tavsiye ediyorum. Çok uzun değildir. 10dk vaktinizi almaz. Gerekli ise çeviri için Google Translate kullanabilirsiniz.
https://www.geeksforgeeks.org/sql-join- ... ull-joins/

Eğer join sizin için uygun değil ise istediğinizi "sub select" kullanarak yapmanız mümkün olabilir. Aşağıdaki örnek FirebirdSQL veritabanına özeldir. Farklı veritabanı kullanıyorsanız uyarlama yapmalısınız. Bu örnekte hangi adresin seçileceğinin belirlenmesi mümkün değildir. Mesela 10 numaralı müşteri için bir çalışrıtmada ev adresi, diğer çalıştırmada iş adresi gelebilir. Bunu veritabanı sistemi o anki "cache" vb duruma göre belirler.

Kod: Tümünü seç

select
  L.*,
  (select first 1 A.adres from adres A where A.kartno=L.kartno) as adres
from
  musteri L
Özellikle belirtmek isterim ki sub select performansı inner join'e göre çok yüksek ihtimal ile daha yavaş olacaktır.
Arif
Üye
Mesajlar: 5
Kayıt: 09 Şub 2023 02:03

Re: Sql Join işlemi ve dbgrid üzerinde mükerrer gözüken kayıtlar

Mesaj gönderen Arif »

Join olarak genelde Inner Join kullandım. join işlrminde fazla tecrübem yokhaklısınız.
İlgili makale öneriniz için teşekkür ederim. Bu akşam bakarım.
Kısa bir not düşmek istiyorum. Müşteri listesi sorgusunda hangi alana göre arama yapacaksam isim bilgisinin yanında sadece o alanı sorguya dahil ederek minimum kaynak kullanacak şekilde veri çekiyorum.
Liste oluştuktan sonra farklı amaçlar için, farklı sqller ile sadece bir müşteriye ait anlık sorgu yapıp bilgileri değişkenlere yükleyip daha pencerede gözükmeden bellek sızıntısı olmayacak şekilde hemen bellekten siliyorum. Sadece program kapatılana kadar Liste quary bellekte kalıyor.
Başta gönderdiğim query temel çalışma yapmak için örnek sqldir. Liste dbgrid üzerinde mükerrer kayıt oluşturmadan kişi Id nosunu alabilmek. Bu aşamada başka veri çekmek için uğraşmıyorum. Adres kayıtlarının sayısı önemli değil. Listedeki kişilerin bir alana göre hangi semt veya sokakta veya ilçede veya adresde bulunuyor olmalarının sql sorgusuna dahil edilmesi Diğer query'ler anlık çalışıp siliniyor.
Sql sorgulama tekniklerini tekrardan gözden grçirmenin zamanı gelmiş. Yeniden eksikliklerimi tamamlamak bildiklerimi pekiştirmek üzere araştırmaya başlıyorum.
Bu arada çözüm için yeni fikriniz olursa yararlanmak isterim.
Sn. Ertank;
ilgi ve önerileriniz ve ayırdığınız vaktiniz için çok sağolun. Saygılarımla..
Cevapla