ADOQuery1 sorgusundan herhangi bir alanın null olma durumu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
digitdigitman
Üye
Mesajlar: 32
Kayıt: 04 May 2014 02:23

ADOQuery1 sorgusundan herhangi bir alanın null olma durumu

Mesaj gönderen digitdigitman »

merhaba arkadaşlar
bir konuda yardımlarınızı rica ediyorum.

.
.
.
.
ADOQuery1.sql.add('select * From person');
.
.
.
bu sorgu sonucunda yaklaşık olarak 45 tane alan sorgulanıyor. kimi alanda deger var int veya varchar. kimilerinde ise alanlarda veri yok yani NULL dönüyor. bu sorguda gelen kayıtlardan birtanesinin tüm değerlerini başka bir formdaki ilgili editlere yazmak istiyorum ama veri olan alanlarda sorun yokken NULL alanlarda sorun yaşıyorum. bunuda

if ADOQuery1.fieldvalues['evtel']='NULL' then
begin
Form1.DBEdit1.text='';
end
else
if ADOQuery1.fieldvalues['evtel']<>'NULL' then
begin
Form1.DBEdit1.text=ADOQuery1.fieldvalues['evtel'];
end;

koduyla çözmeye çalışıyorum ama --Could not convert variant of type (Null) into type (Olestr)-- hatası alıyorum.
istediğim şey seçtiğim kayıttaki null olan alanların yerine form üzerindeki ilgili DBEdit içine '' (boşluk yazabilmek)
yardımlarınız için şimdiden teşekkürler.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: ADOQuery1 sorgusundan herhangi bir alanın null olma duru

Mesaj gönderen xxxjedixxx »

Merhaba,

NULL, 4 karakterden oluşan bir text değildir. NULL, değeri olmayan anlamındadır. Bu yüzden tırnak içinde kullanılmaz.

if VarIsNull(ADOQuery1.fieldvalues['evtel']) then
veya
if ADOQuery1.fieldvalues['evtel'] = Null then
digitdigitman
Üye
Mesajlar: 32
Kayıt: 04 May 2014 02:23

Re: ADOQuery1 sorgusundan herhangi bir alanın null olma duru

Mesaj gönderen digitdigitman »

teşekkürler xxxjedixxx bunları denediğimi düşünüyordum ama atladığım bişey varmış demekki.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: ADOQuery1 sorgusundan herhangi bir alanın null olma duru

Mesaj gönderen thelvaci »

Veri türlerinden anladığım kadarı ile veritabanınız SQL Server. Bu durumda; ISNULL kullanabilirsiniz SELECT içinde çekerken. Örneğin;

Kod: Tümünü seç

SELECT
   Adi,
   Soyadi,
   ISNULL(Yasi, 0) AS Yasi,
   ISNULL(Telefonu, '<BOŞ>') AS Telefonu
FROM Person
gibi.

Ayrıca TField sınıfının IsNull değerini de kullanabilirsiniz. Örneğin;

Kod: Tümünü seç

if ADOQuery1.FieldByName('Yasi').IsNull then ;
gibi.

Bunun yanında; atama yaparken neden DBEdit1'i kullanıyorsunuz onu da anlamadım. Bağlı bulunduğu DataSet'in ilgili field'ına atama yapmanız daha şık olacaktır.
digitdigitman
Üye
Mesajlar: 32
Kayıt: 04 May 2014 02:23

Re: ADOQuery1 sorgusundan herhangi bir alanın null olma duru

Mesaj gönderen digitdigitman »

bilgiler için çok teşekkür ederim. thelvacı. son soruna gelince. bir H.B.Y.S. şirketinde arge ve eğitim destek bölümünde çalışırken. o zamanlar kodlama ile fazla haşır neşir değildim. bazı ufak tefek işlerimizi kolaylaştırıcı programcıklar yazıyordum. bu alışkanlık o zamandan kalma. ve asıl üstadımızın bir sözü olmuştur bana. programcılıkta nasıl alışırşan öyle gider diye. ve nitekim öylede gidiyor.

bu arada bu şekilde yazılmasının performans açısından herhangi bir etkisi olurmu acaba varsa bu bilginide paylaşırsan sevinirim dedimya alışkanlık hazırladığım programda bu şekilde kullandığım çok yer oluyoda. zararın neresinden dönersem kar olur.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: ADOQuery1 sorgusundan herhangi bir alanın null olma duru

Mesaj gönderen thelvaci »

Rica ederim. Performans açısından tabii ki sıkıntı olur. En basit anlamı ile çevirim işlemleri devreye giriyor. Örneğin; TDBEdit'in bağlı olduğu field'ın türü integer olsun, ancak siz değer atamasını TDBEdit'in Text property'si vasıtası ile gerçekleştiriyorsunuz-ki bu da string-, bu durumda veri türü dönüşümü yapmış oluyorsunuz. En nihayetinde varılacak nokta TField'ın ilgili metodlarıdır. SetAsString gibi.

Ayrıca, TDBEdit'in Text property'si TControl'e kadar giden bir hiyerarşi takip eder. Aslında siz TDBEdit'in Text property'sine atama yaptığınızda; o anda bağlı bulunduğu ilgili field'ın değerini değiştirmiş olmazsınız; bu da uygulamalarınız içinde TField'ın değerini kontrol ettiğiniz noktalarda hatalarla karşılaşmanıza neden olur.!

Örneğin; basit bir şekilde AdiSoyadi alanına bağlı bir TDBEdit üzerinde DBEdit.Text := 'Delphi'; yazıp ardından ilgili field'ın değerini Tablo.FieldByName('AdiSoyadi').Value ile kontrol ettiğinizde yaptığınız değişikliğin henüz etkileşime girmediğini görürsünüz. Oysaki atamanızı Tablo.FieldByName('AdiSoyadi').Value := 'Delphi'; biçiminde yapmış olsa idiniz, değişikliğin hemen gerçeklendiğini TField'ın ilgili metodlarına(Örn.SetAsString) dallanıldığına şahit olabilirdiniz.

Umarım yeterince izah edebilmişimdir.
Cevapla