dbgrid de borc-alacak bakiyede hesaplama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Mesaj gönderen Bil_Bakalım »

:lol: abi merak etme yüzdüm yüzdüm kuyruğuna geldim. 8 saat sonunda sanki ufukta ışık göründü.

Allah kimseyi karanlıkta bırakmasın bırakanlara da sizin gibi dost sahibi olsun ki korkmasın

Ben hallettiğimde buraya detaylı olarak yazarım. O zaman inşalla önerilerinizi söylersiniz.
Kullanıcı avatarı
Bil_Bakalım
Üye
Mesajlar: 61
Kayıt: 31 Ara 2004 01:45
Konum: İzmir
İletişim:

Azmin elinden ne kurtulur

Mesaj gönderen Bil_Bakalım »

Biraz ter döktük ama oldu :lol: :lol: Kendimi harika hissediyorum.
Başka kardeşimde faydalansın diye önce ne yapmak istediğimi anlatarak sonrada yazdığım kodları aşağıya yazacağım.Düşüncesi olan arkadaşlar lütfen hatalarımı söylesinler. :oops: Malum bu yorgunluk insana bir sürü hata yaptırtıyor.

yapmak istediğim şey :

carikartı (id,cariad,carikod,teltoplamborc,toplamalacak.....)
carihareket(id,tarih,belgeno,borc,alacak,tutar......) fieldlerine sahip iki
tablom var.
carikarti(query) ve carihareket(table) tablolarını birbirine bağladım.bir dbgrid nesnesinide carihareket tablosuna bağladım.

Buraya kadar herşey normal.Taki müşterim ''Ben her satırda alıcının ne kadar borcu yada alacağı var bilmek istiyorum'' diyene kadar. İşte cevabı

Muhasebe programı hazırlayanlar için gerekli bir çalışma umarım az da olsa işinize yarar.

Kod: Tümünü seç


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, Grids, DBGrids, ZUpdateSql, ZQuery,
  ZMySqlQuery, ZTransact, ZMySqlTr, ZConnect, ZMySqlCon;

type
  TForm1 = class(TForm)
    ZMySqlDatabase1: TZMySqlDatabase;
    ZMySqlTransact1: TZMySqlTransact;
    carikarti: TZMySqlQuery;
    cariharketsource: TDataSource;
    carisource: TDataSource;
    DBGrid1: TDBGrid;
    carikarticarikod: TStringField;
    BitBtn1: TBitBtn;
    Edit1: TEdit;
    carihareket: TZMySqlTable;
    carihareketsanaltutar: TFloatField;
    cariharekettutar: TFloatField;
    carihareketborc: TFloatField;
    carihareketalacak: TFloatField;
    carihareketcarikod: TStringField;
    carihareketId: TIntegerField;
    cariharekettarih: TDateField;
    a: TZMySqlQuery;
    procedure BitBtn1Click(Sender: TObject);
    procedure carihareketCalcFields(DataSet: TDataSet);
    procedure carihareketBeforePost(DataSet: TDataSet);
    procedure carihareketBeforeInsert(DataSet: TDataSet);
    procedure carihareketBeforeEdit(DataSet: TDataSet);
    procedure carihareketAfterPost(DataSet: TDataSet);
    procedure carihareketBeforeDelete(DataSet: TDataSet);
    procedure carihareketAfterDelete(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  id:integer;
  guncel,eskiborc,eskialacak:double;
  eklecikar,durum:string;
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  carikarti.Sql.text:='select carikod FROM carikarti where carikod=:a';
  carikarti.Params[0].AsString:=edit1.Text;
  carikarti.Open;

  if not(carikarti.IsEmpty) then
     carihareket.Active:=true;
  
end;

procedure TForm1.carihareketCalcFields(DataSet: TDataSet);
begin

   carihareketsanaltutar.asfloat:=carihareket.fieldbyname('borc').asfloat-
                                 carihareket.fieldbyname('alacak').asfloat;
end;

procedure TForm1.carihareketBeforePost(DataSet: TDataSet);
begin
  if (id<>0) and (durum='E') then //edit durumunda ise
  begin
    a.Sql.Text:='select sum(borc)-sum(alacak) from carihareket where carikod=:ck and id<=:id';
    a.Params[0].asstring:=edit1.Text;
    a.Params[1].AsInteger:=id-1;  //Edit edilmiş satırdan önceki satıra kadar bakiyeyi bulur.
    a.Open;
                           //Hangi sutun içerisinde değişiklik yapıldı ise ona göre işlem yapıyor.
    if carihareketborc.asfloat<>0 then
      begin
        carihareket.FieldByName('tutar').AsFloat:=(a.Fields[0].AsFloat+carihareketsanaltutar.AsFloat);
        guncel:=carihareketborc.AsFloat-eskiborc;
        if carihareketborc.asfloat>eskiborc then 
          eklecikar:='+' else eklecikar:='-';
      end else
      begin
        carihareket.FieldByName('tutar').AsFloat:=(a.Fields[0].AsFloat+carihareketsanaltutar.AsFloat);
        guncel:=carihareketalacak.AsFloat-eskialacak;
        if carihareketalacak.asfloat>eskialacak then
         eklecikar:='-' else eklecikar:='+';
      end;

             //edit yapılmış kayıttan sonraki kayıtları güncelleştiriyor
      if eklecikar='+' then  //Edit edilmiş sutundaki değer azaldımı arttımı kontrolü.Buna göre tutar artar yada azalır.
        a.Sql.Text:='UPDATE carihareket SET tutar=tutar+:VF where carikod=:cd and id>:A'
      else
        a.Sql.Text:='UPDATE carihareket SET tutar=tutar-:VD where carikod=:cd and id>:D';
        a.Params[0].AsFloat:=abs(guncel);
        a.Params[1].AsString:=edit1.Text;
        a.Params[2].AsInteger:=id;
        a.ExecSql;

        eskiborc:=0;     //Edit edilmiş değerler eski haline getiriliyor.
        eskialacak:=0;
        durum:='H';
  end else   //Edit durumunda değil ise aşağıdakilerini yapar
  begin
    if id=0 then //Bilgi girişi yapılan satır ilk satır ise
      begin
        carihareket.FieldByName('tutar').AsFloat:=carihareketsanaltutar.AsFloat;
        exit;
      end;

   a.Sql.Text:='select sum(borc)-sum(alacak) from carihareket where carikod=:ck and id<=:id';
   a.Params[0].asstring:=edit1.Text;
   a.Params[1].AsInteger:=id;
   a.Open;
   carihareket.FieldByName('tutar').AsFloat:=a.Fields[0].AsFloat+carihareketsanaltutar.AsFloat;
   end;

end;
procedure TForm1.carihareketBeforeInsert(DataSet: TDataSet);
begin
  id:=carihareket.fieldbyname('id').AsInteger;
end;

procedure TForm1.carihareketBeforeEdit(DataSet: TDataSet);
begin
  id:=carihareketid.AsInteger;      //Bu değişkenler edit olduğunda..
  eskiborc:=carihareketborc.asfloat;
  eskialacak:=carihareketalacak.asfloat;
  Durum:='E';
end;

procedure TForm1.carihareketAfterPost(DataSet: TDataSet);
begin
   carihareket.Refresh;
end;

procedure TForm1.carihareketBeforeDelete(DataSet: TDataSet);
begin
  id:=carihareketid.AsInteger;
  Durum:='E';
  if (carihareketid.AsInteger<>0) and (durum='E') then //Kayıt silinecek durumunda ise
  begin
    if carihareketborc.asfloat<>0 then
      begin
        guncel:=carihareketborc.AsFloat;
        eklecikar:='-';
      end
    else
      begin
        guncel:=carihareketalacak.AsFloat;
        eklecikar:='+';
      end;
             //silinen kayıttan sonraki kayıtları güncelleştiriyor
      if eklecikar='-' then
        a.Sql.Text:='UPDATE carihareket SET tutar=tutar-:VD where (carikod=:cd and id>:D)'
      else
        a.Sql.Text:='UPDATE carihareket SET tutar=tutar+:VD where (carikod=:cd and id>:D)';
      a.Params[0].AsFloat:=abs(guncel);
      a.Params[1].AsString:=edit1.Text;
      a.Params[2].AsInteger:=id;
      a.ExecSql;
  end;
  guncel:=0;
  durum:='H';
end;
procedure TForm1.carihareketAfterDelete(DataSet: TDataSet);
begin
carihareket.Refresh;
end;
end.
Kullanıcı avatarı
ender_arslanturk
Kıdemli Üye
Mesajlar: 709
Kayıt: 18 Şub 2005 03:38
Konum: İstanbul

Mesaj gönderen ender_arslanturk »

Anladığım kadarı ile 2 den fazla query kullanmışsın peki bu diyelimki kayıtlı bulunan bir cari kartı açtığın zaman performans açısından bir düşüşe sebep olmazmı ? ben kendim 1 query ile yaptım ama olay oncalcfields olduğu için aşağı yukarı hareket ettiğinde yani gözükmeyen kayıtlar yeniden görüldüğünde sayı farklılık göstermekte. :D

Mesela Benim Yaptığım :) Şu Şekilde İdi....



unit Deneme_Bakiye_Pas;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, Grids, DBGrids, adsdata, adsfunc, adstable,
adscnnct;

type
TForm1 = class(TForm)
AdsConnection1: TAdsConnection;
query1: TAdsQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
query1no: TFloatField;
query1borc: TFloatField;
query1alacak: TFloatField;
Button1: TButton;
query1kalan: TFloatField; // <--- New Fields
query1bakiye: TFloatField; // <--- New Fields
Label1: TLabel;
Edit1: TEdit;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure query1CalcFields(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
kalan:currency;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
kalan:=0;
query1.close;
query1.sql.clear;
query1.sql.add('select* from carihareket where no='+edit1.text);
query1.open;
end;
procedure TForm1.query1CalcFields(DataSet: TDataSet);
begin
query1kalan.value:=query1borc.value-query1alacak.value;
kalan:=kalan+query1kalan.value;
query1bakiye.value:=kalan;
end;
end.
[/img]
Cevapla