Update procedure

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ı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Update procedure

Mesaj gönderen serbek_tr »

Hayırlı Çalışmalar,
Arakdaşlar Şöyle bir durum söz konusu bir text ti procedure gönderiyorum ve çalıştırıyorum ancak virgül sorunum var iş şöyle başlıyor

Kod: Tümünü seç

  SQLTEXT := 'UPDATE TBL_STOK_KARTI SET';

  If Iskonto_Chk.Checked Then
    SQLTEXT := SQLTEXT+' ISKONTO ='+QuotedStr(Iskonto_Edit.Text)+' ,';

  If SFiyati_Chk.Checked Then
    SQLTEXT := SQLTEXT+' SATISFIYATI ='+QuotedStr(Satis_Fiyati_Edit.Text)+
    ' , SATISFIYATIDOVIZ ='+QuotedStr(Satis_Combo.Text)+' ,';

  If MFiyati_Chk.Checked Then
    SQLTEXT := SQLTEXT+' MALIYET ='+QuotedStr(Maliyet_Fiyati_Edit.Text)+
    ' , MALIYETDOVIZ ='+QuotedStr(Maliyet_Combo.Text)+' ,';

  If OKod_Chk.Checked Then
    SQLTEXT := SQLTEXT+' OZELKOD ='+QuotedStr(Ozel_Kod_Edit.Text);
***********
  If Copy(SQLTEXT,Length(SQLTEXT),1)=',' Then
    SQLTEXT := Copy(SQLTEXT,1,Length(SQLTEXT)-1);
*********** burası text in sonunda ',' olma ihtimaline karşın kontrol ediliyor ve varsa siliniyor.***********
Data.Update_SP.Params[0].AsString := SQLTEXT;
Data.Update_SP.ExecProc;
işte bu şekilde bir text gidiyor bu tekstin içeriği şu şekilde olsun

Kod: Tümünü seç

UPDATE TBL_STOK_KARTI SET ISKONTO =10 , SATISFIYATI ='11,56' , SATISFIYATIDOVIZ ='Türk Lirası' , MALIYET ='4,25' , MALIYETDOVIZ ='Euro' , OZELKOD ='C PEAK'
mesela satış fiyatı 11,56 olarak değilde 1156 olarak update ediliyor aynı şekilde maliyette . bunu nasıl düzeltebilirim

procedure ise şu şekilde

Kod: Tümünü seç

CREATE PROCEDURE SP_UPDT (
  SQLTXT VarChar(300))
AS
begin
   execute statement  :SQLTXT;
end
[/code]
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

decimalseparator ü değiştirip deneyebilirsin ama bence bu kullanışlı olmaz. SP ye string yerine parametreleri gönderip string i SP içinde oluşturmayı denedinmi ?

Kod: Tümünü seç

If Iskonto_Chk.Checked Then
    IBQuery1.ParamByName(ISKONTO).AsFloat = Sukadar
else IBQuery1.ParamByName(ISKONTO).Value = null
SP içinde bu chekboxlar yerine parametreleri IS NULL ile kontrol edersin

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

, yerine nokta kullanarak dene
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Üstad gkimirti nokta işe yaradı teşekkür ederim ancak bunu direk prodedure içerisinde parametresiz değerleri kod olarak yazdığımda çalışıyor dışarıdan parametre olarak verdiğimde neden algılamadı yada ayıraç olarak algıladı anlayamadım ama nokta işimi gördü teşekkür ederim

Üstad Freeman35 dediğiniz daha önce dememiştim şu anki daha kolay çünkü sorgulama text ini delphi tarafında yapıyorum procedure tarafında dediğiniz gibi parametre olarak gönderimler sorun değilde ancak delphi tarafında yapmış olduğum gibi karşılaştırma durumlarına göre sorgu metnini sağlıklı yapamadım daha doğrusu becereedim belkide procedure tarafında ki komut ve kullanım mantıklaını tam olarak bilemediğim içindir.

peki bu şekilde yapmamın ne sakıncası var onu anlayamadım sadece delphi tarafında sorgu oluşturup içeri gönderiyorum ve yapıyor öteki türlü karşılaştırma ve sorgu kurma işi içeride olacaktı değişen ne olur onu bilmiyorum ama sakıncasını söylerseniz sevinirim en azından bir bilgim olur.
Hepinize saygı ve Teşekkürlerimi sunarım
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

. ile çözdüysen problem büyük olasılıkla decimalseperator den kaynaklanıyor. Bence şöyle bir mahsurlu tarafı olabilir. Senin programı yazdığım makinanın bölgesel ayarlarından farklı bir makinada gene problem çıkartabilir.
Ben genelde cevapları genel yazmaya çalışıyorum ki, okuyanların kafalarında konular kalıplaşmasınlar. Yanlış hatırlamıyorsam FB kendi içinde tüm işlemlerdeki bölgesel ayar olarak ingilizlerinayarlarını kullanıyordu. SP lerin içinde özellikle tarihlerin string olarak işlem yapılmalarında bu yüzden sorunlar çıkabilir.

Yukarıda benim bahsettiğim Delphi tarafında değilde FB içinde exec edilecek string i oluşturmaktı, böylece işlemlerde . , gibi bir problem olmıycaktı, çünkü FB içinde convert işlemi yapılacaktı.

Ben yazdığım kodları mümkün olduğunca parametrik ve esnek yapmaya çalışıyorum, sebebi ise ileride eğer bir değişiklik yapmak zorunluluğu çıkarsa parametre değiştirerek sorunu değiştirebilirim. Yada çekirdek işlemleri modüler yaptığım için değişiklik yapılacaksa bir yerde yapılır ve buda tüme zaten yansır.

Ayrıca programcılık bir satır kodu yazmak sorun değil, o yazılan kodu mümkün olduğunca çok olasılık ile çalıştırıp verebileceği sonuçları hesaplayıp tasarımı ona göre yapmaktır.

Tavsiyem yazdığınız bir kodu önce kendi kafanızda çalıştırıp olasılıkları hesaplayın. Şöyle örneklendireyim

iki sayının toplamını alan bir şeye ihtiyacınız var hatta . Adet ve birim fiyatı çarpıp toplam alan bir şeye ihtiyacınız olsun. Bir table da kullanılacak olsun buda.

Kod: Tümünü seç

Procedure Toplam_Al;
begin
Toplam := Table1.FieldByName('ADET').AsFloat * Table1.FieldByName('BIRIM_FIYAT').AsFloat;
end;
bu size program içinde enaz 2-4 yerde gerekebilir. Ben bunu

Kod: Tümünü seç

function Toplam_Al(Adet, BrFiyat : Double) : Double;
begin
  result := Adet * BrFiyat;
end;
şeklinde genelleştiririm. Bunun bana sağlıyacağı şu, Toplam_Al procedure ünü her ihtiyaç duyulduğunda tekrar yazma gerekicek, bu sorun olmaz, ama ileride bu toplam a birde KDV eklemek gerekirse bunu her procedure eklemek gerekebilir. Bu eğer bu kadar kısa bir kod da sorul olmaz ama kod uzun ise 5 yeri düzeltip 6. yı atlıyabilirsiniz. Functionda bu olmaz çünküsadece bir yerde düzenlemeniz yeterli olucaktır.

Ya buda cevaptan çok makeleye benzedi :P İşallah okuyan arkadaşlara fikir verebilmişimdir. Amacımız sadece koddaki sorunları çözmek değil tecrübe ve birikimlerimizi paylaşmak

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
serbek_tr
Üye
Mesajlar: 362
Kayıt: 16 Ağu 2004 12:54

Mesaj gönderen serbek_tr »

Sağol üstad konuda haklısın başından işin kolayına kaçmaktansa zorluklara katlanıp sonradan sefasını sürmek lazım ki bende mümkün olduğunca bir şey yaparken yaptığım iş başka yerlerde işime yaramı diye düşünürüm ve ona göre planlarım örnek ben tüm bekleme mesajlarımı ve dialoglarımı kendim sadece bir procedure olarak ayrı bir usesta yazdım ve heryerde bunu kullanırım her programımda sadece gerekli düzende geken verileri giriyorum. buda bir örnekti ve yorumlarınız için teşekkür ederim.
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Cevapla