Delphi'de DataGrid Üzerinde Direkt Oynama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Delphi'de DataGrid Üzerinde Direkt Oynama

Mesaj gönderen aslangeri »

s.a.
ekranda tarihi saati gösteren bir yer var.
bak bakalım oralar sürekli değişiyormu?
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
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, timer detay, asıl olayı bir çözebilirsek güzel olacak...

Resim

DBGrid de oynama yaptık, sonuç aşağıda...

Resim
DBGrid de oynama yapmadan evvel BARKOD Edit'inin OnKeyPress eventinde işimi şu şekilde hallediyordum...

Kod: Tümünü seç

procedure Tform4.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i :integer;
top,kart:double;
begin
table1.Open;
table1.Filtered:= false;

 table7.Edit;
 table7MIKTAR.AsString:= edit3.Text;
 if key = #13 then begin
  if not table1.FindKey([edit1.text]) then
     begin
     ShowMessage ('Kayıt Bulunamadı');
     end
     else
     begin
     table1.Open;

     table1.Edit;

     table3.edit;
     table1.FindKey([edit1.text]);
     if table1BARKOD.Text = table3BARKOD.Text   then
   begin
   table3.Edit;
   table3MIKTAR.Value := table3MIKTAR.Value+table7MIKTAR.Value;
   table3.First;

   edit3.Text:='1';
   top:=0;
   kart:=0;
   for i:= 1 to table3.RecordCount do
   begin

     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
   table7TTUTAR.AsCurrency:= top;
   table7TKAR.AsCurrency:= kart;

   end
  else
  begin
  table1.Open;

  table3.Edit;
  table3.FindKey([edit1.text]);
  if table3BARKOD.Text = table1BARKOD.Text then
  begin
  table3.edit;
  table3MIKTAR.Value := table3MIKTAR.Value+table7MIKTAR.Value;
  table3.First;//Table3 Tampon Table olarak kullanıldı, bu bakımdan POST komutu yok.

  Edit3.Text:='1';
  top:=0;
  kart:= 0;
  for i:= 1 to table3.RecordCount do
   begin

     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
    table7TTUTAR.AsCurrency:= top;//Satış Ekranı sağ alttaki TOPLAM kısmını table7TTUTAR da kontrol ediyorum.
    table7TKAR.AsCurrency:= kart;//table7TKAR'ı burada kaydedip başka yerde (Kasa Defterinde) kontrol ediyorum.

  end
  else

  begin
 table1.Open;

 table3.Insert;
 table3BARKOD.Text := table1BARKOD.Text;
 table3MAL.Text := table1MAL.Text;
 table3FIYAT.AsCurrency := table1FIYAT.AsCurrency;
 table3MIKTAR.Value := table7MIKTAR.Value;
 table3TOPLAM.AsCurrency := table3MIKTAR.Value*table3FIYAT.AsCurrency;//Bu satırı TOPLAM Field'ını oluşturunca kaldırdık.
 table3KARBI.AsCurrency:= (table1FIYAT.AsCurrency-table1MALIYET.AsCurrency);
 table3KAR.AsCurrency:= table3MIKTAR.Value*table3KARBI.AsCurrency;
 Edit3.Text:= '1';
   table3.first;

   top:= 0;
   kart:= 0;
   for i:= 1 to table3.RecordCount do
   begin
     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
   table7TTUTAR.AsCurrency:= top;
   table7TKAR.AsCurrency:= kart;

 end;
 end;
 end;
    Edit1.SetFocus;
    Edit1.Text :='';

 end;


 end;
Daha sonra table3calcfield'ını oluşturduk

Kod: Tümünü seç

procedure Tform4.Table3CalcFields(DataSet: TDataSet);
begin

table3TOPLAM.Value:= table3MIKTAR.Value*table3FIYAT.Value;

end;

Ve bu durumda doğal olarak en alttaki TOPLAM kısmını kontrol edemiyorum. Çünkü table3calcfield durumuna geçtiğimizde table7 yi kontrol edemedim. Bunu nasıl çözeriz??
En son canset tarafından 25 Şub 2011 10:10 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
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 »

Form a bir tane query koy.
connection kısmına Tablelara koyduğun connectionı göster, sonra.

Kod: Tümünü seç

procedure Tform4.Table3CalcFields(DataSet: TDataSet);
var
begin
table3TOPLAM.AsCurrency:= table3MIKTAR.AsInteger*table3FIYAT.AsCurrency;

AdoQuery1.SQL.text:='select sum(miktar*fiyat) as toplam from table3 where faturano=islemno';//Burada sende fatura no yok nasıl maskeleyeceksin bilemiyorum...table3 te işlem yapıp boşaltıyormusun kayıtta bilemiyorum.Birdaha gözden geçir. :idea:  :?: 

AdoQuery1.open;
table7TTUTAR.AsCurrency:=AdoQuery1.fielbyname('Toplam').value;
AdoQuery1.close;

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 »

Conari hocam, forma Query mi koyacağım yoksa AdoQuery mi?

Eğer AdoQuery ise ConnectingString adlı bir sayfa açılıyor. Oradan use connection string tıklıyorum; media catalog, microsotf jet, microsoft ole, msdatashape vs. vs. çıkıyor, orada takıldım.

Bir de kod içerisinde de belirttiğin gibi, table3 de kayıt yaptırmıyorum, onu tampon table olarak kullanıyorum, bu bakımdan where kısmını kullanmazsak olmuyor mu??
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 »

Query=AdoQuery
ConnectingString leri kullandı isen o şekilde kullan, Ben ADoConnection compenentini kullandığını düşünmüştüm.
ConnectingString parametresini ADotable ları nasıl yaptı isen o şekilde yap.
Tampon ise where kısmınıda kaldır tabi.

Kod: Tümünü seç

AdoQuery1.SQL.text:='select sum(miktar*fiyat) as toplam from table3';
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 »

Query=AdoQuery ise Query kullandım o zaman, çünkü ADOQuery için bağlantı durumlarından bihaberim...

Hocam query1.fieldbyname parametresi görünmüyor bende, başka bir parametre ile halledebilir miyim acaba??

Resim
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 »

Fields altında da olabilir Delphi açık değil bakamıyorum. Şunları dene.

Kod: Tümünü seç

AdoQuery1.fields[0].value
AdoQuery1.fieldvalues['TOPLAM']
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 »

Calcfields'a Query i Fields parametresi ile dediğiniz şekilde yerleştirdim. Programı çalıştırdığımda tampon table için (table3) table does not exit uyarısı aldım. Tampon table da TOPLAM alanı calculated field idi, onu data field haline getirdiğimde program çalışıyor ama toplamalar yok tabi ki.

Yani query ile calculated field çakıştı gibi bir hal oldu, birinden birini kaldırırsam program çalışıyor ama istediğimiz işlemi yaptıramıyoruz halen.
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 »

Queryi DIPTOPLAM Olarak değiştir.

Kod: Tümünü seç

Query1.SQL.text:='select sum(miktar*fiyat) as DIPTOPLAM from table3'
;
Query1.fieldvalues['DIPTOPLAM'];
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 »

Resim
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 »

S.Aleyküm;

Bu sitede yazan üstadlar için aslında çok basit olduğuna inandığım sorunumun çözümünde, problemi tam olarak yansıtamadığım kanaati ile tekrardan resim yolluyorum. Yukarıdaki mesajlarımda kullandığım kodları da detaylı olarak paylaşmıştım. Sorunun çözümüne katkıda bulunacak tüm hocalarımdan Allah şimdiden razı olsun.

Saygılarımla..

Resim

Ama dbgrid columnlarında oynama yaptığımda alttaki TOPLAM kısmında kontrolü kaybediyorum.

Resim
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 »

A.S.
Projenin bir kısmını paylaş istersen burada yapalım. işlem bir sorgu çekip dönen sonucu yazdırmaktan ibaret.
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, 5.sayfanın 2. mesajında kodu yollamıştım ama gözünüzden kaçtı herhalde, tekrar yolluyorum.

DBGrid de oynama yapamazken, edit1 in onkeypress olayında işimi bu şekilde görmekteydim.

table3 tampon table olarak kullanıldı, o yüzden post komutu yok, post komutuna takılmayınız...

table1 den barkod ile ürünü çekip, table3 de gösterip, table7 de de kayıt yapıyoruz, olay bu..

Kod: Tümünü seç

procedure Tform4.Edit1KeyPress(Sender: TObject; var Key: Char);
var
i :integer;
top,kart:double;
begin
table1.Open;
table1.Filtered:= false;

table7.Edit;
table7MIKTAR.AsString:= edit3.Text;
if key = #13 then begin
  if not table1.FindKey([edit1.text]) then
     begin
     ShowMessage ('Kayıt Bulunamadı');
     end
     else
     begin
     table1.Open;

     table1.Edit;

     table3.edit;
     table1.FindKey([edit1.text]);
     if table1BARKOD.Text = table3BARKOD.Text   then
   begin
   table3.Edit;
   table3MIKTAR.Value := table3MIKTAR.Value+table7MIKTAR.Value;
   table3.First;

   edit3.Text:='1';
   top:=0;
   kart:=0;
   for i:= 1 to table3.RecordCount do
   begin

     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
   table7TTUTAR.AsCurrency:= top;
   table7TKAR.AsCurrency:= kart;

   end
  else
  begin
  table1.Open;

  table3.Edit;
  table3.FindKey([edit1.text]);
  if table3BARKOD.Text = table1BARKOD.Text then
  begin
  table3.edit;
  table3MIKTAR.Value := table3MIKTAR.Value+table7MIKTAR.Value;
  table3.First;//Table3 Tampon Table olarak kullanıldı, bu bakımdan POST komutu yok.

  Edit3.Text:='1';
  top:=0;
  kart:= 0;
  for i:= 1 to table3.RecordCount do
   begin

     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
    table7TTUTAR.AsCurrency:= top;//Satış Ekranı sağ alttaki TOPLAM kısmını table7TTUTAR da kontrol ediyorum.
    table7TKAR.AsCurrency:= kart;//table7TKAR'ı burada kaydedip başka yerde (Kasa Defterinde) kontrol ediyorum.

  end
  else

  begin
table1.Open;

table3.Insert;
table3BARKOD.Text := table1BARKOD.Text;
table3MAL.Text := table1MAL.Text;
table3FIYAT.AsCurrency := table1FIYAT.AsCurrency;
table3MIKTAR.Value := table7MIKTAR.Value;
table3TOPLAM.AsCurrency := table3MIKTAR.Value*table3FIYAT.AsCurrency;//Bu satırı TOPLAM Field'ını oluşturunca kaldırdık.
table3KARBI.AsCurrency:= (table1FIYAT.AsCurrency-table1MALIYET.AsCurrency);
table3KAR.AsCurrency:= table3MIKTAR.Value*table3KARBI.AsCurrency;
Edit3.Text:= '1';
   table3.first;

   top:= 0;
   kart:= 0;
   for i:= 1 to table3.RecordCount do
   begin
     top:= top+ table3TOPLAM.AsCurrency;
     kart:= kart+ table3KAR.AsCurrency;
     table3.Next;
     table1.Close;
   end;
   table7TTUTAR.AsCurrency:= top;
   table7TKAR.AsCurrency:= kart;

end;
end;
end;
    Edit1.SetFocus;
    Edit1.Text :='';

end;


end;
Daha sonra table3'ün CalcField'ını oluşturduk..

Kod: Tümünü seç

procedure Tform4.Table3CalcFields(DataSet: TDataSet);
begin

table3TOPLAM.Value:= table3MIKTAR.Value*table3FIYAT.Value;

end;
Bu koda birşeyler ilave etmeliyiz diye düşünüyorum ama dbgrid ile oynama yapmadığımız zamanlardaki pozisyona da eklediğimiz kod uyum sağlasın.
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 »

S.A. Cümleten;

Alttaki TOPLAM kısmını başka bir table da kontrol ettiğimizi belirtmiştik. Bu sefer başka bir yöntemle denemek istedim. Alttaki TOPLAM ı kontrol ettiğimiz table7 içinde kullandığımız TTUTAR kısmını CalcField olarak belirledim ve table7'nin OnCalcField'ında bu işi çözmeye çalıştım.

Kod: Tümünü seç

procedure Tform4.Table7CalcFields(DataSet: TDataSet);
var
i:Integer;
top,kart:Double;
begin
top:=0;
{kart:=0;}
table3.First;
for i:=1 to table3.RecordCount do
begin
top:= top+table3TOPLAM.AsCurrency;
{kart:= kart+table3KAR.AsCurrency;}
table3.Next;
end;
table7TTUTAR.AsCurrency:= top;
{table7TKAR.AsCurrency:= kart;}

end;
(Devre dışı bıraktığım alanlar, KAR kontrolü yapıyordu ancak Stack Overflow hatasından kaçmak için devre dışı kaldılar, ona sonra değiniriz.)

Son durum şu şekilde...

Resim

Satış için barkod okuttuğumuz zaman, alttaki TOPLAM'ı alamıyoruz ancak;

barkod okuttuğumuz edit'e herhangi bir sayı, rakam , barkod vs girmeye başladığımız anda döngü aktif olup TOPLAM'ı alıyor. Yani ilgili edit'e ilk rakamı girerken table7CalcField'ı aktif oluyor anladığım kadarı ile...Daha öncesinde aktif olmuyor. Bunu nasıl çözeriz???

Resim
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 »

Sanırsam; table7CalcField erken devreye giriyor ve top:=0 satırından sonra toplamı sıfırlıyor, bu yüzden 2.döngüde ancak toplamı görebiliyor gibi bir durum var.

CalcField alanların öncelik sırasını nasıl ayarlayabilirim, çözüm olur mu acaba??
Cevapla