DBGrid Üzerinde CalcField Sütunun Toplamını Almak

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: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

Evet Şaban Bey, büyük küçük harf düzenlemesini yapınca sorun ortadan kalktı ancak şimdi de mantıksal bir hata var, kodu yazdığımız yer sağlıklı olmadı sanki, çünkü ilk tampona aktarılan ürün görünmüyor, ikinci aktarılan üründen sonra sadece 1.ürünü görüyor, 3.cü aktarılan üründen sonra 1+2 ürün toplamını alıyor ve bu şekilde devam ediyor. Ayrıca dbgrid üzerinde yaptığımız değişikliği de görmüyor, değişiklikten sonra tampona aktarılan ürün ile birlikte son aktarılan ürünü görmüyor değişiklik+öncekileri görüyor, sonuç olarak hep bir adım geriden geliyor. Kodu başka nereye yerleştirebiliriz acaba?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen aslangeri »

s.a.
kodu nereye koydunuz bilmiyorum ama tampon tablonun afterpost eventina koyarsanız tampon tablodaki değişiklikleri kaydettiğiniz zaman toplam güncellenecektir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen orhancc »

Şaban abinin kodunu tampon tablosunun postundan sonrasına koyarsan sorunun düzelmesi gerekiyor.
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

A.slm; ŞabanAkman, aslangeri ve orhancc...

tampon afterpost u olayı çözmüyor, yine geriden geliyor, datasource'un onchange'i dahil denemediğim event kalmadı zaten...

dbgrid de örneğin miktar sütununda oynama yaptığımızda calcfield olan tutar sütununda değişikliğe yol açan event hangisidir? O evente yazmam lazım diye düşünüyorum.
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen orhancc »

Projenin kodlarını göstermen mümkün mü ?
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

Kod: Tümünü seç

unit Unitsatis;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, StdCtrls, DB, ADODB, Mask, DBCtrls;

type
  TFormsatis = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    DBGridurun: TDBGrid;
    DBGridtampon: TDBGrid;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    ADODataSeturun: TADODataSet;
    DataSourceurun: TDataSource;
    ADODataSettampon: TADODataSet;
    DataSourcetampon: TDataSource;
    Button1: TButton;
    Button2: TButton;
    edGenelToplam: TEdit;
    ADOConnectionurun: TADOConnection;
    ADODataSeturunBarkod: TIntegerField;
    ADODataSeturunMal: TWideStringField;
    ADODataSeturunGrup: TWideStringField;
    ADODataSeturunFirma: TWideStringField;
    ADODataSeturunIskonto: TIntegerField;
    ADODataSeturunKdv: TIntegerField;
    ADODataSeturunFiyat: TBCDField;
    ADODataSeturunMaliyet: TBCDField;
    ADODataSeturunMiktar: TIntegerField;
    ADOQueryGenel: TADOQuery;
    ADODataSettamponBarkod: TIntegerField;
    ADODataSettamponMal: TWideStringField;
    ADODataSettamponFiyat: TBCDField;
    ADODataSettamponMiktar: TIntegerField;
    ADODataSettamponTutar: TBCDField;
    ADODataSettamponGenelToplam: TBCDField;
    ADODataSettamponKar: TBCDField;
    ADODataSettamponKarToplam: TBCDField;
    ADODataSettamponIskonto: TBCDField;
    procedure ADODataSettamponCalcFields(DataSet: TDataSet);
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure DataSourcetamponDataChange(Sender: TObject; Field: TField);
    procedure ADODataSettamponAfterPost(DataSet: TDataSet);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Formsatis: TFormsatis;

implementation

uses Uniturun;

{$R *.dfm}

procedure TFormsatis.ADODataSettamponCalcFields(DataSet: TDataSet);
begin
adodatasettampontutar.Value:= (adodatasettamponmiktar.Value*adodatasettamponfiyat.Value)-
(adodatasettamponmiktar.Value*adodatasettamponfiyat.Value*
adodatasettamponiskonto.Value)/100;

AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon');
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;

{adoquery1.SQL.Text:= 'select sum(adodatasettampontutar.value) as toplam from TabloTampon';
adoquery1.Open;
adodatasettampongeneltoplam.Value:= adoquery1.fieldbyname('toplam').Value;
adoquery1.Close;} //DENEME

end;

procedure TFormsatis.Button1Click(Sender: TObject);
begin
formsatis.Hide;
formurun.show;
end;

procedure TFormsatis.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
adodataseturun.Open;
adodataseturun.Filtered:= false;
if key=#13 then begin
if not adodataseturun.Locate('barkod',edit1.Text, []) then
begin
Showmessage ('Kayıt Bulunamadı');
end else
begin
adodataseturun.Open;
adodataseturun.Edit;
adodatasettampon.Edit;
adodataseturun.Locate('barkod',edit1.Text, []);
if adodataseturunbarkod.Text=adodatasettamponbarkod.Text then
begin
adodatasettampon.Edit;
adodatasettamponmiktar.Value:= adodatasettamponmiktar.Value+1;
adodatasettampon.First;
end else
begin
adodataseturun.Open;
adodatasettampon.Edit;
adodatasettampon.Locate('barkod',edit1.text, []);
if adodatasettamponbarkod.Text=adodataseturunbarkod.Text then
begin
adodatasettampon.Edit;
adodatasettamponmiktar.Value:= adodatasettamponmiktar.Value+1;
adodatasettampon.First;
end else
begin
adodataseturun.Open;
adodatasettampon.Insert;
adodatasettamponbarkod.Text:= adodataseturunbarkod.Text;
adodatasettamponmal.Text:= adodataseturunmal.Text;
adodatasettamponiskonto.Value:= adodataseturuniskonto.Value;
adodatasettamponfiyat.AsCurrency:= adodataseturunfiyat.AsCurrency;
adodatasettamponmiktar.Value:=1;
adodatasettamponkar.AsCurrency:= (adodataseturunfiyat.AsCurrency-adodataseturunmaliyet.AsCurrency);
adodatasettamponkartoplam.AsCurrency:= adodatasettamponmiktar.Value*adodatasettamponkar.AsCurrency;

{AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon');
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;}  //DENEME

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


end;

procedure TFormsatis.Button2Click(Sender: TObject);
var
i:Integer;
begin
adodatasettampon.First;
for i:= 1 to adodatasettampon.RecordCount do
begin
adodatasettampon.Delete;
end;
edit1.SetFocus;
edGenelToplam.Text:='';
end;

procedure TFormsatis.DataSourcetamponDataChange(Sender: TObject;
  Field: TField);
var
i:double;
begin
{AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon');
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;}  //DENEME

{i:=0;
adodatasettampon.First;
while not adodatasettampon.Eof do
begin
i:= i+strtofloat(dbgridtampon.columns[4].Field.value);
adodatasettampon.Next;
end;
edGenelToplam.Text:= (floattostr(i)); } //DENEME
end;
procedure TFormsatis.ADODataSettamponAfterPost(DataSet: TDataSet);
var
i:double;
begin
{AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon');
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;} //DENEME

end;
end.
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

Resim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen aslangeri »

s.a.

Kod: Tümünü seç

Procedure Hesapla(id:integer)
Begin
AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon where id<>'+inttostr(id));
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;
End;

Kod: Tümünü seç

procedure TFormsatis.ADODataSettamponAfterPost(DataSet: TDataSet);
begin
hesapla(-1)
end;

Kod: Tümünü seç

procedure TFormsatis.ADODataSettamponCalcFields(DataSet: TDataSet);
begin
adodatasettampontutar.Value:= (adodatasettamponmiktar.Value*adodatasettamponfiyat.Value)-
(adodatasettamponmiktar.Value*adodatasettamponfiyat.Value*
adodatasettamponiskonto.Value)/100;
hesapla(adodatasettamponid.value);
EdGenelToplam.Text:= strtofloatdef(edGenelToplam.TExt,0)+adodatasettampontutar.value;
end;
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: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

Sn. aslangeri yazdığınız procedure de

Undeclared Identifier: 'AdoqueryGenel'

hatası alıyorum, sebebi ne olabilir acaba?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen sabanakman »

Sorularınızın bu kadar olmaması lazım. Hata mesajı ingilizce ve zerre kadar ingilizce bilmeseniz bile hiç sözlüğünüz yoksa Google sözlük ile mesajı çözebilirsiniz. Delphiye yeni başlayan birisinin de ilk karşılaştığı ve durumun nereden kaynaklandığını algılayacağı en temel hata mesajıdır bu.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

type da query ekli ADOQueryGenel: TADOQuery; olarak, daha önce kendim procedure hiç oluşturmadım ama 'procedure hesapla' olarak pro çalışınca kendisi type satırının altına ekler diye düşünüyorum...

saban hocam bu işlem için kafam artık davul gibi, sinir oldum açıkçası kaç gündür bir toplam almada takıldım ilerleyemedim, benim anladığım formda adoguerygenel'i göremiyorum diyor ama herşey de tamam gibi...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen sabanakman »

FormAdi.ADOQueryGenel.... şeklinde hangi formdaysa ilgili formun adını da ekleyerek dene...
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
canset
Üye
Mesajlar: 151
Kayıt: 19 Haz 2005 12:38

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

Tşk ler Şaban hocam;

Aslangeri hocam size de ayrıyeten tşk. ederim, kodlar çok güzel çalıştı ancak bir yerde mantıksal hata var gibi, şöyle bir toplam hatasına rastladım..

100 barkod no'lu ürünü okuttuk, dbgrid den istediğimiz değişikliği yaptık, geneltoplam sorunsuz...
Üzerine 101 barkod no'lu ürünü okuttuk, dbgrdi den istediğimiz değişikliği yaptık, geneltoplam sorunsuz...
Üzerine 102 barkod no'lu ürünü okuttuk, dbgrdi den istediğimiz değişikliği yaptık, geneltoplam sorunsuz...
...
...

Ama;
Tüm yukarıdaki işlemlerden sonra 100 barkod nolu ürüne geri dönüp dbgrid üzerinde tekrar değişiklik yapacağımız zaman miktar sütununa veya fiyat sütununa tıkladığımız anda 100 barkod nolu ürünün tutarı kadar (miktar*fiyat) geneltoplam a ekleme yapıyor (dikkat edin, sadece miktar ya da fiyatta değişiklik yapmaya çalıştık, enter a basarak calcfield ı harekete geçirmedik), enter a bastığımızda ise GenelToplam haliyle 100 barkod nolu ürünün tutarı kadar farklı çıkıyor.


Ayrıca;

Kod: Tümünü seç

Procedure Hesapla(id:integer)
Begin
AdoqueryGenel.Recordset:= ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon where id<>'+inttostr(id));
EdGenelToplam.Text:= AdoQueryGenel.Fields[0].AsString;
End;
Yukarıdaki kodu şöyle değiştirdim

Kod: Tümünü seç

procedure Hesapla(id:integer);
Begin
Formsatis.AdoqueryGenel.Recordset:= formsatis.ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon');
formsatis.EdGenelToplam.Text:= formsatis.AdoQueryGenel.Fields[0].AsString;
End;
Aşağıdaki diğer kodda ise ise

Kod: Tümünü seç

procedure TFormsatis.ADODataSettamponCalcFields(DataSet: TDataSet);
begin
adodatasettampontutar.Value:= (adodatasettamponmiktar.Value*adodatasettamponfiyat.Value)-
(adodatasettamponmiktar.Value*adodatasettamponfiyat.Value*
adodatasettamponiskonto.Value)/100;
hesapla(adodatasettamponid.value);
EdGenelToplam.Text:= strtofloatdef(edGenelToplam.TExt,0)+adodatasettampontutar.value;
end;
Önce adodatasettamponid isimli yeni bir dataset oluşturup bağlantıları, alan tanımlarını ve calcfield alanı ayarladım, sonra şu kod ile değiştirdim

Kod: Tümünü seç

procedure TFormsatis.ADODataSettamponCalcFields(DataSet: TDataSet);
begin
adodatasettampontutar.Value:= (adodatasettamponmiktar.Value*adodatasettamponfiyat.Value)-
(adodatasettamponmiktar.Value*adodatasettamponfiyat.Value*
adodatasettamponiskonto.Value)/100;

Hesapla(formsatis.ADODataSettamponid.Fieldbyname('Tutar').AsInteger);
edGenelToplam.Text:= strtofloatdef(edGenelToplam.Text,0)+adodatasettampon.Fields[4].Value;
Değişiklikler bunlar, bu değişikliklerin yukarıdaki hataya sebep olduğunu zannetmiyorum...

Acaba yukarıda bahsettiğim GenelToplam hatasını nasıl giderebiliriz??
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen aslangeri »

s.a.
hesapla metoduna calc fields da yanlış değer gönderiyorsunuz ondan oluyor.
tutar değerini gönderimişsiniz.
orada ilgili satırın ID alanını göndermeniz lazım. ki ilgili satırı query toplamına eklemesin. onu calc fieldda hesapladığımız toplamı ekliyoruz.
hesapla metodundaki where i de kaldırmışsınız. söylediğiniz hatayı vermesi normal.
tampon tablonuza eğer yoksa "id" adında autoincrement bir alan ekleyin. yukarda söylediklerimide düzeltin öyle deneyin.
kolay gelsin.
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: DBGrid Üzerinde CalcField Sütunun Toplamını Almak

Mesaj gönderen canset »

A.Slm;

tablotampon da id adlı autoincrement oluşturup, güncellemeleri yaptım, kodları da düzelttim ama aynı sorun halen devam ediyor.

Kod: Tümünü seç

procedure Hesapla(id:integer);
Begin
Formsatis.AdoqueryGenel.Recordset:= formsatis.ADOConnectionurun.Execute('select sum((Miktar*Fiyat)-((Miktar*Fiyat*Iskonto)/100)) from tablotampon where id<>'+inttostr(id));
formsatis.EdGenelToplam.Text:= formsatis.AdoQueryGenel.Fields[0].AsString;
End;

procedure TFormsatis.ADODataSettamponCalcFields(DataSet: TDataSet);
begin
adodatasettampontutar.Value:= (adodatasettamponmiktar.Value*adodatasettamponfiyat.Value)-
(adodatasettamponmiktar.Value*adodatasettamponfiyat.Value*
adodatasettamponiskonto.Value)/100;

Hesapla(formsatis.ADODataSettamponid.Fieldbyname('id').AsInteger);
edGenelToplam.Text:= strtofloatdef(edGenelToplam.Text,0)+adodatasettampon.Fields[4].Value;
end;

procedure TFormsatis.ADODataSettamponAfterPost(DataSet: TDataSet);
begin
hesapla(-1);
end;
Cevapla