Sql hakında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Sql hakında

Mesaj gönderen name »

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.

Kod: Tümünü seç

 select ack, (m1+m2+m3) toplam from kasa
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

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.

Kolay gelsin.
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Bu konu ile ilgili değerlendirmeleri aşağıdaki linkte bulabilirsiniz.

viewtopic.php?t=674&highlight=null

Kolay gelsin
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

SQL Server'da CASE fonkdiyonu var, onla şöyle yapılabilir

Kod: Tümünü seç

select ack, 
(CASE WHEN m1+m2+m3 IS NULL THEN 0 WHEN m1+m2+m3 NOT IS NULL m1+m2+m3 END) toplam from kasa 
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

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.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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

Kod: Tümünü seç

Select isnull(m1,0)+isnull(m2,0)+isnull(m3,0) ...
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....
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

İ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.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

hocam sanırım bir yerde yanlış yapıyorsunuz. Interbase tarafında default değer 0 vermişseniz, yeni kayıt eklendiği zaman direk değerini 0 atar.

1. veritabanı 0 yapıyor ancak siz sonradan null atıyorsunuz şeklinde olabilir. Bir kontrol edin kodunuzu.

2. OnNewRecord olayında 0 atamayı deneyin. Yani :

...FieldByName('ALAN_ADI').AsFloat := 0;

gibi.

Kolay gelsin.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

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
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Herkese iyi çalışmalar

- Mustafa Şimşek'e

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. :D

- 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.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

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.

Kolay gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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. :D
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:

Kod: Tümünü seç

  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....
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

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.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Birde çok basit bir deneme projesi hazırladım isteyen aşağıdaki linkten yükleyip proplemi görebilir
http://www.cozumgumruk.com/deneme.zip
Cevapla