OnCalcFields ile Yürüyen Bakiye Sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen esistem »

Tekrar selam,
Bu işi yapmanın en kolay kolay yolu firebird e geçmektir diye düşünüyorum :)
daha önce bu konuyu firebird de rdb$set_context ile 'USER_TRANSACTION' kullanarak bir
sonuca bağlamıştık ve kesin çözüm üretmiştik. Access, paradox gibi veritabanlarında çözümü
daha önce kendim şöyle bulmuştum ama biraz alengirli bir çözüm :) Kısaca anlatayım.

tablonuz alanlarını şu şekilde düzenleyin,
KOD, TARIH, ARTANKOD, BORC, ALACAK (TAHSILAT) vs.vs.
burada ARTANKOD bizim işimizi çözecek alandır,
ilk kaydı girdiğinizde (bu arada ARTANKOD alanınız kesinlikle ondalıklı
alan olmalıdır biz ondalık kısmınız 2 hane olarak düşünelim 3 veya 4
yapılırsa daha çok kayıt girilebilir) ARTANKOD alanınızı mesela 1,00 diye verin,
2. kayıt da 2,00 yapın bu ne demektir biz araya 1,01 - 1,02 - 1,03 -1,04 ....
şeklinde 99 adet daha kayıt ekleyebiliriz demek oluyor (buda yazacağımız sorguda
benzersiz bir ARTANKOD alanımız olmasını sağlıyacak bize). mesela kayıtlarımız şöyle olsun;

KOD - TARIH - ARTANKOD- BORC - ALACAK
1 - 10.02.2016 - 1,00 - 100 - 0
2 - 15.02.2016 - 2,00 - 0 - 100

eğer 15.02.2016 tarihinden sonra mesela 12.02.2016 tarihinede bir kayıt eklemek istedik,
o zaman yeni kaydımızı şu şekilde eklemeliyiz ki ARTANKOD alanımız sıralı gitsin.

3 - 12.02.2016 - 1,01 - 150 - 0

peki bunu nasıl yaparız ? tabiki before_post olayında, ARTANKOD alanımızı yeni gireceğimiz
tarihten küçük yada eşit tarihteki değerini 0,01 arttırarak;

Kod: Tümünü seç

QueryArtanKodVer ('SELECT MAX(ARTANKOD) AS ARTANKOD FROM CARI_ISLEM WHERE TARIH<=:TARIH')
yukarıdaki sorgu bize 10.02.2016 tarihindeki 1,00 değerini verecektir. Dolayısı ile yeni
kayıttaki artan kodumuz QueryArtanKodVerARTANKOD.value+0,01 olmuş olacaktır. Yeni kaydımızı
bu şekilde girdikten sonra yürüyen bakiye sorgumuz da aşağıdaki gibi olursa problemsiz bir
yürüyen bakiye sorgumuz olmuş olacaktır.

Kod: Tümünü seç

SELECT C.TARIH, C.BORC, C.ALACAK,
(SELECT 
SUM(BORC)-SUM(ALACAK) FROM CARI_ISLEM B 
WHERE B.ARTANKOD<=C.ARTANKOD AND CARIKODU=:CKOD) 
AS BAKIYE 
FROM CARI_ISLEM C
WHERE CARIKODU=:CKOD ORDER BY ARTANKOD // burada artankod alanımız tarihleride otomatik sıraya dizdiği için sorun kalmaz
biraz karmaşık gelebilir ama bu işin çözümü sanırım bu olur.
Not: Bu arada BORC ve ALACAK alanlarınız kesinlikle NULL değer içermemelidir.
2. Edit : bu arada eğer yeni kaydınızın tarihi önceki kayıtlarınızdaki tarihlerden büyük veya eşitse ARTANKOD alanınızı 1,00 arttırmanız gerekir ki daha sonra arasına kayıt sokmamıza imkan versin, birer birer arttırmak yerine 2 şer yada 3 er 3 er arttırmak araya daha fazla girmenizi sağlıyacaktır. artık onuda siz ayarlarsınız.
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

esistem yardımınız için teşekkür ediyorum ne demek istediğinizi çok iyi anladım. ben artankod yerine işlemler tablomda otomatik artan Sirano alanım olduğu için burdan faydalanıyorum. Tablomu öncelikle tarihe göre tarihi aynı olanları Sirano alanına göre sıralattırıyorum burda hiç bir sorun yok. Tablo sonu kontrol ile yürüyen bakiye de hesaplanıyor. Dün akşam çözümü tarih kontrolü ile yapmakta buldum şöyleki müşteriler genelde eski bir tarih girmiyor. yani işlemler sırasıyla girildiği için tarihler de sırasına göre gidiyor çok nadirde olsa eksi tarihli işlem giren var. işlem girilmesi esnasına max(tarih) ile tablodaki son tarihten eski mi yoksa eşit veya yenimi olduğunu kontrol ediyorum. eski ise olması gereken sıraya koyup bakiye hesaplatması yaptırıyorum. yeni veya eşitse sıradan son bakiyenin üstüne borç ise topluyor tahsilatsa çıkarıyor buda programın baştan sona tarama yapmasını engelliyor. Şimdilik en sağlam ve en kolay yöntem bu oldu.

Sorgu ile yapmaya kalktığımda sizin sorguya çok yakın bazı hatalı toplamlar aldım güvenemedim. Ayrıca Tablomu Query ye çevirmem gerekti diğer raporlarda sıkıntı çıkardı. Sorgu ile yapmaktan vazgeçtim. Bu arada anladım ki oncalcfields olayı sadece aynı satır üzerinde hesaplamaları yaptırmaya yönelik bir event. Yinede fikirlerinizle destek olduğunuz için teşekkür ederim.
Cevapla