3 farklı fiyat seçeneğim var. ürün eklerken YTL, $, yada € olduğunu seçiyoruz. sepete ürün ekledikçe labelda da toplam fiyat yazıyor. eklenilen ürünler aynı zamanda dbgridde görünüyor. mesela kullanıcı herhangi bir ürünün özelliklerini değiştirmek istediği zaman gridden değiştirebiliyor. kullanıcı fiyatı yanlış yazmışsa onu da grid üzerinden değiştirecek. fiyat değiştiği zaman label daki fiyatın da değişmesini istiyorum. ben aşağıdaki kodu yazdım. fakat olmadı. bu sorunumu nasıl çözebilirim?
program Tmmenu.kontrol()
var
i:integer;
sstr:string;
toplam,toplameuro,toplamusd:double;
begin
toplameuro:=0;
toplamusd:=0;
toplam:=0;
// o anda seçilen alışverişle ilgili kayıtları getir
sstr:='select * from STKTEKLIF where ID='+QuotedStr(kod.Text);
veri.stkk.close;
veri.stkk.sql.clear;
veri.stkk.sql.add(sstr);
veri.stkk.open;
while not veri.stkk.Eof do
begin
if veri.stkkPARABIRIMI.AsString='YTL' then
toplam:=toplam+(strtofloat(veri.stkkADET.AsString)*strtofloat(veri.stkkSTKFIYTUTAR.AsString));
if veri.stkkPARABIRIMI.AsString='$' then
toplamusd:=toplamusd+(strtofloat(veri.stkkADET.AsString)*strtofloat(veri.stkkSTKFIYTUTAR.AsString));
if veri.stkkPARABIRIMI.AsString='€' then
toplameuro:=toplameuro+(strtofloat(veri.stkkADET.AsString)*strtofloat(veri.stkkSTKFIYTUTAR.AsString));
veri.stkk.Next;
end;
label11.Caption:='';
if toplam<>0 then Label11.Caption:=FloatToStr(toplam)+' YTL ';
if toplamusd<>0 then Label11.Caption:=Label11.Caption+FloatToStr(toplamusd)+' $ ';
if toplameuro<>0 then Label11.Caption:=Label11.Caption+FloatToStr(toplameuro)+' € ';
end;
delphi 7 ve sql server kullanıyorum. sql server a Ado ile bağlanıyorum
Veritabanında stkkSTKFIYTUTAR ve stkkADET alanlarını string olarak mı tutuyorsun ?
Open'dan sonra First ü de koymanda fayda var ne olur ne olmaz.. Bir de her işlemden sonra böyle bir döngü yapmak bana garip geldi..İşlem (insert) sonucunda değişkenleri arttırmak daha iyi. Update' te de eski değeri çıkarıp yenisini eklersin.
İşlem (insert) sonucunda değişkenleri arttırmak daha iyi.
demişsiniz. ben orda insert yapmıyorum. sadece kayıt değişikliği var.
dbgridde herhangi bi değişiklik olduğu zaman benim yukarıda yazdığım kod çalışmalı. yani dbgrid üzerinde herhangi bi kaydın değiştirildiğini bi şekilde anlamam lazım. bunu dbgridin özelliklerinden hangisiyle yapabilirim? yada dbgridin bağlı olduğu datasourcelamı yapıcam? bu konuda yardımcı olabilirmisiniz?
mecburen bu şekilde uzun uzadıya yapmak zorundaydım. çünkü YTL, $, € fiyatları ayrı ayrı istendi benden.
sizin dediğiniz gibi field ın onvalidate olayında yaptım. fakat programı çalıştırınca dbgrid sanki readonly=true olmuş gibi kayıtta değişikllik yapmamı engelledi.
afterpost olayında ise kayıt değiştirebiliyorum fakat floating point hatasını veriyor. normalde bu kod çalışıyodu. fakat afterpostuna yukarıdaki kodu ekleyince hata verdi.
başka bildiğiniz bi yöntem varmı?
Çekilmiş olan kaydı tekrar çekmek veya controller üzerinden alan değerlerine ulaşmak bence iyi yöntemler değil. aliemrei nin dediği gibi afterpost konuyu çözecek gibi.. Bu şekilde yaptığın kodu gönderirsen nerede hata olduğunu bulabiliriz.
procedure Tveri.stkkAfterPost(DataSet: TDataSet);
var
i:integer;
sstr:string;
toplam,toplameuro,toplamusd:double;
begin
mmenu.Label11.Caption:='';
toplameuro:=0;
toplamusd:=0;
toplam:=0;
// o anda seçilen alışverişle ilgili kayıtları getir
sstr:='select * from STKTEKLIF where ID='+QuotedStr(mmenu.kod.Text);
veri.stkk.close;
veri.stkk.sql.clear;
veri.stkk.sql.add(sstr);
veri.stkk.open;
veri.stkk.first;
while not veri.stkk.Eof do
begin
if veri.stkkPARABIRIMI.AsString='YTL' then
toplam:=toplam+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
if veri.stkkPARABIRIMI.AsString='$' then
toplamusd:=toplamusd+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
if veri.stkkPARABIRIMI.AsString='€' then
toplameuro:=toplameuro+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
veri.stkk.Next;
end;
if toplam<>0 then mmenu.Label11.Caption:=floattostr(toplam)+' YTL ';
if toplamusd<>0 then mmenu.Label11.Caption:=mmenu.Label11.Caption+floattostr(toplamusd)+' $ ';
if toplameuro<>0 then mmenu.Label11.Caption:=mmenu.Label11.Caption+floattostr(toplameuro)+' € ';
end;
kod bu şekilde fakat bana floatpoint hatası veriyor
// o anda seçilen alışverişle ilgili kayıtları getir
sstr:='select * from STKTEKLIF where ID='+QuotedStr(mmenu.kod.Text);
veri.stkk.close;
veri.stkk.sql.clear;
veri.stkk.sql.add(sstr);
veri.stkk.open;
Bu kodu sadece bir kod.Text için bir defa çalışacak bir yere koyup dene. Her Afterpostta çalıştırma. Adedide Float yapmanda fayda var. Ayrıca her strtofloat gibi çevirim işlemleri için try except bloğu kullan.
dediğiniz gibi ordaki kodu bi kere çalıştırdım. bu sefer hiç bir hata vermedi. griddeki alanı değiştirebiliyorum. ama labeldaki değer yine sabit kalıyor. değişmiyor.
Şöyle bir yol deneyebilirsin;
Bir tane Procedure oluştur ve bu kodu o procedure'in içine yerleştir.
Daha sonraki etapta procedure'in ismi tablonun after post ve bu tabloya bağlı olan datasource ondatachange'ine ve dbgrid'in onchange'ine de yaz..
Bu şekilde sorunun çözülmesi gerekir diye düşünüyorum..
Umarım yardımcı olabilmişimdir...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
procedure Tveri.stkkDataSource3DataChange(DataSet: TDataSet);
var
i:integer;
sstr:string;
toplam,toplameuro,toplamusd:double;
begin
mmenu.Label11.Caption:='';
toplameuro:=0;
toplamusd:=0;
toplam:=0;
// o anda seçilen alışverişle ilgili kayıtları getir
sstr:='select * from STKTEKLIF where ID='+QuotedStr(mmenu.kod.Text);
veri.stkk.close;
veri.stkk.sql.clear;
veri.stkk.sql.add(sstr);
veri.stkk.open;
veri.stkk.first;
while not veri.stkk.Eof do
begin
if veri.stkkPARABIRIMI.AsString='YTL' then
toplam:=toplam+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
if veri.stkkPARABIRIMI.AsString='$' then
toplamusd:=toplamusd+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
if veri.stkkPARABIRIMI.AsString='€' then
toplameuro:=toplameuro+(strtofloat(veri.stkkADET.AsString)*(veri.stkkSTKFIYTUTAR.asfloat));
veri.stkk.Next;
end;
if toplam<>0 then mmenu.Label11.Caption:=floattostr(toplam)+' YTL ';
if toplamusd<>0 then mmenu.Label11.Caption:=mmenu.Label11.Caption+floattostr(toplamusd)+' $ ';
if toplameuro<>0 then mmenu.Label11.Caption:=mmenu.Label11.Caption+floattostr(toplameuro)+' € ';
end;
kodlarını yazdığım halde bana aşağıdaki debugger hatasını veriyor.
teklifraporu.exe faulted with message: 'access violation at 0x7c8feddc: write of address 0x00030bf4'. Process stoped. use step or run to continue
En son a_o tarafından 10 Kas 2005 07:21 tarihinde düzenlendi, toplamda 1 kere düzenlendi.