Giriş yapmadınız.

#1 06.07.2019 10:29:03

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yürüyen bakiye - sayfalama sorunu

Merhaba ;

Ufak bir hesaplama sistemi yapıyorum. Firmanın cari borç, alacak ve kalan bakiyenin tutulduğu bir liste mevcut. Aşağıdaki örnekte görebilirsiniz.

Firma adı | Borç | Alacak | Bakiye
  XXX       |  100 |     0      |    100 (Borç)
  YYY       |    0   |   250    |    150 (Alacak)
  ZZZ       |  125 |     0      |     25 (Alacak)

Bu şekilde yaptım çalışıyor ancak, sayfalama yaptığımda sorun yaşıyorum. Bir sonraki sayfaya geçtiğimde önceki sayfadan bakiyeyi almıyor. Yani toplayarak gitmiyor. 2. sayfadaysam sadece 2. sayfadaki bakiyeleri topluyor. Sayfalama yapmadığım zaman sorun yok. Bunu nasıl yapabileceğim konusunda yardımcı olabilir misiniz ?

Listeleme yaptığım örnek kodlar şu şekilde;

$yuruyen_bakiye = 0;
@foreach(...)
$yuruyen_bakiye = $yuruyen_bakiye - $hareket->borc;
$yuruyen_bakiye = $yuruyen_bakiye + $hareket->alacak;;

{{ $yuruyen_bakiye >= 0 ? formatCurrency($yuruyen_bakiye) . ' (A)' : formatCurrency(abs($yuruyen_bakiye)) . ' (B)'  }}
@endforeach

Teşekkürler.

Çevrimdışı

#2 06.07.2019 12:20:40

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Yürüyen bakiye - sayfalama sorunu

appends ile parametre olarak ilgili sayfadaki bakiye toplamını eklemek işinizi görebilir.

https://laravel.com/docs/5.8/pagination … on-results

Çevrimdışı

#3 06.07.2019 12:28:11

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yanıt: Yürüyen bakiye - sayfalama sorunu

Örnekleyebilir misiniz ? Fazla detaylı bilgiye sahip değilim.

Teşekkür ederim.

Çevrimdışı

#4 06.07.2019 12:52:45

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Yürüyen bakiye - sayfalama sorunu

Listeleme işlemlerinde link() ile paginate eklerken aşağıdaki gibi ekleme yapabilirsiniz;

{{ $accounts->appends(['amount' => 50])->links() }}

Bu kullanım link yapısına parametre ekleyecektir. Doğal olarak parametreyi manuel olarak browserde değiştirmek de işlem sonucuna etki edebilecektir. Eğer kapalı sistem bir proje ise bunu kullanmak muhtemelen sorun çıkarmaz.
Fakat işinizi sağlama almak isterseniz session flash kullanabilirsiniz. Bir oturum boyunca session değerini tutar ve sonra silinir. Doğal olarak kullanıcı bu verinin üstünde değişiklik de yapamaz.

Çevrimdışı

#5 07.07.2019 09:28:46

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 378
Website

Yanıt: Yürüyen bakiye - sayfalama sorunu

Bu işi veri tabanı seviyesinde çözmeniz çoğu açıdan(Performans, Doğruluk vb.) daha sağlıklı olur. Birkaç örnek aşağıdadır;
https://stackoverflow.com/questions/282 … e-from-sum
https://dba.stackexchange.com/questions … pagination
https://www.codeproject.com/Questions/5 … pluscredit


Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#6 07.07.2019 19:33:06

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yanıt: Yürüyen bakiye - sayfalama sorunu

Şu şekilde bir kod çıktı ortaya ;

DB::table('table as a')
            ->select(DB::raw('a.id,a.title,a.in,a.out,(SUM(b.out)-SUM(b.in)) as balance'))
            ->join('table as b','b.id', '<=', 'a.id')
            ->groupBy('a.id')
            ->paginate(2);

Yukarıdaki kod sağlıklı çalışıyor ancak, performans ve doğruluk bakımından uygun mudur, bu konu hakkında yorum yapabilir misiniz ?

Teşekkür ederim.

Son düzenleyen grkn (07.07.2019 19:56:03)

Çevrimdışı

#7 07.07.2019 23:08:53

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,703
Website

Yanıt: Yürüyen bakiye - sayfalama sorunu

Kodunuzda bir sorun yok.

Çevrimdışı

#8 08.07.2019 09:24:09

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yanıt: Yürüyen bakiye - sayfalama sorunu

Teşekkürler.

Çevrimdışı

#9 08.07.2019 11:19:55

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 378
Website

Yanıt: Yürüyen bakiye - sayfalama sorunu

grkn yazdı:
DB::table('table as a')
            ->select(DB::raw('a.id,a.title,a.in,a.out,(SUM(b.out)-SUM(b.in)) as balance'))
            ->join('table as b','b.id', '<=', 'a.id')
            ->groupBy('a.id')
            ->paginate(2);

Bence, yazdığınız hali ile yapmak istediğiniz şey için yazılabilecek en mantıklı sql'lerden biri bu, bunun daha modern bir versiyonu da mysql 8 ile gelen OVER() methodu ile yazılabiliyor. Aynı method(over) Postgresql'de mevcut ama Mysql'e 8'de geldi.

select id, 
       "in", 
       "out", 
       sum("in") over (order by id) - sum("out") over (order by id) as balance
from data
order by id;

Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#10 09.07.2019 22:20:23

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yanıt: Yürüyen bakiye - sayfalama sorunu

Tekrar merhaba ;

Sayfalama sorununu çözdüm ancak başka bir sorunla karşılaştım. Örneklersem daha iyi anlaşılabilir.

Olması gereken :
Firma adı         | Borç | Alacak | Bakiye
  XXX(id:1)       |  100 |     0     |    100 (Borç)
  XXX(id:1)       |    0   |    50    |    50 (Borç)
  XXX(id:1)       |    0  |    125   |   75 (Alacak)
--------------------------------------------------------------------
  YYY(id:2)       |    0   |   250    |    250 (Alacak)
  YYY(id:2)       |  125 |     0      |    125 (Alacak)

Hata :
Firma adı         | Borç | Alacak | Bakiye
  XXX(id:1)       |  100 |     0     |    100 (Borç)
  XXX(id:1)       |    0   |    50    |    50 (Borç)
  XXX(id:1)       |    0  |    125   |   75 (Alacak)
--------------------------------------------------------------------
  YYY(id:2)       |    0   |   250    |    325 (Alacak) (XXX firmasının son bakiyesini toplayarak devam ediyor)
  YYY(id:2)       |  125 |     0      |    200 (Alacak)


Daha önce paylaştığım kodda bakiye toplayarak geliyor ancak, firmalar ait id bilgilerini ayırmıyor. Yani firma id1 son bakiye ne ise onu alıp firma id2 ile toplayarak devam ediyor. Firma bazında ayırmak için nasıl bir düzenleme yapmam gerektiğini araştırdım ancak çözemedim.

Teşekkürler.

Çevrimdışı

#11 09.07.2019 23:00:36

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 378
Website

Yanıt: Yürüyen bakiye - sayfalama sorunu

Sql'inize aşağıdaki gibi düzenlerseniz çalışacaktır. (T1.company_id = T2.company_id ).

SELECT T1.id,
	T1.company_id,
	T1.`in`, 
	T1.`out`, 
	(SUM(T2.out)-SUM(T2.in)) as balance
FROM transactions AS T1 JOIN transactions AS T2 ON T2.id <= T1.id AND T1.company_id = T2.company_id 
GROUP BY T1.id

Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#12 10.07.2019 14:58:38

grkn
Üye
Yer: İSTANBUL
Kayıtlı: 06.07.2019
Mesajlar: 6

Yanıt: Yürüyen bakiye - sayfalama sorunu

@evrend verdiğiniz örneğe göre aşağıdaki kodu yazdım ve şimdilik düzgün bir şekilde çalışıyor.

@evrend ve @mgsmus yardımlarınız için teşekkür ederim.

DB::select('Select a.*, (SUM(b.out)-SUM(b.in)) as balanca from transactions as a join transactions as b on b.id <= a.id and a.company_id = b.company_id where a.company_id = :company_id group by a.id',['company_id' => $id]);

Çevrimdışı

Forum alt kısmı