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.
finans planlama tarihlere göre bakiye işlemi
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
finans planlama tarihlere göre bakiye işlemi
"Bilginin Doruğuna Hep Birlikte..."
Re: finans planlama tarihlere göre bakiye işlemi
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.
Her bir araya veri giriş işleminden sonra olması gereken bakiye rakamını hesaplayıp prosedürü aşağıdaki gibi çağırabilirsiniz.
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.
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;
Kod: Tümünü seç
UpdateTotals(KNo, IlgiliTarih, YeniBakiye);
Ö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.
Re: finans planlama tarihlere göre bakiye işlemi
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.
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..."
Re: finans planlama tarihlere göre bakiye işlemi
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.
Ö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.
Re: finans planlama tarihlere göre bakiye işlemi
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ş
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..."
Re: finans planlama tarihlere göre bakiye işlemi
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
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
-
- Üye
- Mesajlar: 839
- Kayıt: 03 Eki 2007 02:00
Re: finans planlama tarihlere göre bakiye işlemi
Sanırım yürüyen bakiye istiyorsunuz ?