Delphi'de DataGrid Üzerinde Direkt Oynama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

A.Slm;

Hocam dbgrid'in oncolexit eventinde, form üzerindeki tüm butonları, dbgriddblclick ve timer ları görmemize rağmen dbgridcolumn ları göremiyorum...
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

Toplam Tutar
Fieldını Calculated yaparsan bunlara gerek kalmaz.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

Conari hocam, toplam için hesaplamayı miktar field'ının onchance eventinde halletmiştim, calculated field için tekrardan table hazırlamak zorunda kalacağım..:((
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

Table üzerinde MIKTAR OnChange olayında

Kod: Tümünü seç

procedure Tform4.Table3MIKTARChange(Sender: TField);
begin

table3TOPLAM.AsCurrency:= table3MIKTAR.AsInteger*table3FIYAT.AsCurrency;
table3KAR.AsCurrency:= table3MIKTAR.AsInteger*table3KARBI.AsCurrency;
end;
ile gerekli hesaplamayı yaptırıyorum. Ancak şimdi DBGrid üzerinde MIKTAR ve FİYAT kolonlarında manuel oynama yapabileceğimizden, yukarıdaki kodu sadece barkodlu okumada ve MIKTAR sütununda değişiklik yapmadığımız zaman kullanabileceğiz. MIKTAR sütununda değişiklik yaptığımızda, örneğin miktarı 1 den manuel olarak 4 yaptık diyelim, ENTER tuşu ile FIYAT sütununa geçmem ve FIYAT sütununda eğer değişikliğim varsa değiştirip, değişiklik yoksa ENTER tuşu ile geçerek toplama ulaşmam lazım. FIYAT sütununun ENTER' ına da MIKTAR'ın OnChange'inde olduğu gibi bir kod yazıp, altta Toplam Tutarı gösteren pencereyi de göz önüne alarak bir kod yazmam lazım...

Tüm bunlar için;

1. MIKTAR'ın Onchange olayının kodunu sadece manuel değişiklik yapılmadığı zaman kullanmamız lazım.
2. MIKTAR da manuel değişiklik yaptığımız zaman ENTER ile FIYAT kolonuna geçmemiz lazım.
3.FIYAT da değişiklik yapsakda yapmasakda fiyat kolonunu ENTER ile geçerken bir kod yazarak TOPLAM a ulaşmamız lazım.

Tüm bunları nasıl yapmamız lazım?

Ayrıca;

aslangeri hocam, dbgrid'in oncolexit eventinde, form üzerindeki tüm butonları, dbgriddblclick ve timer ları görmemize rağmen dbgridcolumn ları göremiyorum. Bir ayar falan mı yapmam lazım acaba??

conari hocam, calculatedfield ile kolay halledebileceğimi yazmışsınız, o durumda MIKTAR'ın onchange olayını iptal etmem mi gerekir? Bir de calculated field 'ı forumdan nasıl yapıldığını araştırdım. İlgili table daki TOPLAM Field'ını calculated'a çevirmem mümkün müdür? Table üzerinde New Field olarak yeni calculated field tanımlamaya çalıştığımda 'Data Field not permitted on open Dataset' uyarısı almaktayım. Yukarıda saydığım maddeleri calculatedfield ile kolaylıkla halledebileceksem tabi ki onu tercih etmek isterim. Calculated field olarak TOPLAM'ı tanımladığımız zaman dbgrid column larında ne değişiklik yaparsak yapalım (ister manuel ister aynı barkodu tekrar tekrar okutarak) tüm bu işlemleri halledebilecek miyiz??
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

Kaldıracaksınız.
FieldKind özelliğinden değiştirebilirsiniz.

Sadece Tablonun onCalcFields eventine.

Kod: Tümünü seç

table3TOPLAM.value:= table3MIKTAR.value*table3FIYAT.value;
yazman yeterli.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

conari hocam;

MIKTAR'ın Onchange event'ini TOPLAM'ı calcultedfield yaptıktan sonra TABLE'ın OncalsField'ına yazdım ve MIKTAR onchange'i iptal ettim. Bu şekilde program çalışıyor fakat bu seferde 'stack everflow' hatası veriyor. :ara stackoverflow da kısır döngüye soktuğum söyleniyor. Ne yapmalıyım?
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

breakpoint koyup debug et. oncalcFields eventine oradan mı geliyor. Bu şekilde bir şey söylenemez.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

conari yazdı:breakpoint koyup debug et. oncalcFields eventine oradan mı geliyor. Bu şekilde bir şey söylenemez.
Hocam olay şu;

Tablonun onCalcFields eventine sadece

Kod: Tümünü seç

table3TOPLAM.value:= table3MIKTAR.value*table3FIYAT.value;
kodunu yazarsam TOPLAM columunu dediğiniz gibi pratik bir şekilde hesaplatıyoruz ancak alttaki genel tutarı gösteren TOPLAM TUTAR kısmına da tün satış tutarlarını toplattırarak aktarmamız gerek...

Ancak;

Bir de ben MIKTAR onchange olayında bir de KAR hesaplattırıp onu da ayrı bir yerde tutup raporlama yapıyordum o da üstteki kodun altında

Kod: Tümünü seç

table3KAR.AsCurrency:= table3MIKTAR.AsInteger*table3KARBI.AsCurrency;
kodu ile mümkün olmaktaydı.

Tüm bunlar tabi ki tampon table üzerinde SATIŞ EKRANINDA görüntülenmekte ve KAYDET butonu ile de ilgili veriler ilgili yerlere gönderilmekte ama mesela KAR Field'ı satıcıya özel bir husus olduğu için SATIŞ PENCERESİ'nde unvisible olarak yer almakta...

Şimdi hocam, calculatedfield ile TOPLAM satırını hallettik ama alttaki TOPLAM TUTAR kısmına da bunu aksettirmemiz lazım, birkaç satır satış olduğunda da bunu döngü ile çevirip TOPLAM ları toplayıp sonucu TOPLAM TUTAR'da gösterebilmeliyiz ve üstte de belirttiğim gibi KAR kısmını da halletmemiz lazım...

Çok başınızı ağrıtıyorum kusura bakmayın..
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

şöle bir döngü ile toplattır.

Kod: Tümünü seç

var toplam....
begin
toplam:=0;
Adotable.first;
  while not(Adotable.Eof)  do
   begin
   toplam := toplam + table3TOPLAM.value;
    Adotable.Next;
   end;
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

Hocam S.A.

Yukarıda verdiğiniz yöntemi uyguladım, table3calcfields da. Ancak programı stack overflow' a soktum, hatayı da anlayabilmiş değilim.

Kod: Tümünü seç

procedure Tform4.Table3CalcFields(DataSet: TDataSet);
var
i: Integer;
top:Double;

begin

table3TOPLAM.AsCurrency:= table3MIKTAR.AsInteger*table3FIYAT.AsCurrency;

table3.First;
top:=0;
while not table3.Eof do
begin
top:= top+table3TOPLAM.Value;
table3.Next;
end;
table7TTUTAR.AsCurrency:=top;


end;

end.
Yukarıdaki kodda table7 de satışlar toplamını TTUTAR olarak tutmaktayım. Ayrıca table7 için KAR olarak bir field'ım daha var ancak TOPLAM calcField'ı sadece table3TOPLAM işlemini kabul etti, table3KAR işlemini altına eklediğimde tekrar stackflow hatası alıyorum. İşler iyice karıştı, çok basitçe halledebileceğimi düşündüğüm bir olay içinden çıkılmaz bir hal aldı diyebilirim.:((
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

Durumu genel olarak özetlemeye çalışarak toparlayayım...:


Resim

Uploaded with ImageShack.us


Table1 Stokları tuttuğum dosya.

Table3 Satış Penceresinde tampon dosya

Table7 Toplam Tutar ve Toplam Kar'ı tuttuğumuz, alttaki TOPLAM penceresinde TOPLAMSATIS'ı gösterdiğimiz yer.

edit1.onkeypress event'inde (BARKOD Penceresi) table1 den table3'e aktarımları, kısaca söylemek gerekirse SATIŞ işlemini gerçekleştiriyoruz. Bu event de aynı ürün tekrar okutturulursa vs. her türlü işlemi yaptırıyoruz.

Problem : Satış ekranı üzerindeki dbgrid in MIKTAR ve FIYAT column larında manuel oynama yapabilmek istiyoruz.

Bunun için;

Daha önce table3MIKTAR.onchange event inde bulunan

Kod: Tümünü seç

table3TOPLAM.Ascurrency := table3MIKTAR.Asinteger*table3FIYAT.Ascurrency;
table3KAR.Ascurrency := table3MIKTAR.Asinteger*table3KARBI.Ascurrency;
kodu kaldırılarak, kodun yerine table3TOPLAM Field ı Calcfield haline dönüştürülüp, table3 OnCalcField event ine

Kod: Tümünü seç

table3TOPLAM.Ascurrency := table3MIKTAR.Asinteger*table3FIYAT.Ascurrency;
table3KAR.Ascurrency := table3MIKTAR.Asinteger*table3KARBI.Ascurrency;
kodu yazıldı ama stackflow hatası alındı, bunun üzerine yalnızca

Kod: Tümünü seç

table3TOPLAM.Ascurrency := table3MIKTAR.Asinteger*table3FIYAT.Ascurrency;

kodu yazılarak stackflow dan kaçıldı ancak Problem1 burada oluştu ve KAR denetimi kontrol dışı kaldı...***PROBLEM 1***

Üstteki kod yazıldıktan sonra alttaki TOPLAM SATIŞ kısmını düzenlemek için table3TOPLAM Field ının OnCalcFields ına ekleme yapıldı:

Kod: Tümünü seç

procedure Tform4.Table3CalcFields(DataSet: TDataSet);
var
i: Integer;
top:Double;

begin

table3TOPLAM.AsCurrency:= table3MIKTAR.AsInteger*table3FIYAT.AsCurrency;

table3.First;
top:=0;
while not table3.Eof do
begin
top:= top+table3TOPLAM.Value;
table3.Next;
end;
table7TTUTAR.AsCurrency:=top;


end;

end.
Bu şekilde çalıştırılan programda yine stackoverflow hatası alındı...***PROBLEM 2***

Durum bundan ibaret, bir el atalım arkadaşlar...
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

Adotable1 oncalc da döngüye sokma.
denemedim ama calcfieldın changene yazmayı dene.
Başta da disablecontrol sonda enable kontrol yaparsan iyi olur.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

conari yazdı:Adotable1 oncalc da döngüye sokma.
denemedim ama calcfieldın changene yazmayı dene.
Başta da disablecontrol sonda enable kontrol yaparsan iyi olur.
CalcField'ın Onchange olayına

Kod: Tümünü seç

procedure Tform4.Table3TOPLAMChange(Sender: TField);
var
i:Integer;
top:double;
begin

top:= 0;
for i:= 1 to table3.RecordCount do
begin
table3.Edit;
top:= top+table3TOPLAM.AsCurrency;
table3.Next;
end;
table7TTUTAR.AsCurrency:= top;
end;
yazdığımda 'Dataset not in edit or insert mode' hatası alıyorum (table3 için, halbuki table3.edit moduna sokmuştum yukarıdaki kodda.

Bir de şu var ; Calculated Field olan TOPLAM ın onchange'ine bu kodu yazdığımız zaman dbgrid ile hiç oynamadan yapacağımız satışlarda sıkıntı olmaz mı? Çünkü TOPLAM alanı boşken yapılan satışta veya dolu iken yapılan diğer satışlarda da bu kod devreye girecek??
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen conari »

while not table3.Eof do Şeklinde vermiştim kodu.
Başındada active kontrol yaparsınız.

birde tablo3 edit modda olmayacak.
table7 edit modda olmalı.

Ayrıca satışda, DBgridin boş olması gibi bir durum nasıl oluyor ki...
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen canset »

conari yazdı:while not table3.Eof do Şeklinde vermiştim kodu.
Başındada active kontrol yaparsınız.

birde tablo3 edit modda olmayacak.
table7 edit modda olmalı.

Ayrıca satışda, DBgridin boş olması gibi bir durum nasıl oluyor ki...
Hocam table3 edit modda olmayacak diyorsunuz, ben de aynı fikirdeyim ama

"table3:Dataset not in edit or insert mode " hatası alıyorum, bunun üzerine kodda bir yerlerde table3 için edit mode koymaya çalışıyorum, nereye koyarsam koyayım yine aynı hatayı alıyorum, sıyırmaya az kaldı anlayacağınız..

Active control nasıl yapılıyor hocami onu bilmiyorum..
Cevapla