arama sonucunu hatırlamasın

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

arama sonucunu hatırlamasın

Mesaj gönderen guduknecmi »

selamlar
firebird veritabanı ve IBdatabase,IBdataset nesnelerini kullanuyorum.
Parametreye göre arama yaptırıyorum.

Kod: Tümünü seç

SELECT * FROM EVRAK
where PROTOKOL=:PROTOKOL or ADI=:ADI or SOYADI=:SOYADI
order by ADI
Program içinde ise

Kod: Tümünü seç

begin
   dm.IBDataSet1.Close;
dm.IBDataSet1.UnPrepare;
begin
case RadioGroup1.ItemIndex of
0 : dm.IBDataSet1.ParamByName('PROTOKOL').AsString:= Edit1.Text;
1 : dm.IBDataSet1.ParamByName('ADI').AsString := Edit1.Text;
2 : dm.IBDataSet1.ParamByName('SOYADI').AsString := Edit1.Text;
end;
dm.IBDataSet1.Prepare;
dm.IBDataSet1.Open;
frmsonuc.Show;

end;
    end;
kodlarını kullanıyorum.
Sorunum ise mesela soyadına bakarak arama yaptırdıktan sonra protokol veya adı alanlarında arama yaparsam soyadına baktığım sorgulamanın sonuçlarını da gösteriyor.
şu şekilde de denedim sonuç değişmedi.

Kod: Tümünü seç

begin
case RadioGroup1.ItemIndex of
0 :
begin
dm.IBDataSet1.Close;
dm.IBDataSet1.UnPrepare;
dm.IBDataSet1.ParamByName('PROTOKOL').AsString:= Edit1.Text;
dm.IBDataSet1.Prepare;
dm.IBDataSet1.Open;
frmsonuc.Show;
end;
1 :
begin
dm.IBDataSet1.Close;
dm.IBDataSet1.UnPrepare;
dm.IBDataSet1.ParamByName('ADI').AsString := Edit1.Text;
dm.IBDataSet1.Prepare;
dm.IBDataSet1.Open;
frmsonuc.Show;
end;
2 :
begin
dm.IBDataSet1.Close;
dm.IBDataSet1.UnPrepare;
dm.IBDataSet1.ParamByName('SOYADI').AsString := Edit1.Text;
dm.IBDataSet1.Prepare;
dm.IBDataSet1.Open;
frmsonuc.Show;
end;
end;
bu hatırlama olayının nedenini merak ediyorum.Kullandığım sql cümlesindeki "or" dan kaynaklanabilir mi?Yoksa DBGrid ile mi alakalı?Ya da dataset yerine query mi kullanmalıyım?

Çözüm olarak acaba bu hatırlamayı nasıl önlerim.
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Mehaba

Öncelikle parametre kullanımı ile ilgili bir kaç şey söylemek istiyorum. Sql ifadesinde parametre kullanılmasının en önemli sebebi, DataBase (DB) işlemlerinin daha hızlı yapılabilmesidir. DB bir sql ifadesini işlemeden önce ifadeyi çözümlemesi, anlaması (parse) gerekir. Parse işlemi için geçen süreyi azaltırsak daha hızlı DB işlemleri yapılabilir. Bunun için "Prepare" metodu kullanılır ve parametreli kullanımda bir defa yapılması yeterlidir. Zaten zaman kazancınıda, parse işleminin tekrar tekrar yapılmaması sağlar. Senin kullandığın gibi her sorgulamada "dm.IBDataSet1.UnPrepare" ve "dm.IBDataSet1.Prepare" kodlarını kullanmak parametreli kullanıma hiç bir avantaj sağlamaz. Sql ifadesi değişmediği sürece "Prepare" metodunu tekrar kullanmak gerekmez. Prepare metodunu program açılırken yada ilgili form create edilirken bir kere yapman yeterli olucaktır.

Aşağıdaki kod işini görücektir.

Kod: Tümünü seç

  if RadioGroup1.ItemIndex=-1 then exit;
  dm.IBDataSet1.Close;
  dm.IBDataSet1.Params[0].AsString := '';
  dm.IBDataSet1.Params[1].AsString := '';
  dm.IBDataSet1.Params[2].AsString := '';
  dm.IBDataSet1.Params[RadioGroup1.ItemIndex].AsString := Edit1.Text;
  dm.IBDataSet1.Open;
  frmsonuc.Show;
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

Emin değilim ama kullandığın 3 parametreden birisine değer atayıp diğerlerine değer atamamak sonucu bazı durumlarda etkiler. Bundan dolayı sorguyu yapacağın sırada sql ifadesini oluşturman daha iyi olur.

Kod: Tümünü seç

SqlString:string='SELECT * FROM EVRAK where %s=''%s'' order by ADI'
FieldString:Array[0..2] of string=('PROTOKOL','ADI','SOYADI');
..
..
..
if RadioGroup1.ItemIndex=-1 then exit;
dm.IBDataSet1.Close;
dm.IBDataSet1.Sql.Text:=format(SqlString,[FieldString[RadioGroup1.ItemIndex],Edit1.Text]);
dm.IBDataSet1.Open;
frmsonuc.Show;
Kullanıcı avatarı
selimr
Üye
Mesajlar: 556
Kayıt: 16 Eki 2003 02:07

Mesaj gönderen selimr »

parametre kullanmayıp where nin olduğu satırı değiştirerekde yapabilirsin.


yani
seçim 1 ise

sql.string[1]:='where protokol=edit1.text'

seçim 2 ise
sql.string[1]:='where adi=edit1.text'


gibi
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

selamlar
ilgilendiğiniz için teşekkür ederim.
name arkadaşım, ilk verdiğin kod kısmen çalıştı. kısmen diyorum çünkü adı ve soyadı alanlarında arama yaparken artık hatırlamıyor.Yalnız protokol alanına geçince program hata verip kapanıyor.(integer, string değişimine ayak uyduramıyor herhalde)Velhasıl bu haliyle kullanamam.
ikinci verdiğin kodu da datasete uyarlayamadım.

selimr arkadaşım ne demek istediğini anladım ama nasıl yapacağımı anlamadım.
İlgilenen arkadaşlara tekrar teşekkür ederim.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

bu tarz bişi işte :)

Kod: Tümünü seç

with Query do
  begin
  Close;
  Sql.Clear;
  Sql.Add('SELECT * FROM EVRAK where 1=1');
  if edit1.text <> '' then 
    Sql.Add('and ad = "'+edit1.text+'"');
  if edit2.text <> '' then 
    Sql.Add('and ad2 = "'+edit2.text+'"');
  if edit3.text <> '' then 
    Sql.Add('and ad3 =  "'+edit3.text+'"');

 case listbox1... of //sıralama öllçütü olarak
   2:  Sql.Add('order by ADI2');
   3:  Sql.Add('order by ADI3');
   else:  Sql.Add('order by ADI');
  end;
end;
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

selam
Mege arkadaşım,
kodunu yanlış anlamış olabilirim. Ama anladığım şekliyle 3 tane edit nesnesinden hangileri dolu ise onu aratıyorsun.Benim programımda tek edit nesnesi var radiogroup da hangisi seçiliyse o alanda arama yapıyor(protokol, adı, soyadı).Yanlış anlamış isem sorumlusu hala bitiremediğim media player projemdir! Beynim sulandı herhalde...

sorunumu tekrarlamak istiyorum.Mesela protokol ile arama yapıldığında gelen sonuçlar,tekrar protokol ile arama yapılırsa hatırlanmıyor.Ama ikinci arama adı veya soyadı alanlarında yapılırsa önceki sonuçları hatırlıyor.
Yani aynı alanda arama yapıldığında arama hatırlanmıyor, diğer alanlarda aramaya geçilince hatırlanıyor.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Mege arkadasimizin yazdigi kod tam olarak isinizi gorecektir... Yok illa da 3 farkli edit degil de tek edit ve bir radio button kullanayim diyorsaniz o zaman

Kod: Tümünü seç

if edit1.text <> '' then
....
if edit2.text <> '' then 
........
  if edit3.text <> '' then 
 
kontrolleriu yerine

Kod: Tümünü seç

case RadioGroup1.ItemIndex of 
seklinde bir kontorl koyup.....

Kod: Tümünü seç

 Sql.Add('and ad = "'+edit1.text+'"'); 
....
  Sql.Add('and ad2 = "'+edit2.text+'"');
....
   Sql.Add('and ad3 =  "'+edit3.text+'"'); 
kodlarindaki edit1,2,3 lerin hepsini de Edit1 yaptiniz mi tamamdir.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

selamlar
vaktinizi aldığım için özür dilerim.
verdiğiniz kodları programımda çalıştırmayı beceremedim.Kodları c/p yapıyorum olmuyor.Uyarlama yapmaya çalışıyorum yine olmuyor.hatta 3 edit nesnesi yerleştirdim bir de öyle denedim.olmadı.

Olmamasının nedeni query yerine IbDataset kullandığımdan olabilir.

IBDatasetin sgl cümlesini ve program içindeki arama kodunu Ibdatasete göre yazana minnettar kalacağım.(tek edit veya 3 edit farketmez)
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

3 edit ile kullandığım program içindeki kod

Kod: Tümünü seç

with dm.Ibdataset1 do
  begin
  Close;
    selectsql.Clear;
    selectSql.Add('SELECT * FROM  EVRAK WHERE 1=1');// Programda arama tuşuna basınca bu satır hata veriyor
        if edit1.text <> '' then
    selectSql.Add('and PROTOKOL = "'+edit1.text+'"');
        if edit2.text <> '' then
    selectSql.Add('and ADI = "'+edit2.text+'"');
        if edit3.text <> '' then
    selectSql.Add('and SOYADI =  "'+edit3.text+'"');
Open;
end; 
IBDatasetin selectsql cümlesi

Kod: Tümünü seç

SELECT * FROM EVRAK WHERE 1=1   
Bu kod ile arama yaptırırken program hata verip kapanıyor.
Yanlışımı düzeltebilirmisiniz...
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

birazda ben kralcı olayım :)
Mesaj atarken dikkat edilmesi gereken hususlar

- Sorun belirten mesajlarınızda, gerekli olabilecek detayları olabildiğince açık bir şekilde yazmanız yine sorununuza çabuk çözüm bulunması açısından önemlidir. Bir hata mesajı alıyorsanız, hata mesajını ve varsa numarasını yazın veya veritabanı ile ilgili bir soru soruyorsanız kullandığınız veritabanını ve erişim componentlerini yazın.
bir çin atasözünde yazdı:debug modda iken hata adını metnini ve kodunuda gönderki hızlı cevap alasan
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Bilmiyorum sorunu hallettinmi ama
Program içinde ise

Kod: Tümünü seç

 
begin 
   dm.IBDataSet1.Close; 
dm.IBDataSet1.UnPrepare; 
begin 
[code]case RadioGroup1.ItemIndex of 
0 : dm.IBDataSet1.ParamByName('PROTOKOL').AsString:= Edit1.Text;
1 : dm.IBDataSet1.ParamByName('ADI').AsString := Edit1.Text;
2 : dm.IBDataSet1.ParamByName('SOYADI').AsString := Edit1.Text;
end;
dm.IBDataSet1.Prepare;
dm.IBDataSet1.Open;
frmsonuc.Show;

end;
end; [/code]
şeklinde ilk gönderdiğin kodda

Kod: Tümünü seç

case RadioGroup1.ItemIndex of 
satırından önce

Kod: Tümünü seç

dm.IBDataSet1.ParamByName('PROTOKOL').AsString:=''; 
dm.IBDataSet1.ParamByName('ADI').AsString := ''; 
dm.IBDataSet1.ParamByName('SOYADI').AsString := ''; 
denedinmi.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

selamlar
aslangeri arkadaşım önerdiğin yöntemi denedim.

Kod: Tümünü seç

dm.IBDataSet1.ParamByName('PROTOKOL').AsString:=''; 
satırı var iken, protokolden sonra başka birşey aratınca program hata verip kapanıyordu.Bu satırı sildim diğer iki satır kaldı.Artık hata yok.Hatırlama konusu da bu haliyle işimi görür.Yardımın için teşekkür ederim.

İlgilenen tüm arkadaşlara teşekkür eder, başarı ve mutluluklar dilerim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
parametrenin tipi ile ilgili bi şey olabilir.
bir çin atasözünde demiş ki:
debug modda iken hata adını metnini ve kodunuda gönderki hızlı cevap alasan

Kod: Tümünü seç

....asstring:=''; 
//yerine
....asinteger:=0;
belki sorunu çözmende yardımcı olur.
yalnız protokol numarası "0" olan varsa sql den istediğinz sonucu alamıyabilirsin.
Kolay Gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

Mesaj gönderen guduknecmi »

sorunum aslangeri nin önerdiği kodlar ile tamamen giderildi.
.AsInteger:=''; olarak denemiştim ama '' yerine 0 yazmak aklıma gelmemişti.Tekrar Teşekkürler...
Not:meşhur atasözünü size bir daha yazdırmamaya çalışacağım.(hataları tam yazarak)
Cevapla