tablodaki get_tar alanı boş olanları listele
boş ise; ver_tar alanı bugunden küçük mü değilmi
küçükse gün farkını bul cezayı hesapla ve yazdır
değilse değişiklik yapma
bu işlemi tablo sonuna kadar hepsine uygula
[quote][color=green]
procedure TForm1.Button48Click(Sender: TObject);
var
a,ceza,ytl:real;
kar:integer;
dur:boolean;
begin
query2.sql.clear;
query2.sql.add('select * from hareket where get_tar is null');
query2.open;
if not (query2.Eof) then dur:=false
else
dur:=true;
while dur=false do
begin
kar:=comparedate
table3GET_TAR.AsDateTime,TABLE3VER_TAR.AsDateTime);
if kar=1 then
begin
a:=daysbetween(date,TABLE3VER_TAR.AsDateTime);
ceza:=a * strtoint(form4.Table1CEZA.AsString);
ytl:=ceza/1000;
if ceza < 1000 then
TABLE3CEZA.AsString:=floattostr(ceza)+'Ykr'
else
TABLE3CEZA.AsString:=floattostr(ytl)+'Ytl';
if query2.Eof then dur:=false
else
query2.next;
end
else
begin
query2.Next;
end;
end;
end;[/color][/quote]
bu ama sonsuz döngüye giriyor program kitleniyor beceremedim yardım edebilirseniz sevinirim kolay gelsin
En son AliErdem tarafından 28 May 2006 07:41 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
procedure TForm1.Button48Click(Sender: TObject);
var
a,ceza,ytl:real;
kar:integer;
dur:boolean;
begin
query2.sql.clear;
query2.sql.add('select * from hareket where get_tar is null');
query2.open;
Query2.First;
while Query2.Eof=False do
begin
kar:=comparedate(table3GET_TAR.AsDateTime,TABLE3VER_TAR.AsDateTime);
if kar=1 then
begin
a:=daysbetween(date,TABLE3VER_TAR.AsDateTime);
ceza:=a * strtoint(form4.Table1CEZA.AsString);
ytl:=ceza/1000;
if ceza < 1000 then TABLE3CEZA.AsString:=floattostr(ceza)+'Ykr'
else TABLE3CEZA.AsString:=floattostr(ytl)+'Ytl';
end;
query2.Next;
end;
end;
While do kullanmadan önce şu iskeleti hazırlayıp sonra içini dolduruyorum, sorun çıkmıyor.
kod böyle oldu ulu coder hata falan verdi değiştirdim biraz şu anda kod çalışıyor hatta F7 ile tek tek izledim istediklerimi yapıyor herhalde heralde diyorum işleyişte bi hata yok ama database e kayıt yapmıyor ceza alanlarını doldurması lazımdı....
[color=green][/color]procedure TForm1.Button48Click(Sender: TObject);
var
a,ceza,ytl:real;
kar:integer;
dur:boolean;
begin
query2.sql.clear;
query2.sql.add('select * from hareket where get_tar is null');
query2.open;
Query2.First;
while Query2.Eof=False do
begin
kar:=comparedate(date,QUERY2VER_TAR.AsDateTime);
if kar=1 then
begin
a:=daysbetween(date,QUERY2VER_TAR.AsDateTime);
ceza:=a * strtoint(form4.Table1CEZA.AsString);
ytl:=ceza/1000;
if ceza < 1000 then
begin
query2.Edit;
Query2.FieldByName('CEZA').AsString:=floattostr(ceza)+'Ykr';
QUERY2.Post;
end
else
begin
QUERY2.Edit;
Query2.FieldByName('CEZA').AsString:=floattostr(ytl)+'Ytl';
query2.Post;
end;
end;
query2.Next;
end;
end;
En son AliErdem tarafından 28 May 2006 06:25 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
procedure TForm1.Button48Click(Sender: TObject);
var
a,ceza,ytl:real;
kar:integer;
dur:boolean;
begin
TABLE3.Filtered:=false;
table3.Filter:='GET_TAR is null';
table3.Filtered:=true;
while table3.Eof=False do
begin
kar:=comparedate(date,TABLE3VER_TAR.AsDateTime);
if kar=1 then
begin
a:=daysbetween(date,TABLE3VER_TAR.AsDateTime);
ceza:=a * strtoint(form4.Table1CEZA.AsString);
ytl:=ceza/1000;
if ceza < 1000 then
begin
TABLE3.Edit;
TABLE3.FieldByName('CEZA').AsString:=floattostr(ceza)+'Ykr';
TABLE3.Post;
end
else
begin
TABLE3.Edit;
TABLE3.FieldByName('CEZA').AsString:=floattostr(ytl)+'Ytl';
TABLE3.Post;
end;
end;
table3.Next;
end;
end;
kolay gelsin herkese
En son AliErdem tarafından 28 May 2006 06:42 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
'Abi eğer tablonda No gibi otomatik artan bir alan varsa, While-Do'nun başında Query'nin No'sunu Table'da arat. Query'de hiç işlem yapma. Onu sadece Table'da işlem yapılacak olan kayıtın numarasını bulak için kullanmış olalım. Aslında GetTar is null'u Table'da nasıl kullanacaığımızı bilsek daha kolay olacak da...' diyordum, cevabını değiştirmişsin.
Şimdi anladığım kadarıyla Query ile Table birbirine bağlıymış.
O zaman Query'yi kullanmana hiç gerek yok.
While Query1.EOF=False yerine
While Table1.EOF=False yazarsan,
Query1.Next demene gerek kalmaz, ve Query'de ilerleme olmayacağı için daha hızlı çalışır.
Tabi bir de tarihle ilgili yerlerde de Query yerine table kullanman lazım.
procedure TForm1.Button48Click(Sender: TObject);
var
a,ceza,ytl:real;
kar:integer;
dur:boolean;
begin
TABLE3.Filtered:=false;
table3.Filter:='GET_TAR is null';
table3.Filtered:=true;
while table3.Eof=False do
begin
kar:=comparedate(date,TABLE3VER_TAR.AsDateTime);
if kar=1 then
begin
a:=daysbetween(date,TABLE3VER_TAR.AsDateTime);
ceza:=a * strtoint(form4.Table1CEZA.AsString);
ytl:=ceza/1000;
if ceza < 1000 then
begin
TABLE3.Edit;
TABLE3.FieldByName('CEZA').AsString:=floattostr(ceza)+'Ykr';
TABLE3.Post;
end
else
begin
TABLE3.Edit;
TABLE3.FieldByName('CEZA').AsString:=floattostr(ytl)+'Ytl';
TABLE3.Post;
end;
end;
table3.Next;
end;
end;
abi hata yokmuş gibi görünüyor, büyük ihtimalle de öyle.
Yalnız bir kaç tavsiyem olacak.
Table'ı filtreledikten sonra Table1.Refresh ve Table1.First komutlarını kullan.
strtoint(form4.Table1CEZA.AsString); burda da strtofloat kullan bence.
Eğer table3.Filter:='GET_TAR is null'; şeklinde bir kullanım varsa sorun çıkarmaması lazım.