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.

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
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
Kod: Tümünü seç
SELECT
CARI_ID, BORC DOUBLE, ALACAK, BAKIYE
FROM
SP_CARI_HAREKET_DETAY_DOKUMU
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;
rsimsek yazdı:Yukarıaki SP yi biraz daha geliştirerek çözebilirsin kanaatindeyim
Bu SP yi ihtiyaçlarınıza göre geliştirmek mümkünKod: 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