Firebird tabloda Field Type Size alan

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Firebird tabloda Field Type Size alan

Mesaj gönderen haydarxxx »

Slm
Tablodaki Field Type alanında tam sayı (tamsayılar 1,2,3,4,5,6,7,8,9)değerleri tutmak istiyorum ve tutacağım alana yanlızca 1 karakter girilmesini istediğim için size değerini 1 yapıyorum ama birden fazla değer girişi yapılıyor veritabanı tüm sayısal değer alanlarında denedim hepsi aynı durumda bunun için ne yapamam lazım
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

sanırım olabilecek en küçük int değeri için SMALLINT tanımlamalısın..

ama oda 1 basamaklı sayıdan fazlasını kabul eder yanılmıyorsam 65535 e kadar..

senin yapman gereken bence ya CHAR alan tanımlayıp kullanırken int e çevireceksin ,
yada
SMALLINT kullanıp, giriş sırasında tek basamaklı bir sayı olması için kontrol yapacaksın..
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Tek basamak girililebilecek mask kullanabilirsin ya da veritabanına alanın tanımında kontrol (check) koyabilirsin.. şu aralıkta olsun diye :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

:? Varchar kullanmaya karar verdim yanlız konu başlığı ile örtüşmeycek ama umarım admin kızmaz hemen burada bir soru daha ilave etmek istiyorum burada string olarak tanımadığım alanları int e çevirerk toplama yapıyorum ki bu toplam 31 alandan ibaret

Kod: Tümünü seç

IBDataSet_DETAY.FieldByName('Toplam').Asinteger:=strtoint(IBDataSet_DETAY.FieldByName('1').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('2').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('3').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('4').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('5').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('6').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('7').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('8').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('9').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('10').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('11').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('12').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('13').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('14').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('15').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('16').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('17').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('18').Asstring)
+Strtoint(IBDataSet_DETAY.FieldByName('19').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('20').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('21').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('22').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('23').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('24').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('25').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('26').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('27').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('28').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('29').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('30').Asstring)+Strtoint(IBDataSet_DETAY.FieldByName('31').Asstring);
aynı satırdaki bu değerleri sum gibi bir foknsiyonla nasıl toplatabiliriz ayrıca string değer boş olursada toplam yaptırabilirmiyiz yani boş olan değeri es geçsin sadece dolu olan değerleri toplatsak.şimdiden teşekkürler.cevaplar içinde
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Birincisi delphi tarafta verdiğin yazım şeklinde IBDataSet_DETAY.FieldByName('1').AsInteger şeklinde yazarak StrToInt() den kurtarıp sadeleştirebilirsin.

İkincisi; SELECT içerisinde yapabilirsin.

Kod: Tümünü seç

select alan1+alan2+..+alan31 as Toplam from tablo...
Sayısal alanlar + (artı) ile karakter/string alanlar || ile toplanır. String alanlardaki toplamadan çok ekleme/birleştirme şeklinde oluyor :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

hocam selct ile şu şekilde denedim ama alanlar yerine sorgudaki değerleri topluyor örngin ilk üç alanda 9+9+9=27 olması gerekirken

Kod: Tümünü seç

IBQuery1.Close;
IBQuery1.sql.Clear;
IBQuery1.SQL.Add('select  1+2+3 as TOPLAM from   TBL_EKDERS ');
IBQuery1.Open;
IBDataSet_DETAY.edit;
IBDataSet_DETAY.FieldByName('TOPLAM').Value:=FloatToStr(IBQuery1.FieldByName('TOPLAM').AsFloat);
IBDataSet_DETAY.post;
1+2+3 den 6 yapıyor alan adlarım 1-2-3-3-5 şeklinde gidiyor :?:

ikinci şekildeki toplama işlemimde

Kod: Tümünü seç

IBDataSet_DETAY.FieldByName('Toplam').Asinteger:=IBDataSet_DETAY.FieldByName('1').Asinteger+IBDataSet_DETAY.FieldByName('2').Asinteger................IBDataSet_DETAY.FieldByName('Toplam').Asinteger:=IBDataSet_DETAY.FieldByName('30').Asinteger+IBDataSet_DETAY.FieldByName('31').Asinteger
yaptığımda alan değeri boş ise hata alıyorum (is not a valid integer value) şeklinde burada ki 31 değer alanları bir ayda olabilecek gün sayıları.Bütün alanları if sorgusu ile kontrol ettirip boş ise sıfır yaz yaptırarak işi hallede biliriz belki ama bu kontrol çok uzun olacak.Tek tek alanları ikinci yöntemdeki gibi toplama durumunda boş olan veriyi toplama işelemine katmadan yani is not a valid integer value hatasına düşmeden nasıl toplatabiliriz.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

viewtopic.php?t=19680

Kod: Tümünü seç

stringislem(IBDataSet_DETAY.FieldByName('1').AsString+'+'+IBDataSet_DETAY.FieldByName('2').AsString+'+'.....) 
:D
kolay gelsin :twisted:

Edit :
Ayrıca
rsimsek yazdı:Tek basamak girililebilecek mask kullanabilirsin ya da veritabanına alanın tanımında kontrol (check) koyabilirsin.. şu aralıkta olsun diye :wink:
güzel bir yaklaşım. Bunu da göz önünde tutmanda fayda var.
Cevapla