Vypočítanie celkovej sumy v DB pomocou nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
SontoEremo
Člen | 341
+
0
-

Zdravím…
Ako sa v nette vypočíta suma ktorá je uložená v DB
suma:
12,80
8,20
5,40

$vsetko_spolu = $this->paymentsRepository->findAll()
							                     ->select('spolu')
							                     ->sum('spolu');
		$this->template->Spolu = $vsetko_spolu;

Skúšal som aj

$vsetko_spolu = $this->paymentsRepository->findAll()
							                     ->select('SUM(spolu) AS vysledok');
		$this->template->Spolu = $vsetko_spolu;

správny výsledok má byť 26,40 ale týmto je to len 25 neviem ako dostať z DB správy výpočet aj s desatinou…

Ďakujem.

F.Vesely
Člen | 369
+
0
-

A jakeho typu je sloupecek spolu v db?

MW
Člen | 626
+
0
-

Takto to používám, ale sloupec musí byt DECIMAL.
Pak to funguje.

SontoEremo
Člen | 341
+
0
-

F.Vesely napsal(a):

A jakeho typu je sloupecek spolu v db?

Varchar ale asi zle! :)

Editoval SontoEremo (21. 12. 2015 10:49)

CZechBoY
Člen | 3608
+
+1
-

Jak jako chceš sčítat řetězce?
Převeď to na int.

SontoEremo
Člen | 341
+
0
-

CZechBoY napsal(a):

Jak jako chceš sčítat řetězce?
Převeď to na int.

v administrácii vyplním políčko spolu napr. sumou 25,40 druhé zas 30,20 a trietie 10,80 atď..
potrebujem vytiahnuť tieto sumy z DB a následne spočítať tak aby bol výsledok 66,40 teda aj s desatinou čiarkou a výsledkom za ňou… momentálne mi to vyhadzuje 65 teda nepresný výsledok a bez desatini

Zuben45
Člen | 268
+
+3
-

SontoEremo napsal(a):

CZechBoY napsal(a):

Jak jako chceš sčítat řetězce?
Převeď to na int.

v administrácii vyplním políčko spolu napr. sumou 25,40 druhé zas 30,20 a trietie 10,80 atď..
potrebujem vytiahnuť tieto sumy z DB a následne spočítať tak aby bol výsledok 66,40 teda aj s desatinou čiarkou a výsledkom za ňou… momentálne mi to vyhadzuje 65 teda nepresný výsledok a bez desatini

No jen mě tak napadlo, máš tu čárky jako oddělovače desetinných míst, zkoušels tečky ? :)

PS: Určitě přehoď typ pole na float ;)

Editoval Zuben45 (21. 12. 2015 15:56)

David Matějka
Moderator | 6445
+
+3
-

uloz to v mysql jako float/double/decimal

SontoEremo
Člen | 341
+
0
-

Zuben45 napsal(a):

SontoEremo napsal(a):

CZechBoY napsal(a):

Jak jako chceš sčítat řetězce?
Převeď to na int.

v administrácii vyplním políčko spolu napr. sumou 25,40 druhé zas 30,20 a trietie 10,80 atď..
potrebujem vytiahnuť tieto sumy z DB a následne spočítať tak aby bol výsledok 66,40 teda aj s desatinou čiarkou a výsledkom za ňou… momentálne mi to vyhadzuje 65 teda nepresný výsledok a bez desatini

No jen mě tak napadlo, máš tu čárky jako oddělovače desetinných míst, zkoušels tečky ? :)

PS: Určitě přehoď typ pole na float ;)

Super pri tom float-e už to ráta ale teraz je výsledok 26.40000009536743 ako z toho spraviť 26.40?

Editoval SontoEremo (21. 12. 2015 16:17)

CZechBoY
Člen | 3608
+
+1
-
{$pi = 3.14159265359}
PI je cca {$pi|number:2}

https://latte.nette.org/cs/filters#…

SontoEremo
Člen | 341
+
0
-

Super chalani vďaka :)

Prikladám aj kód…
DB

DROP TABLE IF EXISTS `tabulka_platby`;
CREATE TABLE `tabulka_platby` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `klienti_id` int(11) NOT NULL,
  `stav_uhrady` varchar(32) COLLATE utf8_bin NOT NULL,
  `uhradene` varchar(10) COLLATE utf8_bin NOT NULL,
  `tringelt` varchar(10) COLLATE utf8_bin NOT NULL,
  `spolu` float NOT NULL,
  PRIMARY KEY (`id`),
  KEY `klienti_id` (`klienti_id`),
  CONSTRAINT `tabulka_platby_ibfk_1` FOREIGN KEY (`klienti_id`) REFERENCES `tabulka_klienti` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Presenter

public function renderDefault() {
		$vsetko_spolu = $this->paymentsRepository->findAll()
							                     ->select('spolu')
							                     ->sum('spolu');
		$this->template->Spolu = $vsetko_spolu;
	}

Latte

<h2>{$Spolu |number:2}</h2>
Šaman
Člen | 2666
+
0
-

Kvůli tomu nepřesnému floatu mám desetinná čísla taky jako VARCHAR, ale pak se s tím nesmí pracovat na úrovni databáze – při načítání entity se z SQL stringu stane PHP double a pak už s počítáním není problém.

Když vidím ten tvůj problém, tak přemýšlím, jak z toho ven. Možná bych to přešil duplikovaným sloupcem s tím, že hlavní bude ten VARCHAR a pomocný FLOAT by byl jen pro výpočty na úrovni SQL.

Mysteria
Člen | 797
+
+5
-

Pokud si dobře pamatuju, tak na peníze a podobné věci existuje právě kvůli nepřesnosti floatu decimal. První stránka výsledků v Googlu mě v tom jenom utvrzuje. Případně druhá varianta je ceny násobit stovkou a ukládat jako klasickej integer. Divím se, že to tady ještě nepadlo. :)

Editoval Mysteria (21. 12. 2015 23:35)

CZechBoY
Člen | 3608
+
0
-

@Mysteria Nikdo neví co tam autor má za data ani jakou přesnost potřebuje. Takže těžko radit jakej typ má použít :-)

SontoEremo
Člen | 341
+
0
-

CZechBoY napsal(a):

@Mysteria Nikdo neví co tam autor má za data ani jakou přesnost potřebuje. Takže těžko radit jakej typ má použít :-)

Skúsim to vysvetliť :D
Maja známa chce aby sa je vždy spočítalo koľko zarobila spolu peňazi aj z tringeltmi :D
takže klasicky vojde do administrácie->rezervácie tam má tabuľky s klientkami ktorý sa na stránke zarezervujú na nechty :D … ak vybaví tú klientku tak vyplní sumu koľko normálne uhradili + tringelt a rovno to spočíta napíše výsledok to sa uloží v DB a v sekcii Office sa tie spočítané sumy spočítajú spolu a vyskočí jej výsledok… a ten som já potreboval vytiahnuť … ja viem blbosť na entu :) ale čo už ja sa takto aspoň učím a ona to má tak ako chce :)

CZechBoY
Člen | 3608
+
0
-

No stejně moc nedává smysl si ukládat součet do dalšího sloupce.
Můžeš přeci udělat sumu těch cen a v php k tomu přičíst všechny spropitné.
Potom můžeš i uvést postup, třeba 15€+5€ = 20€
Nicméně zase platí, že ty sloupce, který chceš sečíst, musíš mít jako datovej typ decimal.

SontoEremo
Člen | 341
+
0
-

Takže by bolo dobré vymazať políčko „spolu“ z tabuľky a políčka „uhradene“ a „tringelt“ zmeniť z varchar na decimal?
Teda takto?

DROP TABLE IF EXISTS `tabulka_platby`;
CREATE TABLE `tabulka_platby` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `klienti_id` int(11) NOT NULL,
  `stav_uhrady` varchar(32) COLLATE utf8_bin NOT NULL,
  `uhradene` decimal(10,2) NOT NULL,
  `tringelt` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `klienti_id` (`klienti_id`),
  CONSTRAINT `tabulka_platby_ibfk_1` FOREIGN KEY (`klienti_id`) REFERENCES `tabulka_klienti` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

a to si potom vytiahnuť?

EDIT:

`uhradene` decimal(10,2) NOT NULL,
`tringelt` decimal(10,2) NOT NULL,

:) nevšimol som si…

Ale teraz sa to už ťahá horšie a tento príkaz nestačí

public function renderDefault() {
		$vsetko_spolu = $this->paymentsRepository->findAll()
							                     ->select('uhradene AND tringelt')
							                     ->sum('uhradene AND tringelt');
		$this->template->Spolu = $vsetko_spolu;
	}

Editoval SontoEremo (22. 12. 2015 2:21)

SontoEremo
Člen | 341
+
0
-

Žeby?

public function renderDefault() {
		$uhradene = $this->paymentsRepository->findAll()->select('uhradene')
														->sum('uhradene');
		$tringelt = $this->paymentsRepository->findAll()->select('tringelt')
													    ->sum('tringelt');
		$vsetko_spolu = $uhradene + $tringelt;
		$this->template->Spolu = $vsetko_spolu;
	}
Mysteria
Člen | 797
+
+2
-

Proč by to nešlo dát do jednoho dotazu? Jestli ti stačí součet sumy obou sloupců, tak by mělo fungovat něco jako

$this->template->spolu = $this->paymentsRepository->findAll()->select('SUM(uhradene) + SUM(tringelt) total')->fetch()->total;
SontoEremo
Člen | 341
+
0
-

Mysteria napsal(a):

Proč by to nešlo dát do jednoho dotazu? Jestli ti stačí součet sumy obou sloupců, tak by mělo fungovat něco jako

$this->template->spolu = $this->paymentsRepository->findAll()->select('SUM(uhradene) + SUM(tringelt) total')->fetch()->total;

Šlo :-) ale som nevedel ako to dať do jedného príkazu… čo už teraz viem :-)

Ďakujem problém vyriešený