Blog / SQL & Raporlama
SQL & Raporlama
Cari Hesap Bakiye Ortalama Vade Sorgusu

Mikro v16 programlarında, cari hesap açık hesap bakiye ortalama vade bilgilerinin rapor olarak alınabilmesi için kod ve kullanım örneğini aşağıda bulabilirsiniz.
Sorgu:
CREATE FUNCTION [dbo].[fn_Zkd_Cari_Ortalama_Vade]
(
@CariKodu NVARCHAR (25)
)
RETURNS DATETIME
AS
BEGIN
DECLARE @BakiyeIzleme FLOAT,
@Id UNIQUEIDENTIFIER,
@Vade DATETIME,
@ReferansTarih DATETIME,
@OrtalamaVade DATETIME,
@EvrakTutar FLOAT,
@BakiyeyeKonuTutar FLOAT
SET @ReferansTarih=dbo.fn_DatePart(GETDATE())
DECLARE @BakiyeKonuKayitlar TABLE
(
RecNo UNIQUEIDENTIFIER,
VadeTarihi DATETIME,
BakiyeyeKonuTutar FLOAT,
GunFarki INT
)
DECLARE @CariHareketler TABLE
(
cha_Guid UNIQUEIDENTIFIER,
cha_cinsi TINYINT,
cha_evrak_tip TINYINT,
cha_tarihi DATETIME,
CHA_VADE_TARIHI DATETIME,
MEBLAG_SIGN FLOAT,
TUTAR FLOAT,
CHA_KAPANAN_MEBLAG FLOAT
)
INSERT INTO @CariHareketler
SELECT TOP 100 PERCENT
cha_Guid,
cha_cinsi,
cha_evrak_tip,
cha_tarihi,
CHA_VADE_TARIHI,
CASE WHEN CHA_CARI_BORC_ALACAK_TIP=0 THEN 1.0 ELSE -1.0 END AS MEBLAG_SIGN,
CHA_CARI_MEBLAG_ANA AS TUTAR,
CAST(0.0 AS FLOAT) CHA_KAPANAN_MEBLAG
FROM dbo.CARI_HESAP_HAREKETLERI_VIEW_WITH_INDEX_02 WITH (NOLOCK)
WHERE (cha_cari_cins=0) AND
(cha_kod=@CariKodu)
ORDER BY cha_kod
SELECT @BakiyeIzleme=SUM(TUTAR*MEBLAG_SIGN) FROM @CariHareketler
IF @BakiyeIzleme IS NULL SET @BakiyeIzleme=0.0
IF ABS(@BakiyeIzleme)<=0
RETURN NULL
DECLARE CariHareketlerCursor CURSOR LOCAL READ_ONLY FAST_FORWARD FOR
SELECT TOP 100 PERCENT
cha_Guid,
(TUTAR-CHA_KAPANAN_MEBLAG)*MEBLAG_SIGN,
CHA_VADE_TARIHI
FROM @CariHareketler
WHERE
((@BakiyeIzleme>0 AND MEBLAG_SIGN>0) OR
(@BakiyeIzleme<0 AND MEBLAG_SIGN<0)) AND
TUTAR>CHA_KAPANAN_MEBLAG
ORDER BY CASE WHEN cha_evrak_tip IN (59,46,47) OR cha_cinsi IN (11,16) THEN 1 ELSE 0 END,
cha_tarihi DESC,
CHA_VADE_TARIHI DESC
OPEN CariHareketlerCursor
FETCH NEXT FROM CariHareketlerCursor INTO @Id, @EvrakTutar, @Vade
WHILE @@FETCH_STATUS = 0 AND ABS(@BakiyeIzleme)>1
BEGIN
IF @BakiyeIzleme>0
SET @BakiyeyeKonuTutar = dbo.fn_MIN(@BakiyeIzleme,@EvrakTutar)
ELSE SET @BakiyeyeKonuTutar = dbo.fn_MAX(@BakiyeIzleme,@EvrakTutar)
SET @BakiyeIzleme = @BakiyeIzleme - @BakiyeyeKonuTutar
INSERT INTO @BakiyeKonuKayitlar
VALUES (@Id,@Vade,@BakiyeyeKonuTutar,dbo.fn_gunfarkibul(@ReferansTarih,@Vade))
FETCH NEXT FROM CariHareketlerCursor INTO @Id, @EvrakTutar, @Vade
END
CLOSE CariHareketlerCursor
DEALLOCATE CariHareketlerCursor
SELECT TOP 100 PERCENT
@OrtalamaVade=CASE
WHEN SUM(BakiyeyeKonuTutar)<>0 THEN DATEADD(DAY,CAST(CAST(SUM(BakiyeyeKonuTutar*GunFarki) / SUM(BakiyeyeKonuTutar) AS DECIMAL) AS INT), @ReferansTarih)
ELSE @ReferansTarih
END
FROM @BakiyeKonuKayitlar
RETURN @OrtalamaVade
END
Örnek kullanım
SELECT TOP 100 PERCENT
cari_kod AS [CARİ KODU],
cari_unvan1 AS [ÜNVANI],
dbo.fn_CariHesapBakiye('',0,cari_kod,N'',N'',NULL,0,0,0,0,0) AS [BAKİYE],
dbo.fn_Zkd_Cari_Ortalama_Vade(cari_kod) AS [ORTALAMA VADE]
FROM CARI_HESAPLAR WITH (NOLOCK)
ORDER BY cari_kod
Rapor Görüntüsü:
Bu konuda bir sorunuz olursa bize yazabilirsiniz.