Bakiye Hesabı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sinancaylak
Üye
Mesajlar: 151
Kayıt: 30 Oca 2004 09:16
Konum: Manisa

Bakiye Hesabı

Mesaj gönderen sinancaylak »

Merhaba Öncelikle soracağım konu ile ilgili formu tamamen taramış durumdayım ama çıkan sonuçlardan hiçbirşey anlayamadım. Sorunum ise 1 Adet Cari hareket tablom var burada CRID,ACIKLAMA,GIREN,CIKAN,BAKIYE Alanlarım var aşağıdaki gibi bir işlemi nasıl veri tabanına yazdırabilir ve hesaplatabilirim. mesela önceden girilmiş olan haraketin tutarı değişirse bu hesabı baştan nasıl düzenletebilirim. Veritabanı olarak FireBird Kullanıyorum. Şimdiden Yardımlarınız için Teşekkür ederim.

CRID ACIKLAMA GIREN CIKAN BAKIYE
------ --------------------- ---------- ---------- -----------
1 Alış Faturası 10.00 - 0 - 10.00
1 Satış Faturası 0 - 10.00 - 0

NOT :Bu Konu Çok Önemli Tam 15 gündür uğraşıyorum ama hala çözüme ulaşmış değilim. :(
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

hareket tablonuzda CDID no su 1 olan iki alan var. sanırım pk alan yok aynı sayıyı almışlar veya sürçü lisan. ustalarım genelde bu işlemleri sp ile yapıyorlar. burada giren ve çıkanı sp ile yazdırabilir bakiye alanını ise calculated alan ile hesaplatıp gösterebilirsin. yok bu sayfaya manuel kullanıcı giriyorsa yine bakiye alanını calculated olarak ayarlayıp hesaplatırsan geriye dönük giriş veya çıkış ücretinde değişiklik yaparsa toplamlarda teğişik otomatik olacaktır.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Cari hesap icin kurdugunuz yapının tam olarak nasıl olduğunu bilemiyorum.. Fakat viewtopic.php?t=644&highlight=trigger burada anlatılan şekilde bir yapınız var ise veya yapınızı boyle bir yapıya donusturme imkaniniz varsa ki 15 gun surmeyecegi kesin... :) Bu ornekte daha once girilmis butun verilern degismesi durumunda problemsiz bir sekilde bakiye degerleriniz degismekte....

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
sinancaylak
Üye
Mesajlar: 151
Kayıt: 30 Oca 2004 09:16
Konum: Manisa

Mesaj gönderen sinancaylak »

Fahrettin abi gösterdiğin yol bana görede çok sağlam bir yol ama ben SP ve Triggerler Konusunda pek bir bilgi sahibi değilim. ondan dolayı bu işlemi delphi içinde kodlayarak yapmak benim için daha anlaşılır ve iyi olacaktır bu arada diğer arkadaşımın dediği şekilde BAKİYE olarak Calculated Field Tanımladım ama istediğim işlem ondada olmadı. Benim Tam olarak anlatmak istediğim bir önceki bakiye değerini alıp yeni bakiye hanesinin üzerine toplatarak veri tabanına yazdırmak istiyorum.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

bence gözünde fazla büyütme.... ilgili makale ve aynı makalenin seminerine 1 gun ayırman yeterli.... 1 gunde de işi yaparsın... 2 gunde de hataları çözersin... biz de buradan yardım ederiz....
tecrubeni bilmediğim icin verdigim surleri de fazla fazla atarak soyluyorum... Belki 1 gunde de halledilebilir...

İhtiyacını anladığım kadarı ile bence olayın Delphi tarafında sağlıklı bir halledilme yolu yok.... Yani yanlış temel üzerine binaya devam etmeye gerek yok derim....

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Geliştirmeye açık SP yi yazıyorum;

Kod: Tümünü seç

CREATE PROCEDURE SP_CARI_HAREKET_DETAY_DOKUMU(
    CARI_ID_ INTEGER,
    ILK_TARIH_ DATE,
    SON_TARIH_ DATE)
RETURNS (
    CARI_ID INTEGER,
    ACIKLAMA VARCHAR(30),
    GIREN DOUBLE PRECISION,
    CIKAN DOUBLE PRECISION,
    BAKIYE DOUBLE PRECISION)
AS
DECLARE DLR_BAKIYE DOUBLE PRECISION;
BEGIN
  DLR_BAKIYE = 0.0;
  FOR
    SELECT CRID, GIREN, CIKAN 
    FROM CARI_HAREKET
    WHERE HAREKET_TARIHI BETWEEN :ILK_TARIH_ AND :SON_TARIH_
    INTO :CARI_ID, :GIREN, :CIKAN
    DO BEGIN
      IF (GIREN = 0) THEN ACIKLAMA = 'Satış Faturası';
      IF (CIKAN = 0) THEN ACIKLAMA = 'Alış Faturası';
      DLR_BAKIYE = DLR_BAKIYE + (GIREN - CIKAN);
      BAKIYE = DLR_BAKIYE;
      SUSPEND;
    END
END
Burada önemli bir nokta daha var. O da ilk tarihten önceki hareketlerin de taranıp oradan gelen bakiyenin üzerinden işlemlerin yapılması gerekir. Ayrıca son tarihten sonra da hareket olabileceğinden cari kartın tüm kayıtları gözönüne alınarak son bakiyesinin de ayrıca hesaplanması gerekir :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
berken
Üye
Mesajlar: 208
Kayıt: 07 Ara 2005 04:27
Konum: Van

Mesaj gönderen berken »

arkadasın soylediğine benzer bir sorunum var . aynı da diyebilirim..
fazla karışık değil.. benim fisler diye bir tablom var..
tarih, hesapkodu, aciklama, borc,alacak gibi alanlar var
cxdbgrid e bunları listeliyorum.. gridde iki field daha tanımlamak istiyorum,, borç bakıye, alacak bakıye, en sağa onları atıyorum.. program yazan arkadasların çoğu boyle bir şey yapmıştır kanısındayım .. o alalanları nasıl doldurabilrim.. orneğin
borc alacak borc bakıye alacak bakıye
0,00 10,00 0,00 10,00
5,00 0,00 0,00 5,00
10,00 0,00 5,00 0,00
bor ve alacak alanları zaten veritabanından geliyor. sağdaki iki alanı nasıl şekildeki gibi doldurabilrim
iyi çalışmalar, saygılarımla..
İnsanca.... Pek insanca....
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Yukarıaki SP yi biraz daha geliştirerek çözebilirsin kanaatindeyim :wink:

Kod: Tümünü seç

CREATE PROCEDURE SP_CARI_HAREKET_DETAY_DOKUMU(
    CARI_ID_ INTEGER,
    ILK_TARIH_ DATE,
    SON_TARIH_ DATE)
RETURNS (
    CARI_ID INTEGER,
    BORC DOUBLE PRECISION,
    ALACAK DOUBLE PRECISION,
    BAKIYE DOUBLE PRECISION)
AS
DECLARE DLR_BAKIYE DOUBLE PRECISION;
DECLARE DLR_HAREKET_TARIHI DATE;
DECLARE DLR_SATIR INTEGER;
BEGIN
  DLR_SATIR = 0;
  DLR_BAKIYE = 0.0;
  FOR
    SELECT CRID, HAREKET_TARIHI, BORC, ALACAK
    FROM CARI_HAREKET
    WHERE HAREKET_TARIHI <= :SON_TARIH_
    INTO :CARI_ID, :DLR_HAREKET_TARIHI, :BORC, :ALACAK
    DO BEGIN
      DLR_BAKIYE = DLR_BAKIYE + (BORC - ALACAK);
      IF (DLR_HAREKET_TARIHI >= :ILK_TARIH_) THEN
      BEGIN
        DLR_SATIR = DLR_SATIR + 1;
        BAKIYE = DLR_BAKIYE;
        SUSPEND;  -- ilk tarihten önceki olan bakiyeyi hesaplamak için.
      END         -- bu kısım yeni aklıma geldi;)
    END      
  IF (DLR_SATIR = 0) THEN -- verilen aralıta kayıt yoksa bakiyeyi göstermek için.
  BEGIN
    BORC = 0.0;
    ALACAK = 0.0;
    BAKIYE = DLR_BAKIYE;
    SUSPEND;  
  END     
END
Bu SP yi ihtiyaçlarınıza göre geliştirmek mümkün :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
berken
Üye
Mesajlar: 208
Kayıt: 07 Ara 2005 04:27
Konum: Van

Mesaj gönderen berken »

ilginize çok teşekkur ederim .. ama bunu nasıl kullanacağımı bilmiyorum ... sp yanı..
İnsanca.... Pek insanca....
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

VT ye SP yi yazıp bir tablo gibi çağıracaksın :wink:
DataSet yada IBQuery nin SQL ini aşağıdaki gibi yazıp;

Kod: Tümünü seç

SELECT 
  CARI_ID, BORC DOUBLE, ALACAK, BAKIYE 
FROM 
  SP_CARI_HAREKET_DETAY_DOKUMU
Sonra parametreleri göndermen yeterli.

Kod: Tümünü seç

IBQuery.ParamByName('CARI_ID').AsInteger := ....
IBQuery.ParamByName('ILK_TARIH').AsDateTime := Ilk_Tarih;
IBQuery.ParamByName('SON_TARIH').AsDateTime := Son_Tarih;
IBQuery.Prepare;
IBQuery.Open;
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Daha fazlası için :ara bununl ilgili makale bölümünde makale olması gerekir.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
berken
Üye
Mesajlar: 208
Kayıt: 07 Ara 2005 04:27
Konum: Van

Mesaj gönderen berken »

arkadaslar hiçbiriniz yazmamış sanırım sp dediğiniz storageproc.. yanılıyor muyum ... neyse.. .galiba kodlradan iyisi yok.. kodlarla halletmeye calışalım
İnsanca.... Pek insanca....
smokie
Üye
Mesajlar: 72
Kayıt: 01 Tem 2007 10:26

Re:

Mesaj gönderen smokie »

rsimsek yazdı:Yukarıaki SP yi biraz daha geliştirerek çözebilirsin kanaatindeyim :wink:

Kod: Tümünü seç

CREATE PROCEDURE SP_CARI_HAREKET_DETAY_DOKUMU(
    CARI_ID_ INTEGER,
    ILK_TARIH_ DATE,
    SON_TARIH_ DATE)
RETURNS (
    CARI_ID INTEGER,
    BORC DOUBLE PRECISION,
    ALACAK DOUBLE PRECISION,
    BAKIYE DOUBLE PRECISION)
AS
DECLARE DLR_BAKIYE DOUBLE PRECISION;
DECLARE DLR_HAREKET_TARIHI DATE;
DECLARE DLR_SATIR INTEGER;
BEGIN
  DLR_SATIR = 0;
  DLR_BAKIYE = 0.0;
  FOR
    SELECT CRID, HAREKET_TARIHI, BORC, ALACAK
    FROM CARI_HAREKET
    WHERE HAREKET_TARIHI <= :SON_TARIH_
    INTO :CARI_ID, :DLR_HAREKET_TARIHI, :BORC, :ALACAK
    DO BEGIN
      DLR_BAKIYE = DLR_BAKIYE + (BORC - ALACAK);
      IF (DLR_HAREKET_TARIHI >= :ILK_TARIH_) THEN
      BEGIN
        DLR_SATIR = DLR_SATIR + 1;
        BAKIYE = DLR_BAKIYE;
        SUSPEND;  -- ilk tarihten önceki olan bakiyeyi hesaplamak için.
      END         -- bu kısım yeni aklıma geldi;)
    END      
  IF (DLR_SATIR = 0) THEN -- verilen aralıta kayıt yoksa bakiyeyi göstermek için.
  BEGIN
    BORC = 0.0;
    ALACAK = 0.0;
    BAKIYE = DLR_BAKIYE;
    SUSPEND;  
  END     
END
Bu SP yi ihtiyaçlarınıza göre geliştirmek mümkün :wink:

Bende neden olmuyor yapamıyorum anlayamadım.
CID, ILK_TARIH, SON_TARIH, BAKIYE tanımlı alanlarmı,
alan isimlerini verebilirmisiniz :(
Cevapla