MSSQL 2005 Server'da default değer alma

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
CLMan
Üye
Mesajlar: 13
Kayıt: 01 Oca 2008 12:18

MSSQL 2005 Server'da default değer alma

Mesaj gönderen CLMan »

Merhaba Arkadaşlar,

Borland C++ Builder (Turbo C++ Explorer 2006) dbGo bileşenlerini kullanarak MSSQL Server 2005 Management Studio Express'de oluşturduğum tablolarla işlem yapmaya çalışıyorum.

Ancak, tablolarda "bit" veri olarak tanımladığım alanlara "Default Value or Binding" bölümünde verdiğim değer ne olursa olsun (ister 0 ister 1), programda bu alana karşılık gelen TDBCheckBox değeri daima 1 oluyor (checked). Paradox tablo oluştururken kolayca başardığım default değer verme işlemini burada başaramadım.

Yardımlarınızı bekliyorum!
Saygılarımla!
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Default verdiğiniz (DB Üzerinde verdiğiniz Default Değeri) Siz herhangi bir INSERT yaptığınız sırada değerini mi almıyor? Biryerlerde bir Event olmasın? Kontrolleriniz tamam mı?

Ayrıca, Oracle Forms'dan biliyorum belki şöyle bir özelliği vardır, Checkbox'larda, Checked Değer, Unchecked Değer, bunların dışında bir değerle karşılaşırsa Checkbox Nasıl Davransın (Checked mi, unchecked mi, yoksa Grayed mi) gibi bir uygulaması var.

Sizin bileşende de buna benzer bir şey olabilir mi?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
CLMan
Üye
Mesajlar: 13
Kayıt: 01 Oca 2008 12:18

Mesaj gönderen CLMan »

Selamlar Kuri_YJ,

Nazik cevabınız için öncelikle teşekkür ederim.

Doğrudur. INSERT işlemi uyguladığımda DBCheckBox default değerleri veritabanından almıyor. Default değerlerin veritabanından okunması için Insert() komutunun peşinden Refresh() komutu kullanmak zorunda kalıyorum:

DBNavigatorMain->DataSource->DataSet->Insert();
DBNavigatorMain->DataSource->DataSet->Refresh();

Ayrıca, belirttiğiniz gibi, BeforeInsert veya AfterInsert event'lerini kullanarak default değerleri tek tek atamakta bir çözüm olabilir ama doğru çözüm olduğu konusunda (pratik olmadığı için) tereddütlerim var.

Bildiğim kadarıyla, TDBCheckBox'ın sizin tanımladığınız koşulları taşıyan bir özelliği yok. Sadece ValueChecked ve ValueUnchecked olmak üzere işaretlendiğinde ve işaretlenmediğinde alacağı değerleri belirleyen 2 özelliği var.

Bir de yardım dosyasında aşağıdaki gibi bir ifade var:

If the DataField of the database check box is a logical field, the check box is always checked if the contents of the field is true, and it is always unchecked if the contents of the field is false. The values of the ValueChecked and ValueUnchecked properties have no affect on logical fields.

Saygılarımla!
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Aslında düşününce Default Değerler (DB'de Table'lara tanımlanan Default Değerler) Insert sırasında değer alırlar.

Yani, INSERT cümlesi yolladığınızda SERVER'a eğer siz o FIELD'lar için bir değer SET etmediyseniz FIELD o durumda nasıl bir değer ile doldurulup kaydolunması gerektiğini belirtmiş oluyorsunuz.

REFRESH zorunluluğu da burada geliyor. Ben genelde bu tür durumlardan uzak dururum ve şöyle bir mantık izlerim. Daha önceden benzer sorunlarla karşılaştığım için LOGICAL FIELD kullanmam. Onun yerine INTEGER bir FIELD'a 0 veya 1 Değerlerini vererek kontrollerimi sağlarım. Ayrıca Delphi ile yazarken kullandığım bileşenlerin de değerlerini ValueChecked = 1 ve ValueUnchecked = 0 olacak şekilde düzenlerim.

Belki siz de böyle bir yöntem uygulayabilirsiniz. Bu bir çok sıkıntıyı da ortadan kaldırır diye düşünüyorum. Deneyin bakalım olacak mı?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

CLMan yazdı: Ayrıca, belirttiğiniz gibi, BeforeInsert veya AfterInsert event'lerini kullanarak default değerleri tek tek atamakta bir çözüm olabilir ama doğru çözüm olduğu konusunda (pratik olmadığı için) tereddütlerim var.
Saygılarımla!
bende kendi çabımda veri tabanı programları yazıyorum. bencede çözüm en sancısız olduğu şekilde bu after inser olayında alana değer atamak.

sorunun sizden gizli bir tarafı daha var. örneğin tabloyu alter ettiniz ve default değeride unuttunuz. yandı gülüm keten helva işte.

Kuri usta nın iki öneriside uygulanabilir ancak ben hazır gelecek bütün değerler için after insert i kullanırım.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
CLMan
Üye
Mesajlar: 13
Kayıt: 01 Oca 2008 12:18

Mesaj gönderen CLMan »

REFRESH zorunluluğu da burada geliyor. Ben genelde bu tür durumlardan uzak dururum ve şöyle bir mantık izlerim. Daha önceden benzer sorunlarla karşılaştığım için LOGICAL FIELD kullanmam. Onun yerine INTEGER bir FIELD'a 0 veya 1 Değerlerini vererek kontrollerimi sağlarım. Ayrıca Delphi ile yazarken kullandığım bileşenlerin de değerlerini ValueChecked = 1 ve ValueUnchecked = 0 olacak şekilde düzenlerim.

Belki siz de böyle bir yöntem uygulayabilirsiniz. Bu bir çok sıkıntıyı da ortadan kaldırır diye düşünüyorum. Deneyin bakalım olacak mı?
Veritabanında tanımlı bir integer alana atadığım default değerde maalesef bileşenler tarafından okunmuyor.

En son çözüm olarak (içime sinmese de) şimdilik, OnNewRecord event içinde default alan değerlerini tek tek atamayı seçtim.

Saygılarımla!
Cevapla