Kümülatif bakiye toplamı

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Kümülatif bakiye toplamı

Mesaj gönderen White Rose »

s.a.
arkadaşlar master-detay ilişkili müşteri cari hesaplarında bulunan;
hareket tablosunda, kümülatif bakiye toplamı aldırarak bunu Bakiye alanına yazdırmak için aşağıdaki kodu kullanıyorum. Delphi tarafında problem yok çalışıyor. Ancak bu kodu Stored Procedure kullanarak yapmak istiyorum, birçok deneme yaptım ama başaramadım, yardımcı olabilir misiniz. Yani bu kodu SP ye taşımak istiyorum. Teşekkür ederim.

Kod: Tümünü seç

Procedure Bakiye_Hesapla;
Begin
     Bakiye :=0;
     Mushar.First;
     While Not (Mushar.EOF) do begin
         Mushar.Edit;
         MusharMSH_BKY.Value:=(MusharMSH_TOP.Value-MusharMSH_ODM.Value)+Bakiye;
         Mushar.Post;
         Bakiye :=Bakiye+(MusharMSH_TOP.Value-MusharMSH_ODM.Value);
         Mushar.Next;
     End;
     If Mushar.State in [dsedit] Then Mushar.Post;
 end;
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

merhaba
Aşağıdaki örnek işine yarar sanırım. Tablolarının yapısını bilemiyorum.
Yazdığın kodlara bakarak örnek bir tablo çıkardım.
BAKIYE_HESAPLA sp'si aşağıdaki tabloya göre çalışıyor. Onun için kendi tablo yapına göre düzeltmen gerekir.

Kod: Tümünü seç

CREATE TABLE MSHTBL
(
    MSH_FISNO VARCHAR(10) NOT NULL,
    MSH_SIRA SMALLINT,
    MSH_TARIH TIMESTAMP,
    MSH_KOD VARCHAR(15),
    MSH_ACIKLAMA VARCHAR(50),
    MSH_ODM DOUBLE PRECISION,
    MSH_BKY DOUBLE PRECISION,
    MSH_TOP DOUBLE PRECISION
    PRIMARY KEY (MSH_FISNO,MSH_SIRA)
);

Kod: Tümünü seç

CREATE PROCEDURE BAKIYE_HESAPLA (VMSH_KOD VARCHAR(15))
RETURNS (VBAKIYE DOUBLE PRECISION)
AS
   declare variable VMSH_FISNO VARCHAR(10);
   declare variable VMSH_SIRA SMALLINT;
   declare variable VMSH_TOP DOUBLE PRECISION;
   declare variable VMSH_ODM DOUBLE PRECISION;
BEGIN
     VBAKIYE=0;
     FOR SELECT MSH_FISNO,MSH_SIRA,MSH_TOP,MSH_ODM FROM MSHTBL WHERE MSH_KOD=:VMSH_KOD
     ORDER BY MSH_TARIH,MSH_FISNO,MSH_SIRA FOR UPDATE WITH LOCK
     INTO :VMSH_FISNO,:VMSH_SIRA,:VMSH_TOP,:VMSH_ODM DO
     BEGIN
          UPDATE MSHTBL SET MSH_BKY=(:VMSH_TOP-:VMSH_ODM)+:VBAKIYE
          WHERE MSH_FISNO=:VMSH_FISNO AND MSH_SIRA=:VMSH_SIRA;
          VBAKIYE=:VBAKIYE+(:VMSH_TOP-:VMSH_ODM);
     END
     SUSPEND;
END
Örnek uygulama:

Kod: Tümünü seç

SELECT * FROM BAKIYE_HESAPLA('001')
Kolay gelsin.
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Çok teşekkür ediyorum,
Elinize ve beyninize sağlık
Cevapla