sorgulama yaparken querynin yenilenememesi...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

sorgulama yaparken querynin yenilenememesi...

Mesaj gönderen ayseonat »

Merhaba arkadaşlar

formlar arası bi sorunum var. 1. formdan sayısal alanlı bi meslek seçiyorum. 2. formda veri tabanından o meslekleri seçip gösteriyorum. daha sonra 1.forma dönüp sözel alanlı bi meslek seçip 2.formda göster deyince göstermiyor. daha önce sayısal olarak filtrelediğim için sözel alanları göstermiyor. fakat yaptığım sorguyu tekrar tümünü listelemesi için kod yazıyorum fakat yapmıyor. hep sayısal alanları gösteriyor. 2. formun açılışında query inin active ni false => true yapıyorum. daha sonra tüm kayıtları getir diyorum ama getirmiyor. yine gidip sadece sayısal alanları getiriyor. nasıl düzeltebilirim bu sorunu?
(veritabanım access ve ADO yla bağlanıyorum. )

herkese ii çalışmalar
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Yazdığınız kod ta bir eksiklik olabilir.
SQL kodunuzu yazarsanız sorun daha da anlaşılır.

iyi akşamlar...
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

Merhaba
goruntule=> query,
T_PUAN08=> meslekler tablom
procedure nin başında bunu kullanıyorum. kayıtların tamamını getirsin die. ondan sonra

Kod: Tümünü seç

 veri.goruntule.Active:=False;
 veri.goruntule.active:=true;

 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add('select * from T_PUAN08');
 veri.goruntule.Open;
Bunu yazdıktan sonra ; dışardan girilen değerin(soz08.text,say08.text) 3 eksiğinden 100 e kadar olan alanları getircek.
a değişkeninde meslekler var.
ypuanturu=> sözel, sayısal alanlar
Alan=> dışardan girilen değerlere karşılaştırılıp sıralama yaptırılıyor.

Kod: Tümünü seç

if a<>'' then a:=' where '+a+' order by Alan '
else a:=' order by Alan ';
str:='select * from T_PUAN08 '+a; 
 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add(str);
 veri.goruntule.Open;

p:=''; r:='';
akil1:=0;akil2:=0;  
veri.goruntule.First;
 while not veri.goruntule.Eof do
 begin
 sayi08:=(veri.goruntuleAlan.AsFloat);
   if adim2.soz08.Text<>'0' then
   begin
      if veri.goruntuleypuanturu.AsString='söz' then
      begin
       soz08alt:=(strtofloat(adim2.soz08.Text)-3);
       soz08ust:=100;
       if ((sayi08)>(soz08alt)) and ((sayi08)<(soz08ust)) then
       begin
       if akil1=0 then
         begin
            if p='' then r:='' else r:=' or ';
            p:=p + r +' (((Alan>'+ floattostr(soz08alt)+') and (Alan<'+floattostr(soz08ust)+')) and (ypuanturu='+'''söz'''+'))';
            akil1:=1;
         end;
       end;
    end;
   end;

  if adim2.say08.Text<>'0' then
   begin
     if veri.goruntuleypuanturu.AsString='say' then
     begin
       say08alt:=(strtofloat(adim2.say08.Text)-3);
       say08ust:=100;
       if ((sayi08)>(say08alt)) and ((sayi08)<(say08ust)) then
       begin
       if akil2=0 then
         begin
           if p='' then r:='' else r:=' or ';
           p:=p + r +' ((Alan>'+ floattostr(say08alt)+' and Alan<'+floattostr(say08ust)+') and (ypuanturu='+'''say'''+'))';
           akil2:=1;
         end;
       end;
    end;
 veri.goruntule.Next;
 end;

veri.goruntule.Filter:=p;
veri.goruntule.Filtered:=true;
label100.Caption:=inttostr(veri.goruntule.RecordCount)+' kayıt bulunmuştur!';

ii çalışmalar
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Kod: Tümünü seç

 veri.goruntule.Active:=False;
 veri.goruntule.active:=true;

 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add('select * from T_PUAN08');
 veri.goruntule.Open;


Bunu yazdıktan sonra ; dışardan girilen değerin(soz08.text,say08.text) 3 eksiğinden 100 e kadar olan alanları getircek.
a değişkeninde meslekler var.
ypuanturu=> sözel, sayısal alanlar
Alan=> dışardan girilen değerlere karşılaştırılıp sıralama yaptırılıyor.
Kod:

if a<>'' then a:=' where '+a+' order by Alan '
else a:=' order by Alan ';
str:='select * from T_PUAN08 '+a;
 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add(str);
 veri.goruntule.Open; 
Burada bunlara gerek yok;
veri.goruntule.Active:=False; veri.goruntule.active:=true;
zaten bir altında Close yapmışsınız.

Kod: Tümünü seç

 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add('select * from T_PUAN08');
 veri.goruntule.Open;
Yukardaki kodun altında,

bu aşağıdaki kod var ise; yukarıdaki kodu dikkate almayacaktır.Çünkü aynı Query;aşağıdaki kod ta 'a' değeri nedir?+ kodta değer de atanmıyor.

Kod: Tümünü seç

if a<>'' then a:=' where '+a+' order by Alan '
else a:=' order by Alan ';
str:='select * from T_PUAN08 '+a; 
En güzeli 'Open' lerin altına

Kod: Tümünü seç

ShowMessage(veri.goruntule.Text)
yazıp SQL kodunuzu görmeniz,size faydası olacaktır

iyi günler..
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

merhaba
a ya meslekleri atadım. o kod çok fazla uzundu hemde karışıktı. o yüzden yazmadım. ama doğru atadığından eminim. showmessage larla kontrol ettirdim.
formların açılışlarında onshow olaylarında da

Kod: Tümünü seç

 str:='select * from T_PUAN08';
 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add(str);
 veri.goruntule.Open;
 showmessage(inttostr(veri.goruntule.recordcount));
kodunu yazdım. hatta bulduğu kayıt sayısını göstersin dedim. onu da on show olayında yaptım. yaklaşık 4000 kaydım var. ilk sayısal dan meslek seçtiğim zaman form2 nin on show olayındaki kodda 4000 olarak gösteriyor. ama form1 e geri dönüp sözelden bir alan seçtiğim zaman bana sayısal mesleklerin kayıt sayısını gösteriyor. tüm kayıtların sayısını göstermiyor. yani query hiç bi şekilde kendisini yenilemiyor. nie böyle yaptığını anlamadım bende :cry:
bana bu konuda yardımcı olursanız sevinirim.
ii çalışmalar
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Kod: Tümünü seç

 form1 e geri dönüp sözelden bir alan seçtiğim zaman bana sayısal mesleklerin kayıt sayısını gösteriyor. tüm kayıtların sayısını göstermiyor. yani query hiç bi şekilde kendisini yenilemiyor. nie böyle yaptığını anlamadım

Kod: Tümünü seç

 str:='select * from T_PUAN08';
 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add(str);
 veri.goruntule.Open;
 showmessage(inttostr(veri.goruntule.recordcount)); 
recordcount olarak değilde şöyle bir denermisin,bir değişkene alarak,daha sağlıklı olur.

Kod: Tümünü seç

 str:='select count(*) as ToplamKayit from T_PUAN08';
 veri.goruntule.Close;
 veri.goruntule.SQL.Clear;
 veri.goruntule.SQL.Add(str);
 veri.goruntule.Open;
 Degisken:=veri.goruntule.FieldByName('ToplamKayit').AsInteger; 
hem bir daha toplam kayıt nedir diye,uğraşmassın..

iyi günler
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Burda öenmli bir nokatya deyinmek istiyorum..Query le bulduğunuz
kayır sayısına pek fazla güvenmeyin derim.Ben çok sorun yaşıyordum aynı kodu bende kullandım

Kod: Tümünü seç

query1.recordcount
bu kod çok sağlıklı çalışan bir kod değil.kayıt sayısını SQL le

Kod: Tümünü seç

select count(*) as toplam from tablo
ile yada eğer bir sayısal alanınız var sa anahtar alan gibi * yerine onu yazarak ta buldum ve şu ana kadar bir sorun yaşamadım.

Birde yazdığınız SQl lerin Sql.text ten bakarak buraya yazabilirmisiniz acaba karışık olduğu için biraz zor oluyor.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

Merhaba

ilk olarak sayısal meslek olan hemşireliği seçtim. hemşireliğin kodu 23. ve bana gelen sql.txt aşağıdaki gibi.

select * from T_PUAN08 where (s12='23') order by Alan

daha sonra "Alan" dediğim bölümde ekrandan girilen değerin 3 eksiğiyle 100 arasında olacak. ve bana aşağıdaki gibi bi filtreleme yapıyor.

((Alan>2 and Alan<100) and (ypuanturu='say'))

buraya kadar olan kısımda bi sorun yok.

ama daha sonra form1 e geri döndüm. arkeolojiyi seçtim. kodu 12. ve bana getiridği listeleme aşağıdaki gibi.

select * from T_PUAN08 where (s12='12') order by Alan

daha sonra bunu yukardaki gibi filtrelemesi lazım. ama bi türlü yapmıyor. yani o döngüye bile girmiyor. çünkü query de sadece sayısal alanlar var. arkeoloji sözel olduğu için direk esgeçiyor. ve filtreleme yapmıyor. :cry: normalde filtreleme için yapması gereken kod:
((Alan>2 and Alan<100) and (ypuanturu='söz'))

bu şekilde olmalı. ama bana böyle bi kod göndermiyor. öyle olunca değer boş dönüyor. ve Arkeoloji alanlarını göstermiyor.

ii çalışmalar
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

SQL de bu alanlar farkediyor;

Mesala Alanınız;
Alan=VarChar olarak tanımlı
iki değer girdiğiniz
Alan=1;
Alan=0001;

bu değerleri Integer olarak değerlendirirseniz.bu iki değer birbirine Eşittir;
String olarak değerlendirirseniz,Her ikisi de birbirine eşit olmaz.
Çünkü

Kod: Tümünü seç

Alan=1;
Alan=0001;
Bence sizin hatalarınız bu gibi sorunlardan ibaret.SQL de

Kod: Tümünü seç

 ' Tırnaklara+TipDönüşümlerine+,Büyük/Küçük harf uyumuna  
dikkat etmeniz gerekli.Çünkü doğru olarak umduğunuz sonuç yanlış çıkabiliyor..

iyi günler
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

Merhaba

benim programdaki hata sizin dediğiniz nedenlerden kaynaklanmıyor bence. çünkü Alan die adlandırdığım bölüm float. karşılaştırmalarda hata yapmıyor. bunu biçok kez denedim. bide zaten ilk aramayı yapıyor. ondan sonraki aramayı yapmıyor. o yüzden de sorun bence başka bişeyden kaynaklanıyor:(

ii çalışmalar.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

ayseonat yazdı:Merhaba


daha sonra bunu yukardaki gibi filtrelemesi lazım. ama bi türlü yapmıyor. yani o döngüye bile girmiyor. çünkü query de sadece sayısal alanlar var. arkeoloji sözel olduğu için direk esgeçiyor.

ii çalışmalar
yukarıda ki mesaj,benim bir önceki düşüncemi kanıtlıyor :wink:

iyi günler...
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Bence sizin kodlarda bir sorun yok gibi query bileşenini değiştirseniz.anladığım kadarı ile yukarıdaki kodlar tek bir proceduredemi yoksa faklı procedurelerdemi.eğer aynı procedure de ise ilk önce sorgu çekiyorsunuz sonra false true yapıyorsunuz burasını anlamadım,yada 2. defa filtrelemek istedğiniz zaman form2 yi kapatıyormusunuz form2 ile query nin arasında ilişki nedir nasıl bağlanıyor.işin içinden çıkamadım,biraz olayı toparlasanız adım adım delphi çalışır gibi.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

Merhaba

=>İlk olarak form1 de checklistboxım var. ve checkboxta mesleklerim listelenmiş olarak geliyor. burdan meslek seçip ileri deyince form2 açılıyor.
=>form2 de; gözlem butonumla dbrgidim var.
gözlem butonuna tıkladığım zaman yukarıdaki kodlar çalışıyorlar. ve hepsi aynı proceduredeler. 2.defa filterelerken form2 yi kapatmıyorum. hepsini gözlem butonunun içinde yapıyorum.
=>query i veri adlı bi datamodule ün üzerinde tutuyorum. bütün sorgularım tablolarım orda duruyor. dbgridde datamodülün üzerindeki query e bağlı.

bide mesela ben önce sözel sonra sayısal alandan bi meslek seçsemde önce sözeli çalıştırıyor sonra sayısalı çalıştırmıyor. yani sorun 2. kez çalıştırırken oluyor. ikinci kez sseçim yapmazsa sorun yok. ama yaparsa sorun o zaman ortaya çıkıyor.

ii çalışmalar
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba;

Kod: Tümünü seç

bide mesela ben önce sözel sonra sayısal alandan bi meslek seçsemde önce sözeli çalıştırıyor sonra sayısalı çalıştırmıyor. yani sorun 2. kez çalıştırırken oluyor. ikinci kez sseçim yapmazsa sorun yok. ama yaparsa sorun o zaman ortaya çıkıyor. 
Asıl sorun buradan kaynaklanıyor herhalde.biraz uzun kodlarda BreakPoint koyarsan daha da kolay olur.+ konu bir kaç parça olduğu için, kodu yukarıdan aşağıya doğru parçalara bölüpte çalıştırman daha da iyi olur kanaatim.

iyi günler...
ayseonat
Üye
Mesajlar: 58
Kayıt: 17 Ara 2004 12:18
Konum: Konya

Mesaj gönderen ayseonat »

merhaba arkadaşlar

sorunumu çözdüm. butona iki kere tıkladığımda programın çalıştığını gördüm. öyle olunca bende butona tıklama olayındaki kodları 2 kez çalıştırdım. 2 li bi döngü yaptım ve çalıştı :D :D :D

yardımcı olmaya çalışan herkese çok tşk ederim
hepinize ii tatiller :D
kolay gelsin
Cevapla