Vypočítanie celkovej sumy v DB pomocou nette
- SontoEremo
- Člen | 341
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.
- SontoEremo
- Člen | 341
F.Vesely napsal(a):
A jakeho typu je sloupecek
spolu
v db?
Varchar ale asi zle! :)
Editoval SontoEremo (21. 12. 2015 10:49)
- SontoEremo
- Člen | 341
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
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)
- SontoEremo
- Člen | 341
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 desatiniNo 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)
- SontoEremo
- Člen | 341
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
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
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)
- SontoEremo
- Člen | 341
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
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
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
Ž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;
}
- SontoEremo
- Člen | 341
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ý