param by name

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

param by name

Mesaj gönderen yusuf simsek »

S.A.

tüm forma kolay gelsin. İyi çalışmalar...

Formda sıkça karşılaştığım bir kod.. parambyname
(belki Mustafa hocam biraz kızacak niye aramadın diye ama :oops: )

Bu kod ile query e değer gönderiyoruz tamam. Kullanımı da zaten hemen hemen formun tamamında var.Ama ben çalışma mantığını anlayamadım :oops:
BU konuda biraz açıklama yapabilirseniz çok memnun olurum...

Bir de query içine yazdığımız kodu program içinde tekrar yazmadan nasıl kullanabilirim? basit noktalar ama bilmeden bişey yapılamıyor.

Tüm forma teşekkür ederim.
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
mepc
Üye
Mesajlar: 191
Kayıt: 26 Eyl 2003 11:39
Konum: Ankara

Mesaj gönderen mepc »

query içine yazdığın kodu string bir değişkende tutarak yeniden yazmak yerine

Kod: Tümünü seç

query1.sql.text:=stringdeğişken;
şeklinde yapabilirsin veya veritabanında bir alanda tutabilirsin. Daha bir çok yol var. Seçim sizin.
Bilgi paylaşıldıkça güzeldir.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
eğer sql i değiştirmezsen aynı sql i kullanırsın. forma koyduğun zaman object ispector den sql i yazarsın. kodla da parametrelere (eğer kullandıysan )gönderme yapıp kullanırsın.
Niçin parametre kullanırız?
bunu bi örnekle açıklamaya çalışıyım.
Arama formu hazırladığını düşün.
sql şöle bişi olsun

Kod: Tümünü seç

 select * from tablo where adi like '%ahmet%'
adı ahmet olan kayıtları getirdik ama kullanıcı aradığı kişinin adını kendisi yazmak isteyecektir. bu durumda kod şöle bi hal alacaktır. bunu her seferinde değiştirmemiz gerekecektir.

Kod: Tümünü seç

 query1.sql.clear; 
query1.sql.add('select * from tablo where adi like '''%'''+edit1.text+'''%');
query1.open;
bu sql i her çağırışında önce sql prepare edilecek sonra çalıştırılacaktır.
kayıt çok olmadığı zaman belki bu süre pek önemsenmeyecek ama kayıt sayısı arttıkça bu beklemeler kullanıcı tarafından pek hoş karşılanmaz.
bunun yerine sql i şu şekide değiştirsek

Kod: Tümünü seç

select * from tablo where adi like :ADI
kullanıcı editteki bilgiyi değiştirdiği zaman sizin yapmanız gereken parametreyi değiştirmek.
Özet olarak Parametreleri kullanarak sabit sqllere dinamik (tabiri caizse) bir yapıya kavuşturmuş oluyoruz. Böylelikle sql tekrar tekrar prepare edilmiyor.
Umarım kafanı karıştırmamışımdır. sürçü lisan ettikse affola
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
mepc
Üye
Mesajlar: 191
Kayıt: 26 Eyl 2003 11:39
Konum: Ankara

Mesaj gönderen mepc »

Üstte yazdığım kod sorunuzun ikinci kısmı için geçerli bunu yazmayı unutmuşum.

Kolay gelsin
Bilgi paylaşıldıkça güzeldir.
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

arkadaşlar ilginize çok teşekkür ederim.

Aslangeri kardeşim anladığım şu: Query içindeki kodu sürekli clear edip aynı kodları yazmak sorguyu yavaşlatıyor..
Bunun yerine program içinden değer göndermek performansı artırıyor...Doğru mu anladım acaba?

Bahsettigin olay için ben şöyle bir yapı kullanıyorum.

Kod: Tümünü seç

query.close;
query[1]:=where adi like'''+edit1.text+'%''';
query.open;
tabi bunu her zaman kullanmıyordum..query içindeki kodlar karışık olduğu zaman kullanıyordum..Ama bundan sonra sürekli olarak kullanacağım...Çok teşekkür ederim...

Peki PARAMBYNAME kod satırı da yukarıdaki kod ile aynı işimi yapıyor acaba :?:

MEPC kardeşim anladığım kadarıyla da bu olay performansı düşürüyor...Çünki query de yazdığım kodu silip tekrar yazmak gibi bir gafletle sql kodlarını çalıştırıyorum.Benim için önemli olan kod yazmamak değil. Performansı artırmak istiyorum.(Bunun için fazladan 100 satır daha yazabilirim :D )

Arkadaşlar ilginize çok teşekkür ederim...
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Yukarda yazdığın kodda sql de değişiklik yapar ve oda performans için uygun değil.
edit1.text sql i tasarım anında oluştur. where kullanmak için parametreleri kullan.
şöle bişi oluşturabilirsin.

Kod: Tümünü seç

select * from adlar
where (adi like :ADI) or (:ADI='')
böylelikle adı parametresine değer göndermezsen tüm kayıtları getirir. Eğer değer gönderirsen aradığın kayıtları getirir. like daki '%' için kullanıcıya edite değer girdiği yerde bir comboboxtan başlayan , biten ve hepsi seçeneklerinden birini seçtirirsin. ona göre parametrenin başına veya sonuna '%' eklersin.
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

ASLANGERİ KardeşimÇok teşekkür ederim.. Allah Razı olsun. Biraz başını ağrıttım..(her zamanki gibi :lol: )

Yanlız soru soruyu getiriyo gibi oluyo..(okulda herşeyden biraz biraz verilince hiç birşey öğrenemeden mezun olduk işte)

Kod: Tümünü seç

with dm.sevrak_kayit do
begin
close;
sql.Clear;
sql.Add('select * from sirket_evrak');
sql.Add('where evrak_no='''+edit1.Text+'''');
open;
end;
benim program içinde kullandığım genel yapı bu...

senin önerdiğin şekilde program içinde hangi yapıda kod yazmam gerekiyor... (sen zaten yukarda belirttin ama ben edit1.text göremeyince nasıl kullanacağımı bir türlü kestiremedim :oops: )
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ilave olarak olarak şunuda belirtmek isterim ki ;
ParamByName özelliği SQL cümlesinde kullanılan parametrelerin isimleri bilindiği sürece kullanılabilir.
Fakat kimi zaman programcılar duruma göre dinamik SQL sorguları oluşturmak isteyebilir ve kimi zaman bu durumda parametrelerin isimlerini kullanmak kod kargaşasına sebebiyet verebilir.
Böyle hallerde Params[0] özeliği ile ile parametre dizisine indis numarasıyla erişmek daha akılcı olur.
Uzun lafın kısası, Şöyle bir cümlede,

Kod: Tümünü seç

select *from adres where adi=:adi
ParamByName('adi').Asstring:=.........
ile
Params[0].Asstring:=...... aynı işi yapacaktır.
senin sorgularında kullancağın yapıya gelirsek;

Kod: Tümünü seç

with dm.sevrak_kayit do 
begin 
close; 
sql.Clear; 
sql.Add('select * from sirket_evrak'); 
sql.Add('where evrak_no=:eno'); 
ParamByName('eno').Asstring:=edit1.text;
open; 
end; 
Burada vereceğin parametre isimlerinin hiç bir önemi yok.
Başarılar.
Volkan KAMADAN
www.polisoft.com.tr
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

VKAMADAN kardeşim verdiğin bilgiden dolayı çok teşekkür ederim.
ASLANGERİ kardeşim sana da teşekkür ederim.

Şimdi çıkardığım sonuç:Query nin içine kodları yazmak ve programın içinden PARAMBYNAME veya PARAMS la değerleri göndermek...Bu şekilde hem performansı artırmak hem de sürekli aynı kodları yazmamak.(kod karmaşasını önlemek)

Bu gün epey kazançlı olarak güne başlıyorum... Allah'ım günün bereketini eksik etmesin...

Tüm Formdan ve sizlerden ALLAH RAZI OLSUN...

Hepimize kolay gelsin...

İyi çalışmalar.
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
yalnız bir nokta gözden kaçmasın.

Kod: Tümünü seç

with dm.sevrak_kayit do
begin
close;
sql.Clear;
sql.Add('select * from sirket_evrak');
sql.Add('where evrak_no=:eno');
ParamByName('eno').Asstring:=edit1.text;
open;
end;
şeklinde yapıldığı zaman sqlde değişiklik oluyor. sql i tasarım anında object inspectorden yazarsan yukardaki

Kod: Tümünü seç

sql.Clear;
sql.Add('select * from sirket_evrak');
sql.Add('where evrak_no=:eno');
satırlarına gerek kalmayacak sadece

Kod: Tümünü seç

ParamByName('eno').Asstring:=edit1.text;
satırı işini görecektir.
İyi çalışmalar kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

ASLANGERİkardeşim tekrar teşekkürler...

sorunu şimdi tam olarak çözdük...

ikinci sorumun cevabı ise çok basitmiş...

Kod: Tümünü seç

query.close;
query.execsql;
query.open;
bu şekilde query içine yazlıan kodlar çalıştırılıp sonuç alınıyor...
(1. veya 2. seminerde execsql in yaptığı işi anlatıyordu ama gözden kaçırmışım :oops: )

Tüm forma ve bu ortamı oluşturanlara tekrar çok teşekkür ederim..ALLAH RAZI olsun..

ALLAH www delphiturkiye.com/forumu VİRÜSLER den korusun
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Cevapla