Kayıt Tarihi: 11.10.2012
Toplam 1 konu açtı.
Toplam 2 yorum yaptı.
Toplam
0
puanı bulunmakta.
Mevcut Office Sürümü:
Office 2010 TR,
Beğeniler: 0 / 0
öncelikle merhaba Muhasebe ile ilgili bir yazılım üzerinde çalışıyorum vb de
Yürüyen Bakiye ile ilgili birçok sorun ve birçok çözüm önerisi okudum ancak bu yorumların hemen hemen hepsinde,
bakiyeyi alırken başvurduğumuz benzersiz ID alanı oluyor. ancak muhasebenin işleyişinde neredeyse tüm raporlar tarih sırasına göre alınır. yani ID>=5 te bakiye ne kadardı değil. 05/05/2012 tarihinde bakiye ne kadardı diye sorgulanır.
bu noktada ID üzerinden işlem yapıldığında, eğer kullanıcı birkaç işlem sonra tarihi geriye dönük bir işlem girdiğinde, tarihi eski ama ID si yeni olduğundan sorunlar yaşıyoruz. örneğin;
ID TARİH BORÇ ALACAK BAKİYE
1 02.02.2012 100,00 0,00 100,00
6 04.04.2012 0,00 150,00 -50,00
3 02.05.2012 70,00 0,00 20,00
4 02.05.2012 80,00 0,00 100,00
2 06.06.2012 120,00 0,00 220,00
şeklinde bakiye verebilmeli, ID alanı kendiliğinden artan bir alan olduğundan bu alana müdahale etme şansım yok. ancak herhangi birşekilde kullanıcı eski tarihli bir işlem girdiğinde işler karışıyor
ID si 2 olan kaydın tarihi 06.06.2012 ancak ID si 6 olan kaydın tarihi 04.04.2012 olursa listeleme tarih sırasına göre yapıldığında bakiye alma konusunda sorun yaşanıyor. en kötü ihtimalle aynı gün içerisinde 2 kayıt olduğunda bakiye formulü bozuluyor. projemde takıldığım en büyük nokta bu.
bu konuda tek çözüm geçici tablo kullanımı yada yazarken vb içerisinde hesaplatmak gibi gözüküyor. ama geçici tablo kullanımı da çok hızlı bir çözüm olmuyor maalesef.
Şimdiden Teşekkürler,
Saygılar,
Kayıt Tarihi: 12.03.2008
Toplam 80 konu açtı.
Toplam 635 yorum yaptı.
Toplam
75
puanı bulunmakta.
Mevcut Office Sürümü:
Office 2016 TR,
Beğeniler: 1 / 4
(20-12-2012, 22:39)trkmml demiş ki: .
.
bu konuda tek çözüm geçici tablo kullanımı yada yazarken vb içerisinde hesaplatmak gibi gözüküyor. ama geçici tablo kullanımı da çok hızlı bir çözüm olmuyor maalesef.
Bence hiç öyle düşünmeyin. Bir veritabanı performansını en çok tasarım etkiler. Geçici tablo oldukça hızlıdır.
Bakınız burada running sum performansı bile birkaç yolla test edilmiş.
http://www.access-sql.com/Konu-SQL-Serve...yen-Bakiye
Ben de mizan için hazırlamıştım. Yaklaşık 1-2 sn. sürüyor. Aynı mizan crystal report ile 2-3 dk. arasındadır. Ayrıca uzun query yazmaktan korkmayın. Fikir vermesi Likom Gusto ERP için yazdığım mizan sorgum aşağıdadır. Kolay gelsin.
SQL SET NOCOUNT ON DECLARE @BASTAR SMALLDATETIME, @SONTAR SMALLDATETIME, @FLAGS SMALLINT, @KEBIR SMALLINT SET @BASTAR = '01.01.2012' SET @SONTAR = '30.11.2012' SET @FLAGS = 1 SET @KEBIR = 0 -- Varsa geçici tabloyu sil IF EXISTS(SELECT * FROM tempdb.dbo.sysobjects O WHERE O.xtype = 'U' AND O.id = OBJECT_ID(N'tempdb..#TMP')) BEGIN DROP TABLE #TMP END -- Yeni bir geçici tablo hazırla CREATE TABLE #TMP ( [HESAP KODU] VARCHAR(20), [HESAP ADI] VARCHAR(255), [BORÇ TOPLAM] DECIMAL(18,2), [ALACAK TOPLAM] DECIMAL(18,2), [BORÇ BAKİYE] AS CASE WHEN [BORÇ TOPLAM]-[ALACAK TOPLAM] > 0 THEN [BORÇ TOPLAM]-[ALACAK TOPLAM] END, [ALACAK BAKİYE] AS CASE WHEN [ALACAK TOPLAM]-[BORÇ TOPLAM] > 0 THEN [ALACAK TOPLAM]-[BORÇ TOPLAM] END ) -- Geçici tablo için index hazırla CREATE CLUSTERED INDEX IDX11 ON #TMP([HESAP KODU]) -- Alt hesapların Borç ve Alacak toplamlarını geçici tabloya aktar INSERT INTO #TMP ( [HESAP KODU], [HESAP ADI], [BORÇ TOPLAM], [ALACAK TOPLAM] ) SELECT D.sKod AS [HESAP KODU], D.sAd AS [HESAP ADI], CAST(SUM(D.[BORC]) AS DECIMAL(18,2)) AS [BORÇ TOPLAM] , CAST(SUM(D.[ALACAK]) AS DECIMAL(18,2)) AS [ALACAK TOPLAM] FROM ( SELECT A.sKod, A.sAd, CASE C.bBorcMu WHEN 'B' THEN C.ldTutar ELSE 0 END AS [BORC], CASE C.bBorcMu WHEN 'A' THEN C.ldTutar ELSE 0 END AS [ALACAK] FROM HesapKodu A INNER JOIN YevmiyeHareketi C ON (A.HesapKodu_rowid = C.pHesapKodu) INNER JOIN YevmiyeFisi B ON ((C.lFisNo = B.lFisNo) AND (C.dtTarih = B.dtTarih)) WHERE (B.dtTarih BETWEEN @BASTAR AND @SONTAR) AND (B.cCinsi @IN(0,1,2) ) ) AS D GROUP BY D.sKod, D.sAd -- Ana hesapların toplamlarını da geçici tablodan topla ve -- yine geçici tabloya ekle INSERT INTO #TMP ( [HESAP KODU], [HESAP ADI], [BORÇ TOPLAM], [ALACAK TOPLAM] ) SELECT E.sKod, E.sAd, SUM(F.[BORÇ TOPLAM]) AS [BORÇ TOPLAM], SUM(F.[ALACAK TOPLAM]) AS [ALACAK TOPLAM] FROM HesapKodu E INNER JOIN #TMP F ON (F.[HESAP KODU] LIKE E.sKod + '%') WHERE E.nChildCount > 0 GROUP BY E.sKod, E.sAd -- Son şeklini almış hale gelen geçici tabloyu listele IF (@FLAGS = 1) BEGIN IF (@KEBIR = 1) SELECT [HESAP KODU], [HESAP ADI], NULLIF([BORÇ TOPLAM], 0) AS [BORÇ TOPLAM], NULLIF([ALACAK TOPLAM], 0) AS [ALACAK TOPLAM], [BORÇ BAKİYE], [ALACAK BAKİYE] FROM #TMP WHERE (LEN([HESAP KODU]) = 3) ORDER BY [HESAP KODU] ELSE SELECT [HESAP KODU], [HESAP ADI], NULLIF([BORÇ TOPLAM], 0) AS [BORÇ TOPLAM], NULLIF([ALACAK TOPLAM], 0) AS [ALACAK TOPLAM], [BORÇ BAKİYE], [ALACAK BAKİYE] FROM #TMP ORDER BY [HESAP KODU] END ELSE BEGIN IF (@KEBIR = 1) SELECT [HESAP KODU], [HESAP ADI], NULLIF([BORÇ TOPLAM], 0) AS [BORÇ TOPLAM], NULLIF([ALACAK TOPLAM], 0) AS [ALACAK TOPLAM], [BORÇ BAKİYE], [ALACAK BAKİYE] FROM #TMP WHERE ([BORÇ TOPLAM] != [ALACAK TOPLAM] AND LEN([HESAP KODU]) = 3) ORDER BY [HESAP KODU] ELSE SELECT [HESAP KODU], [HESAP ADI], NULLIF([BORÇ TOPLAM], 0) AS [BORÇ TOPLAM], NULLIF([ALACAK TOPLAM], 0) AS [ALACAK TOPLAM], [BORÇ BAKİYE], [ALACAK BAKİYE] FROM #TMP WHERE ([BORÇ TOPLAM] != [ALACAK TOPLAM]) ORDER BY [HESAP KODU] END -- Geçici tabloyu artık sil DROP TABLE #TMP
Kayıt Tarihi: 11.10.2012
Toplam 1 konu açtı.
Toplam 2 yorum yaptı.
Toplam
0
puanı bulunmakta.
Mevcut Office Sürümü:
Office 2010 TR,
Beğeniler: 0 / 0
cevap için teşekkür ederim
aşağıdaki gibi bir yöntem ile sorunumu çözdüm.
SELECT [ID], [TARIH], [BORC], [ALACAK]
, Sum([BORC] - [ALACAK]) OVER (ORDER BY [TARIH], [ID]) AS [BAKIYE]
FROM DENEME
Kayıt Tarihi: 30.09.2015
Toplam 0 konu açtı.
Toplam 1 yorum yaptı.
Toplam
0
puanı bulunmakta.
Mevcut Office Sürümü:
Office 2013 EN,
Beğeniler: 0 / 0
SELECT [ID], [TARIH], [BORC], [ALACAK], Sum([BORC] - [ALACAK]) OVER (ORDER BY [TARIH], [ID]) AS [BAKIYE] FROM DENEME
SORGUSUNDA
ÖZDİZİMİ HATASI VERİYOR. SEBEBİNİ NEDİR ACABA.
TEŞEKKÜR EDERİM.
Kayıt Tarihi: 12.03.2008
Toplam 80 konu açtı.
Toplam 635 yorum yaptı.
Toplam
75
puanı bulunmakta.
Mevcut Office Sürümü:
Office 2016 TR,
Beğeniler: 1 / 4
"Over", sql server 2012 ve üzeri versiyonlarda eklenmiştir. Öncekilerde yalnız "partition" vardı.
|