Quary SQL insert into'da alanlara değişken koymak istiyorum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Quary SQL insert into'da alanlara değişken koymak istiyorum

Mesaj gönderen Berdem »

Merhaba Arkadaşlar..
Yazdığım projede iki olasılık var tarih ve isim varsa update yoksa insert et.İnsert edileceği zaman alanları değiştirmek istiyorum.Yaptığım bir çok denemeler de hatalar alıyorum.Sql de insert into alanlar(Field) değişebilirmi.Bunun pratik yolunu gösterirseniz çok sevinirim.. :lol:

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
var
sqlstrin,sqlstrin2,asl,az:string;
etop:integer;
begin
asl:=PageControl1.ActivePage.Name;
sqlstrin:='insert into eczane (TARIH,ILAC_ADI,'+asl+',AK_TOP_DEG)';
sqlstrin2:='values(:TARIH,:ILAC_ADI,:'+asl+',:AK_TOP_DEG)';
az:=sqlstrin+sqlstrin2;
etop:=yeni.Query4S1.AsInteger+yeni.Query4S2.AsInteger+yeni.Query4S3.AsInteger
+yeni.Query4S5.AsInteger+yeni.Query4S6.AsInteger+yeni.Query4S7.AsInteger
+yeni.Query4S8.AsInteger+yeni.Query4S9.AsInteger+yeni.Query4S10.AsInteger
+yeni.Query4S11.AsInteger+yeni.Query4S12.AsInteger+yeni.Query4S13.AsInteger;
with yeni.Query3 do
begin
Close;
Prepare;
SQL.Clear;
SQL.Add('select * from eczane');
SQL.Add('where TARIH=:asi');
SQL.Add('and ILAC_ADI=:com');
ParamByName('asi').AsDate:=DateTimePicker1.Date;
ParamByName('com').AsString:=DBComboBox1.Text;
Open;
end;
if yeni.Query3.IsEmpty<>True then
begin
with yeni.Query4 do
begin
Close;
SQL.Clear;
SQL.Add('update eczane set TARIH=:asi,');
SQL.Add('ILAC_ADI=:com,');
SQL.Add(':Pan=:Sayi,');
SQL.Add('AK_TOP_DEG=:etoplam,');
SQL.Add('where TARIH=:asi');
SQL.Add('and ILAC_ADI=:com');
Prepare;
ParamByName('etoplam').AsInteger:=12;
ParamByName('Pan').AsString:=PageControl1.ActivePage.Name;
ParamByName('Sayi').AsInteger:=StrToInt(DBEdit1.Text);
ParamByName('asi').AsDate:=DateTimePicker1.Date;
ParamByName('com').AsString:=DBComboBox1.Text;
ExecSQL;
end;
end
else
with yeni.Query4 do
begin
Close;
SQL.Clear;
SQL.Add(az);
Prepare;
ParamByName('AK_TOP_DEG').AsInteger:=StrToInt(DBEdit1.Text);
ParamByName(asl).AsInteger:=StrToInt(DBEdit1.Text);
ParamByName('TARIH').AsDate:=DateTimePicker1.Date;
ParamByName('ILAC_ADI').AsString:=DBComboBox1.Text;
ExecSQL;
end;
end;
end.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Aslında eğer yanlış anlamadıysam istediğinizin daha pratik bir yolu yok. Yani eğer insert edilecekse bir query ile insert için gerekli sql kodunu oluşturmalısınız. Yok eğer update edilecekse de gerekli update kodunu oluşturmalısınız.

Genel mantık doğru olmakla birlikte daha derli toplu bir kod olabilir . Sanıyorum karşılaştığınız hataları tek tek çözersek problem kalmaz. İlk gözüme çarpan Query'nin Prepare metodunu Open veya ExeceSQL satırından heme önce yazmalısınız. Mevcut Prepare kullanımları hatalı.

bunun dışında etop isimli bir değişken tanımlanıp buna bir de atama yapılmasına rağmen bu değişken daha sonra hiç kullanılmayıp tanımlandığı gödnerdiğiniz kodda görünmeyen etoplam diye bir değişken kullanılmış.
Bir de asl isimli değişkene atatığınınız Pagecontrol'un tabsheetname 'leri ile aynı alan isimlerinizin olması şart.

Kolay gelsin...
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

İlginize çok teşekkür ediyorum.
Prepare kodunu gerçekten hatalı yazdım buraya geçirirken hatalı geçirdiğimi farketmedim kod hatalı sonuç verince bir de böyle deneyim demiştim.etop adlı değişken Update de ParamByName('etoplam').AsInteger:=12; 12 nin yerine geliyor.Asl degerlerim doğru isimlerini veritabanındaki alanlara göre verdim bu tanımlamalarda başka sql komutları ile çalışıyor. Buna ragmen insert bölümünde alanları tanımıyor ve ya hata veriyor..Veri tabanı olarak Database kullanıyorum onunla alakalı olabilir mi? Paradoxu deneyim mi?
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Alanları tanımıyor diyorsanız o zaman muhtemelen alan isimlerinde bir hata yapılıyor olabilir. Oluşmasını planladığınız insert into kodunu SQL Explorer'dan çalıştırmayı deneyin. Eğer orada hata yoksa Delphi tarafında kodu hatalı oluşturuyorsunuz demektir. Database derken Dbase mi demek istediniz emin degilim ama günümüzde insert into'yu calistirmacak bir sistem oldugunu düşünmüyorum.

Bence oluşturmayı düşündüğünüz kodu sade bir şekilde SQL Explorer'dan çalıştırmaya çalışır ve orada karşılaştığınız hata mesajlarını kodunuz ile birlikte gönderirseniz oradaki problemi çözdükten sonra Delphi'den uygulamak daha kolay olur. Zira bu şekilde yapılan bir yazım hatasını farketmek daha zor olabilir.

Tabi hata mesajını ve denediğiniz kodu aynen bildirmeniz olayı anlayabilmek açısından önemli.

Kolay gelsin...
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Fahrettin abinin bahsettiği yol en uygun yol. Ben de ufak bir ilave yapmak istiyorum. Eğer çalıştırdığım SQL cümlesinde bir problem var ise, Open ve ExecSQL'den önce aşağıdaki komutu vererek SQL cülemi kontrol ederim.

ShowMessage(Query1.SQL.Text);

Kolay gelsin.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Anlamadığım şu neden illaki SQL cunlesını sen yazmaya calısıyorsun kı ?bir query koy locate ile aradığın kaydı arattır eğer bulursan yani True donerse cursor oraya konumludur zaten direk QueryX.Edit; dersin, yok eğer False gelirsede Insert dersin, Query zaten senın yapmaya calıstığın bu ıslerı kendısı yapar.
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 !!!
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Mesaj gönderen Berdem »

Merhaba,
Ben delphi öğrenmeye takribi 8 ay önce başladım , sabırlı bir şekilde bu konuda bilgi birikimini çalışıyorum. :shock: İnsan bu konu ile bir iki kitap okuyunca kendisine önüne proje koyuyor sonra bunun içinde debelenip duruyorsunuz.İşte işin hassas noktası burda başlıyor. :) Siz bu kodlarla uğraştıkca kitap karıştırıyorsunuz , internette aratıyorsunuz :? ve bir bilenden bilmiyenden fikir alıyorsunuz bunlar size öğrenme yolculugunda karşılaşacagınız bir bilgi birikimi oluyor. :wink:
Freeman kardeşim sayende cursoru , locate öğrendim , onshow öğrendim.Çok teşekkür ediyorum.
Bu kod la takribi 1 haftadan beri uğraşıyorum sonunda bugün degerli fikirleriniz ve yardımlarınızla çözebildim.S1,S2, ... tanımlamalarımı veritabanında yalnış degerlendirmişim. :oops: AsInteger yerine AsFloat yazınca kodlarım tıkır tıkır çalışmaya başladı. :idea:
Siteyi hazırlayan , bu konuda bilgi birikimlerini bizlerle paylaşan ve ülkemizi bilişim sektöründe iyi yerlere getirmeye çalışan dostlara binlerce kez teşekkür ederim.
En son Berdem tarafından 27 Eyl 2003 01:56 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Bak kardeşim, bu sitenin bitek kuralı var demek bir şey hatta birşeyler öğrenmişsin, bunun bir vebali vardır. Mutlaka bir şeyler öğrenip, en az 3 kişiye daha yardım etmek zorundasın artık :lol:
Allah razı olsun gururlandım, 1 kelimede olsa birisine bir şey öğretebildim. ben vebalimi biraz ödeyebildim demek sayende
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ı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Konuyla alakalı değil ama biraz yoğurt yiyişle alakalı olarak, Naçizene bir önerim olacak :) Ukalalık olarak algılanmasın lütfen. Yeni kodlamaya başladıysanız ileride binlerce satır kod içinde boğulduğunuzda yazım şeklinizin aslında pek kullanılabilir bir yazım şekli olmadığını göreceksiniz.

Aslında konu ile ilgili detaylı bilgileri internette aratbilirsiniz ama birkaç tavsiye.

Block programlamada block açtığınızda kapatırken açılış ve kapanışları aynı hizada yazın, ve block içindekileri en az bir (ben iki kullanıyorum) boşluk vererek içeriden yazın.

Örnek

Kod: Tümünü seç


Procedure BlockOrnegi(intGelenDeger : Integer) ;
Var
  intDeger1, intDeger2 : Integer ;
Begin
  intDeger1 := Abs(intGelenDeger)  * 10 ;
  intDeğer2 := intGelenDeger * 10 ;
  If intDeger1 > intDeger2 Then
  Begin
    // Birşeyler yapılıyor
    .
    .
    . 
  End
  Else
  Begin
    If intGelenDeger < 0 Then
    Begin
      // Birşeyler yapılıyor
      .
      .
      . 
    End
    Else
    Begin
      // Birşeyler yapılıyor
      .
      .
      . 
    End
  End 

End ;

Bu şekilde kodlarsan okunaklı ve rahat olur, senin yazdığın gibi olursa,

Kod: Tümünü seç

Procedure BlockOrnegi(intGelenDeger : Integer) ;
Var
intDeger1, intDeger2 : Integer ;
Begin
intDeger1 := Abs(intGelenDeger)  * 10 ;
intDeğer2 := intGelenDeger * 10 ;
If intDeger1 > intDeger2 Then
Begin
// Birşeyler yapılıyor
.
.
. 
End
Else
Begin
If intGelenDeger < 0 Then
Begin
// Birşeyler yapılıyor
.
.
. 
End
Else
Begin
// Birşeyler yapılıyor
.
.
. 
End
End 

End ;
hem okunaklı olmuyor hem de yazımı güçleştiriyor, hata bulmak çok zor olur. Şimdilik takip edebiliyorsundur ama yazdığın kodun üzerinden 5 sene geçtiğinde tekrar aynı kodu açıp bir takım düzeltmeler yapman gerekse çok zorlanırsın.

Bu sebeple syntaxa dikkat et ve bir takım standardlar uygula, değişken isimlerinde, obje isimlerinde procedure founction isimlerinde gibi...

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

bu alıskanlıgı aslında her programcının yada adayın kazanması gerek diye dusunuyorum
yabancılar bu konuda cok nizami kod yazıyorlar hayran kalıyorum adamlara
hatta kodun basına (eger bir komponentse yada library) nedir ne ise yarar versiyon no tarih ad soyad gibi bilumum ibarelerinde eklenmesi gerek
ben cogu zaman usengeclikten yapamıyorum ama bir alıskanlık kazanmak icin tekrar etmekte fayda vaar
nede olsa hayat bir alıskanlıktır
nasıl alısırsak oyle yasarız....
Saygılar
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

bu konuyla alakalı olarak bir makalemiz var zaten. Borland Kodlama Standartları : http://www.delphiturkiye.com/standart.htm

Kolay gelsin.
Cevapla