Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Verilen herhangi bir sayının örneğin Table1 de kayıtlı olan sayılardan en yakın,
küçük ve büyük değerini nasıl buluruz.
Sorumu Açıklama için örnekleme:
-------------------------------------------
Table1 deki sayı grubu şöyle olsun
1,00
1,25
1,50
1,65
-----> 1,75
1,85
2,10
....
Edit1 e girdiğim sayı diyelim ki 1,75
Sorumun cevabının 1,65 ile 1,85 olmasını istiyorum.
Bu iki sayıyı bulmak için nasıl bir yöntem uygulamam gerekiyor.
Yardımlarınız için teşekkür ederim.
küçük ve büyük değerini nasıl buluruz.
Sorumu Açıklama için örnekleme:
-------------------------------------------
Table1 deki sayı grubu şöyle olsun
1,00
1,25
1,50
1,65
-----> 1,75
1,85
2,10
....
Edit1 e girdiğim sayı diyelim ki 1,75
Sorumun cevabının 1,65 ile 1,85 olmasını istiyorum.
Bu iki sayıyı bulmak için nasıl bir yöntem uygulamam gerekiyor.
Yardımlarınız için teşekkür ederim.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
table1.first
for ii:=1 to table1.recorcount do
begin
if (edi1.text>table1alan) then showmessage('araduğınız sayı budur')// bu değilde bir sonraki kayde geç
table1.next;
end; gibi bir döngü işini görebilir
for ii:=1 to table1.recorcount do
begin
if (edi1.text>table1alan) then showmessage('araduğınız sayı budur')// bu değilde bir sonraki kayde geç
table1.next;
end; gibi bir döngü işini görebilir
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Kod: Tümünü seç
SELECT TOP 1 * FROM TABLON WHERE ALAN >
(
SELECT ALAN FROM TABLON WHERE ALAN=20
)
UNION
(
SELECT TOP 1 * FROM TABLON WHERE ALAN<
(
SELECT ALAN FROM TABLON WHERE ALAN=20
)
-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Bu problemin çözüm kodlarını SQL dilinde yazacak arkadaşlarıma müteşekkir kalacağım. Zira Paradox veri tabanından arzu ettiğim verileri alamadım.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
İki sayı arasında var ise var yok ise yok cevabını alırsın...
Kod: Tümünü seç
procedure TForm3.Button1Click(Sender: TObject);
begin
with Form1.Playlist do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM PLAYLIST');
SQL.Add('Where PROGRAMADI Like ' + QuotedStr('%' + Edit1.Text + '%'));
SQL.Add('And ID BETWEEN :I1 And :I2 Order By SIRANO');
ParamByName('I1').AsInteger := 20;
ParamByName('I2').AsInteger := 40;
Prepared := True;
Open;
if Not IsEmpty then // Kayıt Varsa
begin
Showmessage('VAR');
end
else
begin
Showmessage('YOK');
end;
end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Table1.FindNearest; birebir eşleşmesse en yakın değeri bulur belki işinin görebilir.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
1. yol
sql kodu ile yapamazsan bir dinamik dizi oluştur.
sql kodunu büyükten küçüge doğru sırala
aradığın dizi elemanını bul.
dizi elamanı kaçıncı sırada ise
bir önceki ve bir sonraki dizinin sıra numarasından istediğin rakamları elde edebilirsin.
kodaları test etmedim uygulayıp bakabilirsiniz.
2. yol ise daha basit
sqlini büyükten küçüğe doğru sıralarsın
aradığın numarayı qry döngüsünde bulursun;
sonraki numarayı bumak için qry bir ileri atarsın
önceki numarayı bulmak için qry iki geri atarsın
farklı farklı algoritmaları kullanabilirsin.
performans testini yapıp birine karar verebilirsin.
verilerin çok büyükse mergeshort diye bir algoritma olacaktı onu arastırabilirsin
sql kodu ile yapamazsan bir dinamik dizi oluştur.
sql kodunu büyükten küçüge doğru sırala
aradığın dizi elemanını bul.
dizi elamanı kaçıncı sırada ise
bir önceki ve bir sonraki dizinin sıra numarasından istediğin rakamları elde edebilirsin.
kodaları test etmedim uygulayıp bakabilirsiniz.
Kod: Tümünü seç
var
dizi:array of real;
i:Integer;
arananno,oncekino,sonrakino:Real;
begin
with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT ALANADIN FROM TABLOADIN ORDER BY ALANADIN ASC';
ExecSQL;
end;
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi[i]:=qry1.FieldByName('ALANADIN').Value;
Inc(i);
qry1.Next;
end;
arananno:=7.5;
for i := 0 to Length(dizi) do
begin
if (dizi[i]=arananno) then
begin
Exit;
end;
end;
oncekino:=dizi[i-1];
sonrakino:=dizi[i+1];
Self.Caption:='Küçük '+FloatToStr(oncekino) + ' aranan'+FloatToStr(arananno)+' Büyük '+FloatToStr(sonrakino);
sqlini büyükten küçüğe doğru sıralarsın
aradığın numarayı qry döngüsünde bulursun;
sonraki numarayı bumak için qry bir ileri atarsın
önceki numarayı bulmak için qry iki geri atarsın
farklı farklı algoritmaları kullanabilirsin.
performans testini yapıp birine karar verebilirsin.
verilerin çok büyükse mergeshort diye bir algoritma olacaktı onu arastırabilirsin
Kod: Tümünü seç
with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT ALANADIN FROM TABLOADIN ORDER BY ALANADIN ASC';
ExecSQL;
end;
while not (qry1.Eof) do
begin
if (qry1.fieldbyname('alanadı').value=arananno)
begin
exit;
end
qry1.Next;
end;
qry1.next;
sonrakino:=qry1.fieldbyname("alanadı").value;
qry1.prior;
qry1.prior;
oncekino:=qry1.fieldbyname("alanadı").value;
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Kod: Tümünü seç
SELECT MAX(ALAN_ADI) KUCUKLERIN_EN_BUYUGU FROM TABLO WHERE ALAN_ADI<:KONTROL_DEGERI -- verilen örneğe göre kontrol değerine 1,75 verilirse 1,65 i döndürür
Kod: Tümünü seç
SELECT MIN(ALAN_ADI) BUYUKLERIN_EN_KUCUGU FROM TABLO WHERE ALAN_ADI>:KONTROL_DEGERI -- verilen örneğe göre kontrol değerine 1,75 verilirse 1,85 i döndürür
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Sayın Dostum unicorn64 konuya biraz daha açıklık getirirminiz.
Sayın Dostum "kirve" ;
1. Paradox tablodaki verilerim string tipinde.
2. Örneğimde verdiğim 1,75 rakamı veritabanında kayıtlı değil.
Değerlendirmelerini buna göre yaparak daha ayrıntılı bilgi ve kod verirsen memnun olacağım.
Her ikinize çalışmalarınıza teşekkür ederim.
Sayın Dostum "kirve" ;
1. Paradox tablodaki verilerim string tipinde.
2. Örneğimde verdiğim 1,75 rakamı veritabanında kayıtlı değil.
Değerlendirmelerini buna göre yaparak daha ayrıntılı bilgi ve kod verirsen memnun olacağım.
Her ikinize çalışmalarınıza teşekkür ederim.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
ilk mesajda yazdığın duruma göre sana 2 sql sorgusu yazmışım, daha nasıl açıklık getireyim, sorguları çalıştırıp denedin mi?izmirlikemal yazdı:Sayın Dostum unicorn64 konuya biraz daha açıklık getirirminiz.
Sayın Dostum "kirve" ;
1. Paradox tablodaki verilerim string tipinde.
2. Örneğimde verdiğim 1,75 rakamı veritabanında kayıtlı değil.
Değerlendirmelerini buna göre yaparak daha ayrıntılı bilgi ve kod verirsen memnun olacağım.
Her ikinize çalışmalarınıza teşekkür ederim.
denedin de beklediğin sonucu mu alamadın, sorguyu mu anlamadın?
önce sen derdine bir açıklık getir,
sonra verilen örnekleri dene, anlamaya çalış,
anlayamadığın yeri de ben şöyle yaptım (kodu buraya yazarak) ama olmadı, şu hatayı aldım, şu kısmını yapamadım vs... şeklinde açıkla
gerisi kolay,
bazen yükselmek için önce dibi görmek gerekir...
forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...
yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Sayın unicorn64 öncelikle derdime bir açıklık getireyim:
-------------------------------------------------------------------
Ben iklimlendirme ile ilgili bir çalışmanın içinde uzun süredir bulunuyorum.
ilk mesajımda örnek olarak verdiğim string şeklindeki değerlerin veritabanına kayıtlı olduğunu düşünmeniz için örnekleme yapmıştım.
Şimdi Veritabanı kayıtları ile ilgili daha detaylı bilgi vermek istiyorum.
veritabanı tablosu olarak: "psikrometrikdegerlerVT.db" şeklinde paradox da Table oluşturdum.
bu tablonun içinde yaklaşık 15 adet "alan adı" var.
bu alan adlarından birkaç tanesi : kurutermometre, yastermometre, izafirutubet , ....
Kuru termometre sıcaklıklarına ve izafi nem değerlerine bağlı olarak yaş termometre sıcaklıkları değişmektedir.
Alan adları kurutermometre IzafiNem YasTermometre
10 20 21,4
10 30 22,1
10 40 22,6
20 20 23,2
20 30 24,7
20 40 25,0
vs.
örneğin benim Hazırladığım formdaki Edit1 hücresine gireceğim 14°C Kuru Termometre ve Edit2 hücresine gireceğim 43 izafi nem değeri ni
kullanarak Yaş termometre sıcaklığını hesaplamak istiyorum.
Şimdi sizin yukarda 1. yol olarak vermiş olduğunuz kodları kendime adapte etmeye çalışarak aşağıdaki şekilde düzenledim:
procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
arananno,oncekino,sonrakino:real;
begin
with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC';
ExecSQL;
end;
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=qry1.FieldByName('KuruTermometre').value;
Inc(i);
qry1.Next;
end;
arananno:=7.5;
for i := 0 to Length(dizi) do
begin
if (dizi=arananno) then
begin
exit
end;
end;
oncekino:=dizi[i-1];
sonrakino:=dizi[i+1];
Self.Caption:='Küçük '+floattostr(oncekino) + ' Aranan : '+floattostr(arananno)+' Büyük : '+floattostr(sonrakino);
end;
---------------------
Kodları yukardaki gibi düzenlediğimde " Qry1: Cannot perform this operation on a closed dataset" şeklinde bir mesaj
alıyorum.
ExecSQL yerine Open; yazdığımda ise;
küçük ve Büyük değerlerinin : 3,607392...87E-313 gibi ilgisiz alakasız bir değer vermekde. Takdirleri size bırakıyorum. Yanlışımın nerede olduğu
konusunda aydınlatırsanız sevinirim.
-------------------------------------------------------------------
Ben iklimlendirme ile ilgili bir çalışmanın içinde uzun süredir bulunuyorum.
ilk mesajımda örnek olarak verdiğim string şeklindeki değerlerin veritabanına kayıtlı olduğunu düşünmeniz için örnekleme yapmıştım.
Şimdi Veritabanı kayıtları ile ilgili daha detaylı bilgi vermek istiyorum.
veritabanı tablosu olarak: "psikrometrikdegerlerVT.db" şeklinde paradox da Table oluşturdum.
bu tablonun içinde yaklaşık 15 adet "alan adı" var.
bu alan adlarından birkaç tanesi : kurutermometre, yastermometre, izafirutubet , ....
Kuru termometre sıcaklıklarına ve izafi nem değerlerine bağlı olarak yaş termometre sıcaklıkları değişmektedir.
Alan adları kurutermometre IzafiNem YasTermometre
10 20 21,4
10 30 22,1
10 40 22,6
20 20 23,2
20 30 24,7
20 40 25,0
vs.
örneğin benim Hazırladığım formdaki Edit1 hücresine gireceğim 14°C Kuru Termometre ve Edit2 hücresine gireceğim 43 izafi nem değeri ni
kullanarak Yaş termometre sıcaklığını hesaplamak istiyorum.
Şimdi sizin yukarda 1. yol olarak vermiş olduğunuz kodları kendime adapte etmeye çalışarak aşağıdaki şekilde düzenledim:
procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
arananno,oncekino,sonrakino:real;
begin
with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC';
ExecSQL;
end;
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=qry1.FieldByName('KuruTermometre').value;
Inc(i);
qry1.Next;
end;
arananno:=7.5;
for i := 0 to Length(dizi) do
begin
if (dizi=arananno) then
begin
exit
end;
end;
oncekino:=dizi[i-1];
sonrakino:=dizi[i+1];
Self.Caption:='Küçük '+floattostr(oncekino) + ' Aranan : '+floattostr(arananno)+' Büyük : '+floattostr(sonrakino);
end;
---------------------
Kodları yukardaki gibi düzenlediğimde " Qry1: Cannot perform this operation on a closed dataset" şeklinde bir mesaj
alıyorum.
ExecSQL yerine Open; yazdığımda ise;
küçük ve Büyük değerlerinin : 3,607392...87E-313 gibi ilgisiz alakasız bir değer vermekde. Takdirleri size bırakıyorum. Yanlışımın nerede olduğu
konusunda aydınlatırsanız sevinirim.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
bu kısım dikkatimi çekti oradaki close; kaldırıp birde SQL.text yerine sql.add kullanıp denermisin.with qry1 do
begin
Close;
SQL.Clear;
SQL.Text:='SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC';
ExecSQL;
end;
Kod: Tümünü seç
begin
SQL.Clear;
SQL.Add('SELECT KuruTermometre, IzafiNem FROM PsikrometrikDegerlerVT ORDER BY KuruTermometre ASC');
OPEN;
end;[/quote]
En son Lord_Ares tarafından 25 Haz 2015 01:20 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Ben problemi aşağıdaki şekilde çözdüm.
Ancak bu soruyla ilişkili olarak başka bir soruyu sormam gerekiyor. Bu konuda da yardımlarınız bekliyorum.
2. sorumu çözümümü yazdıkdan sonra soracağım.
ÇÖZÜM:
---------
procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
ArananKayit,KucukKayit,BuyukKayit:real;
BEGIN
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=StrTofloat(Qry1KuruTermometre.text);
Inc(i);
qry1.Next;
end;
ArananKayit:=strtofloat(edit1.text);
for i := 0 to Length(dizi) do
begin
if dizi[i-1]<ArananKayit then begin KucukKayit:=dizi[i-1];BuyukKayit:=dizi; end;
if dizi=ArananKayit then exit;
end;
Edit2.Text:=Floattostr(KucukKayit);
Edit3.Text:=Floattostr(BuyukKayit);
END;
-----------------------------------------
Yukarda çözümünü verdiğim problemde KuruTermometre sıcaklıkları birer birer (1,2,3,4,..45,46,47,...) şeklinde artıyor.
İkinci sorum şu:
-------------------
KuruTermometre sıcaklıkları onar onar(0,10,20,30,40,50,...,90,100) şeklinde arttığını düşünürsem o zaman yanıtı doğru vermiyor.
Bu konuda yardım edecek arkadaşlara teşekkür ederim.
Ancak bu soruyla ilişkili olarak başka bir soruyu sormam gerekiyor. Bu konuda da yardımlarınız bekliyorum.
2. sorumu çözümümü yazdıkdan sonra soracağım.
ÇÖZÜM:
---------
procedure TForm1.Button1Click(Sender: TObject);
var
dizi:array of real;
i:Integer;
ArananKayit,KucukKayit,BuyukKayit:real;
BEGIN
SetLength(dizi,qry1.RecordCount);
i:=0;
qry1.First;
while not (qry1.Eof) do
begin
dizi:=StrTofloat(Qry1KuruTermometre.text);
Inc(i);
qry1.Next;
end;
ArananKayit:=strtofloat(edit1.text);
for i := 0 to Length(dizi) do
begin
if dizi[i-1]<ArananKayit then begin KucukKayit:=dizi[i-1];BuyukKayit:=dizi; end;
if dizi=ArananKayit then exit;
end;
Edit2.Text:=Floattostr(KucukKayit);
Edit3.Text:=Floattostr(BuyukKayit);
END;
-----------------------------------------
Yukarda çözümünü verdiğim problemde KuruTermometre sıcaklıkları birer birer (1,2,3,4,..45,46,47,...) şeklinde artıyor.
İkinci sorum şu:
-------------------
KuruTermometre sıcaklıkları onar onar(0,10,20,30,40,50,...,90,100) şeklinde arttığını düşünürsem o zaman yanıtı doğru vermiyor.
Bu konuda yardım edecek arkadaşlara teşekkür ederim.
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
artışlarda kullandığın inc(i) varya onun için şöyle birşey söyliyebilirim. İnc(i) derseniz i değişkeni varsayılan olarak birer birer artar. fakat inc(i,10) derseniz i nin değeri 10 ar 10 ar artar
-
- Üye
- Mesajlar: 155
- Kayıt: 10 Oca 2014 01:08
- Konum: izmir/Buca
Re: Edit e girilen sayıya en yakın küçük ve büyük değerleri bulmak
Deneyeceğim dostum Lord_Ares. Sonra yanıtını yazarım.