Herkese iyi akşamlar
Aşağıdaki sql ifadesinde yer alan m1,m2,m3 field'ları double tipinde. İçlerinden herhangi birisi "null" ise toplam yapılmıyor. Sadece hepsinin bir sayısal değeri var ise toplam başarılı bir şekilde yapılıyor. Kodumu daha fazla uzatmadan herhangi birisi "null" olsa dahi toplamları nasıl alabilirim.
1. Eğer bu alanlara default değer olarak 0 verirseniz probleminiz baştan çözülür. Eski kayıtlara da ufak bir SQL yazımı ile null değerleri 0 yaparsınız. Bunu alışkanlık edinmeniz iyi olur.
2. Oracle gibi bazı veritabnlarında bu işi yapan fonksiyonlar var. Mesela oracle'da NVL idi yanlış hatırlamıyorsam. bu fonksiyonla null bir değerli, 0 gibi alabilirsin.
Cevap yazan herkese teşekkür ederim
Mustafa bey ilgili alana default değer zaten vermiştim. Ama yinede "null" değer alıyor. Belki işe yarar FireBird 1.0.3 kullanıyorum.
Eger ilgili alanınızın veritabanı tarafında bir default degeri var ise yani 0 ise o deger sonradan siz null yapmadiginiz surece null deger olmaması lazım. Ya da sonradan default deger verdiyseniz eski kayitlardan null kalabilir... Mesela sybase de isnull diye bir fonksiyon var ve
seklinde toplama yapabiliyorsunuz. Ama sanirim Firebird'de yok boyle bir komut. En azindan interbase'de yoktu....
Sizin icin akla gelen tek cozum mevcut null degeri olan alanlari 0 olarak update edin. Sonra da o alanları default 0 tanımlamaya ilaveten NOT NULL olarak tanımlarsanız null olmamalarını garantilemiş olursunuz. Admin'in de dediği gibi program içinde hesaplamaya girecek alanların NOT NULL olarak tanımlanmasına dikkat etmek bu anlamda faydali olacaktır....
İlgili alanımın veritabanı tarafında KESİNLİKLE bir default değeri var ve o değer "0". Buna rağmen ilgili alan KESİNLİKLE "null" kalıyor. Eski kayıtların hepsini tasarım aşamasında olduğumdan dolayı siliyorum. Bu problemi sadece sayısal alanlarda değil tanımladığım hiç bir alanda başaramıyorum. İlgili alana default değer vermemin yanında birde "NOT NULL" yaptığımdada bu alana "Null" değer atayamayacağımı belirten hata alıyorum. IBExpert kullanıyorum. IBExpert'de yeni bir kayıt eklediğimde problem çıkmıyor (Default değer olarak "0" kabul ediliyor). Ne oluyorsa Delphi'de oluyor.
yeni kayıt girisini yada edit islemini delphinin dbaware bilensneleri ile yapıyorsanız ondan olabilir
kayıt giisi yapan bir storedproc yazın ve bunu deneyin
bende otomatik sayıyı dbaware bilesenlerde atamıyordu storedproc yada sql ile atama yapıyordu
ibexpert te zaten sql ile islem yapıyor bildigm kadarıyla
Table ya da query'ye cift klik yapinca cikan fieldexplorer'da not null yaptiginiz alana gelin. Onun Reqired ozelligini False yapin. not null alanlarda bu deger default olarak True olur ve de bunun anlami da "Ey Delpih bu alana ben deger atamadan sakin sen post işlemini yapma" demektir. Dolayisiyla delphi post işleminden sonra database de insert islemi olacagi icin de database tarafindaki default deger atanma işi gerçekleşemeden delphi kendisi deger kontrolu yapmakta ve kaydettirmemekte. IBExpert'ten kayıt eklemekte sorun cikmamasi da boyle bir kontorlun yapılmamasıdır.
Bunları degistirip not null yaptiktan sonra hala bu sorun varsa Admin'in dedigi gibi mutlaka ama mutlaka kodlarınızda bir yerlerde veya componentte degeri null' e cevirme vardir.
1. Sonradan kesinlikle alanlar üzerinde herhangi bir işlem yapmıyorum.
2. Bu tavsiye olabilir ama kolayca yapabileceğimiz bir işi (yani kolay olduğunu var saydığımız) uzatmış olmaz mıyız. Ve veritabanımdaki 7 tablomun her birinde bu şekilde ortalama 60 tane (7x60~=420~) double alan var
Mustafa bey eğer zamanınız var ise sizde bir deneme yapıp kendiniz görün lütfen.
- gkimirti'ye
Yeni kayıt girişini delphinin dbaware bileşenleri ile değil TMS Firmasının "DBAdvEdit" (harika bir bileşen) bileşeni ile yapıyorum. Otomatik sayılar ile ilgili problemi bende yaşamıştım.
hocam ben genelde bu yöntemi kullanıyorum (2 numara). 460 tane double alanınız vardır belki ama her işlem de hepsini kullanmıyorsunuz herhalde? + hepsinin de sıfırlanmasına gerek (toplama ihtiyacı) olmayabilir.
en azından test amaçlı bir yapıp denemenizde fayda var.
Test için de söz veremiyorum ama fırsat bulursam denerim inşallah.
name yazdı:2. Bu tavsiye olabilir ama kolayca yapabileceğimiz bir işi (yani kolay olduğunu var saydığımız) uzatmış olmaz mıyız. Ve veritabanımdaki 7 tablomun her birinde bu şekilde ortalama 60 tane (7x60~=420~) double alan var
Mustafa bey eğer zamanınız var ise sizde bir deneme yapıp kendiniz görün lütfen.
Aslinda cok uzun olmaz .. Şöyle ki tablonun before post eventinde tablonun alanlarını tarayacak ve de deger atanmayanlara 0 atayacak bir kod yazıp butun tablolarin eventlerini tek bir yere yonlendirip 5-6 satirlik kod ile is cozulebilir. Ornek:
for VAR_FIELD_COUNTER:=0 to FieldCount-1 do
if (Fields[VAR_FIELD_COUNTER].FieldKind=fkData) and
(Fields[VAR_FIELD_COUNTER].DataType=ftString) and
(Fields[VAR_FIELD_COUNTER].Isnull) then
Fields[VAR_FIELD_COUNTER].AsFloat:=0;
Kodu denemedim buglari olabilir ama temel mantık olarak calisacaktir. Zira benzer bir işlemden kopyalayara kdegistirdim.
Ama ben yine de bir onceki mesajda tarif ettigim sekilde alanlarin Required ozelliklerini False yapip alanlari not null olarak tanımlamanızı de zaten varmis alanlarin default degerleri olmasını öneririm....
Fahrettin bey teşekkür ederim ama ben yapmak istediğim şeyi kodumda bazı değişiklikler yaparak hallettim.
Yalnız bu problem bana bir bug mış gibi geldi. Bence bunu açıklığa kavuşturmamız gerekiyor. Biraz araştırma yaptım ve http://216.101.185.148/scripts/isapi.dl ... le=4888424
bu linkten bir bilgiye ulaştım ama ingilizcem o kadar iyi değil. Tam tercüme edebilirsek problemi anlayacağız gibi geliyor.