dbgridde yapılan değişikliğin labela yansıması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

dbgridde yapılan değişikliğin labela yansıması

Mesaj gönderen a_o »

merhaba arkadaşlar

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?

Kod: Tümünü seç

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

herkese ii çalışmalr
kolay gelsin
Kullanıcı avatarı
mnt
Üye
Mesajlar: 57
Kayıt: 30 Eki 2005 12:58
Konum: Kocaeli

Mesaj gönderen mnt »

Veritabanında stkkSTKFIYTUTAR ve stkkADET alanlarını string olarak mı tutuyorsun ? :shock:
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.
Mustafa
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

Mesaj gönderen a_o »

mnt sanırım benim sorumu yanlış anladınız.
İş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?

ii çalışmalar
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

slm.

Mesaj gönderen aliemrei »

Field ın onValidate olyına
Label1.Caption := [FieldAdi].asString; yazarsan

yada Ado nesnesinin AfterPost u na
Label1.Caption := [FieldAdi].asString; yazarsan

işin olur gibi geldi

Kolay Gelsin

Bide ek olarak sen kulağın baya bi tersinden tutmuşsun...

Field ın onValidate olyında yada Ado nesnesinin AfterPost tunda o procedurü çağırmanda sorunu çözecek gibi...
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

Mesaj gönderen a_o »

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ı?

ii çalışmalar
kolau gelsin
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

Mesaj gönderen aliemrei »

select doviz,sum(tutar) from tablo
group by doviz

şeklinde bir sorgu tek hamlede bitirir.
Kullanıcı avatarı
mnt
Üye
Mesajlar: 57
Kayıt: 30 Eki 2005 12:58
Konum: Kocaeli

Mesaj gönderen mnt »

Ç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.
Mustafa
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

Mesaj gönderen a_o »

arkadaşlar yukardaki kodda biraz değişiklikler yaptım. yani stkfıytutar alanımı numeric yaptım. ve yaptığım sorgunun afterpost olayına yazdığım kod;

Kod: Tümünü seç

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 :(

herkese ii çalışmalar
kolay gelsin
Kullanıcı avatarı
mnt
Üye
Mesajlar: 57
Kayıt: 30 Eki 2005 12:58
Konum: Kocaeli

Mesaj gönderen mnt »

Kod: Tümünü seç

// 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.

Size de kolay gelsin..
Mustafa
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

Mesaj gönderen a_o »

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. :(
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Selamlar.
Peki gridde değişiklik yaptıktan sonra commit ediliyor mu?
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

Şö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...
Kullanıcı avatarı
mnt
Üye
Mesajlar: 57
Kayıt: 30 Eki 2005 12:58
Konum: Kocaeli

Mesaj gönderen mnt »

Peki gridde değişiklik yaptıktan sonra commit ediliyor mu?
Commit etsede etmesede farketmezki...

Bence debugla takip et kodu döngüye giriyormu değişkenler ne değerleri alıyor filan onlara bak.
Mustafa
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@mnt

Peki gridde yapılan değişiklik diske yazılmadan (commit edilmeden) yaptığın işlemler gridde yapılan değişiklikleri dikkate alır mı?
a_o
Üye
Mesajlar: 84
Kayıt: 18 Eki 2005 04:41
Konum: Tekirdağ

Mesaj gönderen a_o »

arkadaşlar yaptığım değişiklikleri aşağıdaki gibi kaydediyorum.

Kod: Tümünü seç

veri.stkk.Edit;
veri.stkk.POST;
veri.stkk.Refresh;
datasource'un onchange olayında da

Kod: Tümünü seç

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.
Cevapla