finans planlama tarihlere göre bakiye işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ertline
Üye
Mesajlar: 127
Kayıt: 23 Nis 2005 08:15
Konum: Bartın
İletişim:

finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertline » 05 Kas 2017 10:25

Merhaba arkadaşlar

finans takip programı hazırlıyorum. Programın yapısını şu şekilde hazırladım;

2 tablo var, finans_master ve finans_detail olarak

finans_master tablosunda kno,tarih,borc_top,alacak_top,bakiye alanları
finans_detail tablosunda kno,dno,aciklama,tutar alanları var

plan olarak öncelikle master tabloya 30 günlük tarihleri ekliyorum. örneğin( 01.11.2017-30.11.2017 arası)

finans planlaması yapılırken, örneğin 01.11.2017 tarihinde 1000 TL ve 2000TL tahsil planı işlendi, 01.11.2017 tarihinin durumu
tarih borç toplam alacak toplam bakiye
01.11.2017 3000 3000

oldu,

sonra 03.11.2017 tarihine ödeme planı 1000 TL girildi,

10.11.2017 tarinine 5000 TL tahsil ve 750TL ödeme planı girildi.
30.11.2017 tarhine de 3000 TL ödeme planı girildi.

toblonun şu şekilde olması gerek

tarih borç toplam alacak toplam bakiye
01.11.2017 3000 3000
02.11.2017 0 0 3000
03.11.2017 1000 2000
04.11.2017 0 2000
05.11.2017 0 2000
06.11.2017 0 2000
07.11.2017 0 2000
...
...
10.11.2017 5000 750 6250
11.11.2017 0 0 6250
12.11.2017 0 0 6250
13.11.2017 0 0 6250
...
...
30.11.2017 3000 3250

şeklinde bir yapı olması gerek. burada tarih bazında toplamları ve kalan bakiyeleri alıyorum ama şöyle bir durum var yukarıdaki plan bu şekildeyken örneğin 05.11.2017 tarihine 1000 TL tahsil girilirse 05.11.2017 tarihinden sonraki tüm tarih kayıtlarının bakiyelerinde düzeltme yapması gerekiyor.
bu işlemi nasıl yapabilirim.

bu şekilde çalışma yapan varsa yardım ve fikirlerinizi bekliyorum.
"Bilginin Doruğuna Hep Birlikte..."

ertank
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertank » 06 Kas 2017 01:31

Merhaba,

Kullandığınız Delphi sürümünü bildirmemişsiniz.
Kullandığınız database sistemini ve sürümünü bildirmemişsiniz.

Uygulama kısıtları bilinmemekle beraber sadece aylık güncellemeler olacak ise (bir sonraki ay başlangıcı devir olarak açılış kaydı girilecek ise);
1- Stored procedure içinde güncellemelerinizi yapabilirsiniz. Database sisteminin desteklemesi ve bu sisteme özel yazılması gerekir.
2- Uygulama içinde sonraki günlerin bakiyelerini kod yazarak kendiniz güncelleyebilirsiniz. Sistemi çok anlamamış olmakla beraber aşağıdaki gibi bir prosedür işinizi görebilir. Test edilmemiştir. Kodun ilgili bölümlerini kendi kullandığınız Query bileşenine uyarlamanız gerekecektir.

Kod: Tümünü seç

procedure UpdateTotals(const KNo: string; const LastDateModified: TDateTime; const NewAmount: Double);
var
  Query: TUniQuery;
begin
  Query := TUniQuery.Create(nil);
  try
    Query.Connection := DataModule.UniConnection1;
    Query.SQL.Text := 'finans_master set bakiye = :bakiye where kno = :kno and tarih > :tarih';
    Query.ParamByName('kno').AsString := KNo;
    Query.ParamByName('bakiye').AsFloat := NewAmount;
    Query.ParamByName('tarih').AsDateTime := LastDateModified;
    Query.ExecSQL();
  finally
    Query.Free();
  end;
end;
Her bir araya veri giriş işleminden sonra olması gereken bakiye rakamını hesaplayıp prosedürü aşağıdaki gibi çağırabilirsiniz.

Kod: Tümünü seç

  UpdateTotals(KNo, IlgiliTarih, YeniBakiye);
Prosedürü çalıştırdıktan sonra ekranda gösterdiğiniz veriler var ise bunların yeni bilgileri göstermesi için Query.Refresh() gibi bir komut çalıştırmanız gerekecektir.

Örnek bazı varsayımlar üzerine verilmiştir.
- İlk ve en önemli varsayım Kasım ayı içinde iken Ekim ayı verileri güncellemesi olmayacağı şeklinde. Aksi takdirde Ekim, Kasım aylarının ikis birden güncellenmiş olur. Bu bir hata mı yoksa olması gereken birşey mi? Bunun cevabını verebilecek kişi sizsiniz.
- KNo açılımını bilmemekle birlikte Kredi Numarası gibi düşünülerek değişikliklerin sadece tek bir kredi numarası üzerinden yapılacağı varsayılmıştır.

ertline
Üye
Mesajlar: 127
Kayıt: 23 Nis 2005 08:15
Konum: Bartın
İletişim:

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertline » 06 Kas 2017 08:03

merhaba ertan hocam

delphi 7 ve firebird veritabanını kullanıyorum.

kno primary key alan ve kayıt numarasını tutuyor. detail tablodaki Dno da foreing key olarak kullanıyorum.

program finans planlama şeklinde olacağı için öncelikle bir devir rakamı girilecek ve bu devir bakiyesi kaydı açılan tarihlerin hepsine bakiye olarak atılacak, sonra hangi tarihe bir tahsilat yada ödeme kaydı girlirse girilen tarihten itibaren son tarihe kadar(son kayda kadar) bakiyeleri artırması gerek.

bu işlem repeat until ile yapılabilir ama kayıt sayısı artınca sıkıntı çıkarır diye düşünüyorum.
"Bilginin Doruğuna Hep Birlikte..."

ertank
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertank » 06 Kas 2017 10:13

Son bilgilerden anladığım kadarıyla siz işlemleri (bakiye güncelleme) detay tabloda yapacaksınız. Bu durumda örnek kod içindeki SQL komutunu detay tablo adına çevirmeniz yeterli olacaktır.

Örnek kod incelerseniz ara tarihe bakiye girildiği zaman güncelleme işlemini bahsettiğiniz gibi repeat..until gibi bir döngü kullanmıyor. Direk olarak database sisteminin gerekli güncellemeleri yapmasını sağlıyor.

Ancak ilk kayıt açma zamanında bunu yapmanın çok farklı bir yolu aklıma gelmiyor. O esnada bir döngü içinde kaç günlük/aylık kayıt oluşturulacak ise kayıt ekleme şeklinde yapılabilir. Bu noktada performans artışını arttırmak için "insert into finans_detay()..." şeklinde bir SQL komutu çalıştırarak açılması gereken ilk tarihleri açıp ardından ekranda gösterebilirsiniz. Ekranda gözüktüğü esnada query içine kayıt girmeniz daha yavaş olabilir.

Bu arada, örnek kodu kendi kullanım ihtiyacınıza göre ilk açılış işlemleri için de kullanabilirsiniz. Örneğin 1.11.2017 tarihi itibari ile 30 günlük yeni kayıt oluşturdunuz diye düşünün (bir yukarıdaki paragrafta anlatıldığı gibi) ardından UpdateTotals() prosedürünü 31.10.2017 tarihini parametre göndererek alıştırır iseniz bütün kayıtlara açılış bakiyesini güncelleyecektir.

ertline
Üye
Mesajlar: 127
Kayıt: 23 Nis 2005 08:15
Konum: Bartın
İletişim:

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertline » 14 Kas 2017 08:28

Aşağıdaki kodlarla döngü ile istedğim işlemi yaptım

bu işlemi sql ile nasıl yapabilirim.

kodlar şu şekilde


var
borc_top,alacak_top,onceki_gun_bakiye,onceki_gun_bakiye1,kayit_no:real;
begin

//başlangıç

if radiobutton1.Checked then begin


form1.IBDataSet2.edit;
form1.IBDataSet2ISLEM_TURU.AsString:='TAHSILAT';
form1.IBDataSet2BORC.AsFloat:=form1.IBDataSet2TL_TUTAR.AsFloat;
form1.IBDataSet2.Post;

end else begin


form1.IBDataSet2.edit;
form1.IBDataSet2ISLEM_TURU.AsString:='ODEME';
form1.IBDataSet2ALACAK.AsFloat:=form1.IBDataSet2TL_TUTAR.AsFloat;
form1.IBDataSet2.Post;


end;

borc_top:=0;
alacak_top:=0;
onceki_gun_bakiye:=0;


form1.finans_sum.Close;
form1.finans_sum.UnPrepare;
form1.finans_sum.SQL.Clear;
form1.finans_sum.SQL.Add('select SUM(BORC),SUM(ALACAK) from FINANS_DETAIL where dno=:kno');
form1.finans_sum.Prepare;
form1.finans_sum.Open;

borc_top:=form1.finans_sum.fields[0].AsFloat;
alacak_top:=form1.finans_sum.fields[1].AsFloat;



form1.IBQuery3.Close;
form1.IBQuery3.UnPrepare;
form1.IBQuery3.SQL.Clear;
form1.IBQuery3.SQL.Add('select *from FINANS_MASTER');
form1.IBQuery3.Prepare;
form1.IBQuery3.Open;

if form1.IBQuery3.Locate('KNO',form1.IBDataSet1KNO.AsFloat,[])=true then begin
//form1.IBQuery3.Prior;
//showmessage(floattostr(form1.IBQuery3KNO.asfloat));
end;

onceki_gun_bakiye:=form1.IBQuery3BAKIYE.AsFloat;

form1.ibdataset1.Edit;
form1.ibdataset1.FieldByName('BORC_TOP').AsFloat:=borc_top;
form1.ibdataset1.FieldByName('ALACAK_TOP').AsFloat:=alacak_top;
form1.ibdataset1.FieldByName('BAKIYE').AsFloat:=borc_top-alacak_top;
form1.ibdataset1.FieldByName('ONCEKI_GUN_BAKIYE').AsFloat:=form1.ibdataset1.FieldByName('BAKIYE').AsFloat;
form1.ibdataset1.Post;
form1.finans_sum.Close;



kayit_no:=form1.IBDataSet1KNO.AsFloat;



form1.IBDataSet1.Next;

repeat

form1.IBQuery3.Close;
form1.IBQuery3.UnPrepare;
form1.IBQuery3.SQL.Clear;
form1.IBQuery3.SQL.Add('select *from FINANS_MASTER');
form1.IBQuery3.Prepare;
form1.IBQuery3.Open;



if form1.IBQuery3.Locate('KNO',form1.IBDataSet1KNO.AsFloat,[])=true then begin
form1.IBQuery3.Prior;

//showmessage(floattostr(form1.IBQuery3KNO.asfloat));
end;



onceki_gun_bakiye:=form1.IBQuery3BAKIYE.AsFloat;


form1.IBDataSet1.Edit;

form1.IBDataSet1BAKIYE.AsFloat:=((form1.IBDataSet1BORC_TOP.AsFloat+onceki_gun_bakiye)-form1.IBDataSet1ALACAK_TOP.AsFloat);
form1.ibdataset1.FieldByName('ONCEKI_GUN_BAKIYE').AsFloat:=onceki_gun_bakiye;
form1.IBDataSet1.post;
form1.IBDataSet1.Next;

until(form1.IBDataSet1.Eof);


if form1.IBDataSet1.Locate('KNO',kayit_no,[])=true then begin
end;





//bitiş
"Bilginin Doruğuna Hep Birlikte..."

ertank
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen ertank » 15 Kas 2017 10:23

Merhaba,

Bu kodlar yardımı ile yapılan işlemi SQL koduna çevirmek mümkün değil. İlgili IBDataSet2, IBDataSet1, IBQuery3, finans_sum bileşenlerinin hangi tabloları kullandığını, bu tabloların yapılarını vs. bilmiyoruz. Ancak anlayabildiğim kadarıyla yapmak istediğinizi bir "database prosedure" ile yapabilirsiniz. Yani yazdıklarınıza benzer kodları Firebird database içinde bir prosedür içine kaydetmelisiniz.

Firebird içinde stored procedure oluşturma ile ilgili aşağıdaki bağlantıları inceleyebilirsiniz.
https://firebirdsql.org/refdocs/langref ... edure.html
https://firebirdsql.org/refdocs/langref ... -proc.html
https://www.youtube.com/watch?v=s2fwNPfp5xI
https://www.firebirdnews.org/docs/fb2min_tk.html

erdogan_ozkaya
Üye
Mesajlar: 799
Kayıt: 03 Eki 2007 01:00

Re: finans planlama tarihlere göre bakiye işlemi

Mesaj gönderen erdogan_ozkaya » 21 Kas 2017 05:32

Sanırım yürüyen bakiye istiyorsunuz ?

Cevapla