dblookupcombobox kullanımı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fatihyegen
Üye
Mesajlar: 19
Kayıt: 08 May 2020 05:20

dblookupcombobox kullanımı

Mesaj gönderen fatihyegen »

Herkese iyi günler ilişkisel veri tabanı kullanarak veri tabanına veri eklmeye calışıyorum fakat dblookupcombobox kullanırken
veri tabanından çekilmesi gereken verileri çekmiyor 2 gündür izlemedigim video kalmadı projeme bakarak hatamın nerede oldugunu söylerseniz sevinirim
teşekkürler

projem https://drive.google.com/open?id=1EF4TC ... BcgMuMsNRU_
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: dblookupcombobox kullanımı

Mesaj gönderen ertank »

Merhaba,

Paylaştığınız bağlantı çalışmıyor.

DBLookupComboBox kullanımı çoğu zaman kullanıcı için anlam ifade etmeyen kod alanlarını değil, kullanıcının anlayabileceği açıklama alanlarını göstermek için kullanılır. Aynı zamanda bu bileşen ekranda anlaşılır bilgi gösterip arka planda kod bilgisini kayıt edebilir.

DBLookupComboBox doğru çalışması için birden fazla özelliğini düzenlemeniz gerekir.
- Asıl verilerin olduğu DataSource (DataSource)
- Kod içeren alan adı (DataField)
- Aranacak verilerin olduğu DataSource (ListSource)
- Eşleşme olduğunda ekranda gösterilecek alan adı (ListField)
- Aranacak verilerin olduğu DataSource içinde Kod alanı bilgisini içeren alan (KeyField)

Örneğin bir fatura tablosunda fatura türü alnınız var. Bu alan numerik bir alan. Çeşitli fatura tür bilgilerini kayıt ediyor.
Başka bir tabloda da fatura türü ve açıklaması olduğunu düşünelim.

FATURA TABLOSU
Fatura No,Fatura Türü
1,10
2,10
3,20

FATURA TÜRÜ TABLOSU
Fatura Türü,Fatura Türü Açıklaması
10,Ticari Fatura
20,Proforma Fatura
30,Temel Fatura

DBLookupComboBox kullanıldığı zaman kullanıcı ekranda her zaman fatura türü açıklamasını görür. Ancak, fatura tablosunda her zaman fatura türü bilgisi (numerik bilgi) kayıtlı olur.
fatihyegen
Üye
Mesajlar: 19
Kayıt: 08 May 2020 05:20

Re: dblookupcombobox kullanımı

Mesaj gönderen fatihyegen »

Hocam dediginiz detayları tek tek kontrol etttim keyfield datasourchlar herşeyi denedim fakat veriler listelenmedi

linki yanlış koymusum sadece bakıp hatamı soylerseniz sevinirim gözden kaçırdıgım bişey var ama bulamadım

proje linki https://drive.google.com/open?id=1EF4TC ... BcgMuMsNRU_
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: dblookupcombobox kullanımı

Mesaj gönderen ertank »

Proje bağlantısını ben halen açamıyorum. Görebildiğim kadarı ile aynı bağlandı adresi.
Neden forumun "Tam Editör" ekranındaki dosya ekleme özelliğini kullanmayı denemiyorsunuz? ZIP veya RAR şeklinde tek dosya olarak sadece kaynak kodlar olacak şekilde yüklemeniz mümkün olabilir.

Belli bir boyuttan büyük dosya eki forumda izin verilmiyor. Bu yüzden derlenmiş EXE dosya, DCU dosyaları gibi gereksiz dosyaları sıkıştırılmış dosya içine dahil etmemenizde fayda var.
fatihyegen
Üye
Mesajlar: 19
Kayıt: 08 May 2020 05:20

Re: dblookupcombobox kullanımı

Mesaj gönderen fatihyegen »

Hocam dosya eklerinden denedim fakat sadece resim yuklendigi için yukliyemedim drive de surekli linki siliyor anlamadım

yeniden denedim açılmazsa artık kod ssleri yuklerim hocam

https://drive.google.com/file/d/1HXKqRZ ... sp=sharing
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: dblookupcombobox kullanımı

Mesaj gönderen ertank »

1) Form6 üzerindeki DBLookupComboBox özelliklerinden aşağıdakiler boş.
DataSource
DataField
İlk mesajımda bu alanların ne şekilde doldurulması gerektiğini yazmıştım.

2) Form6.OnCreate olayında aşağıdaki gibi bir kod kullanmalısınız ki listelenmesi gereken kayıtlar erişilebilir olsun.

Kod: Tümünü seç

ADOQuery1.Open();
Kaynak veri (ListSource.DataSet) kapalı iken DBLookupComboBox'ın veri çekmesi ve göstermesi mümkün değil.

3) DBLookupComboBox adı üzerinde "data aware" bir bilrşendir. Dolayısıyla bağlı olduğu DataSource ve DataField içine gerekli değerlerin atanmasını otomatik yapar. Ancak; siz mevcut tasarımınızda veri bağımsız bileşenler kullanarak işlem yapıyorsunuz.

3a) Siz veri girişini "data aware" bileşenler üzerinden yapacak iseniz tasarım değişikliği yapmalısınız.
3b) Mevcut tasarımı korumak istiyor iseniz bu durumda ekle butonu altındaki kodda aşağıdaki gibi bir düzenleme yapmalısınız

Kod: Tümünü seç

// Değiştirilecek satır
Parameters.ParamByName('arizaa').Value  := arizaa.KeyValue;
Ayrıca mevcut tasarımda uygun olan LookupComboBox (Başında "DB" yok) kullanmanız daha doğru olacaktır. Bu bileşende DataSource ve DataField kısımları yoktur. Ancak yukarıdaki örnek kod bu bileşen içinde çalışacaktır.

4) telefon isimli tablo içindeki tarih alanının veri türünü Metin değil tarih/saat yapmanızda fayda var. Aksi halde kullanıcı geçerli olmayan tarih girişi yapabilir. Kullanıcıdan doğru tarih bilgisi almak için TDateTimePickup bileşenini kullanabilirsiniz. Tarih/saat türünde veri kaydetmek için ilgili satırı aşağıdaki şekilde değiştirebilirsiniz

Kod: Tümünü seç

Parameters.ParamByName('tarih').AsDateTime  := DateTimePicker1.Date;
5) DBLookupComboBox kullandığınız zaman ana bilgi listelediğiniz ekranda arıza_id olarak rakam görmek kullanıcıya birşey ifade etmeyecektir. Bunun yerine orada açıklamasını göstermenizde fayda var. Açıklama gösterebilmek için iki farklı tablodaki verileri eşleştiren bir SQL kullanmalısınız. Form4 üzerindeki listele isimli TADOQuery bileşeni SQL özelliğini aşağıdaki şekilde değiştirerek bunu sağlayabilirsiniz.

Kod: Tümünü seç

select telefon.*, arizalar.ariza
from telefon
left join arizalar on arizalar.id = telefon.ariza_id 
Bunu yaptığınızda ek olarak ariza isimli kolon sorgu sonucunda gelecektir. Kolonun ekrandaki listede gözükmesini sağlamak için DBGrid1.Columns özelliğinin yanındaki "..." butonunu tıklayıp gelen pencereden Yeni bir kolon eklemelisiniz. 9 numara olarak eklenecek bu yeni kolonu fare ile tıklayarak seçip Object Inspector üzerinden FieldName özelliğine ariza yazmalısınız. Eğer kolonun en sonda gösterilmesini istemiyor iseniz fare ile 9 numaralı seçeneği drag&drop (sürükle&bırak) şeklinde daha üst sıralara taşıyabilirsiniz. İşlemler bitince kolon genişliğini ayarlamayı hmal etmeyin. Aksi halde çalışma zamanında oldukça geniş bir kolon olacaktır.

6) Aşağıdaki şekildeki bir kullanım çok doğru değildir.

Kod: Tümünü seç

form4.listele.Close;
form4.listele.Open;
form4.listele.Refresh();
İlk satır açık olan veri bağlantısını kapatır. İkinci satır yeniden veri bağlantısı açar.
Farklı bir ifade ile eğer verilerde değişiklik olmuş ise bunu yeni veri bağlantısı açıldığı zaman elde etmiş olursunuz.

Üçüncü satır ise veri bağlantısını özel bir yöntem ile (Veri bileşeninin kapabilitesine göre kolon bilgileri sunucudan okunmaz, bu bilgiler korunarak sadece veri okuması yapılır) kapatıp açar.
Farklı bir ifade ile eğer verilerde değişiklik olmuş ise bunu sadece bu satırı kullanarak elde etmiş olursunuz.

Özetle, üç numaralı satırdaki kod daha hızlı çalışır. Ancak; veri her zaman özel yöntem kullanılarak okunamayabilir. Karmaşık sorguları kapatıp açmak gerekebilir. Veya veri bileşeni yeterli kabiliyete sahip olmayabilir. Veya veritabanı bu tür bir talebi yerine getiremiyor olabilir.

Sizin durumunuzda yukarıdaki üç satırlık kodun sadece ilk iki satırını kullanmanız daha doğru olacaktır. Zira, birden fazla tablodan veriyi birleştirerek getirme yöntemini kullanırsanız TADOQuery bileşeni üç numaralı satırda size hata verecektir.

Kısaca aşağıdaki satırı silmenizi tavsiye ederim

Kod: Tümünü seç

form4.listele.Refresh();
fatihyegen
Üye
Mesajlar: 19
Kayıt: 08 May 2020 05:20

Re: dblookupcombobox kullanımı

Mesaj gönderen fatihyegen »

Bilgileriniz ve yardımlarınız için teşekkür ederim hocam dediklerinizi uyguladım
Cevapla