[ bigguy @ 30.01.2009. 09:43 ] @
Radim jednu alikaciju u VS C# i koristim kao bazu MS SQL 2005. U okviru svoje aplikacije imam unos decimalnih vrednosti gde softverski iz nekih razloga nebi smeo da ogranicavam broj decimala koje se upisuju u aplikaciju ali mi je zato potrebno da se podaci cuvaju u bazi u formatu decimal sa dve decimale. Kako da resim problem zaokruzivanja vrednosti sa 12.45678 na 12.46?

Predpostavljam da se vec neko pozabavio ovim problemom jer i nije bas da je tako redak problem?! Napominjem da do sada nisam imao nekih znacajnijih kontakata sa radom u bazama.
[ mmix @ 30.01.2009. 10:48 ] @
Pa imas dve opcije, ili da koristis ROUND(x, 2) pri insertu u tabelu (s tim sto rezultat ostaje u tipu u kojem je bio x) ili u tabeli kreiras polje tipa DECIMAL(n,2) gde ti n zavisi od toga koliko su ti veliki brojevi, u tom drugom slucaju kad insertujes float ili neki drugi decimal vece preciznost rezultat ce biti zaokruzen/konvertovan implicitno u dec(n, 2)
[ bigguy @ 30.01.2009. 11:39 ] @
Pazi ja jesam postavio polje u SQL 2005 npr. decimal(5,2) i u njega sam insertovao npr. broj 13.24567, ali mi on u tabeli upise vrednost 13.24. Ovo nije tacna vrednost (trebalo bi da stoji 13.25) jer on samo odstrani sve vrednosti koje su iza druge decimale a pritom ne zaokruzuje drugu decimalu na osnovu odstranjenog dela. To meni konkretno treba, kako da zaokruzim drugu decimalu na osnovu onog ostatka koji se odstranjuje?
[ .:Marvin:. @ 30.01.2009. 11:48 ] @
Tu bi ti round zavrsio posao.
A da li bi ti mozda odgovarala mogucnost da upises ceo podatak, pa da pri citanju radis zaokruzivanje? Mozda ima malo vise posla, ali ti mozda posle iz nekog razloga zatreba bas ono sto je korisnik upisao?
[ bigguy @ 30.01.2009. 11:58 ] @
Za sad mi odgovara save data u obliku jednostavnog zaokruzivanja na dve decimale. Reci mi samo kako da implementiram ROUND? Da li to trebam u kodu da postavljam ili negde u okviru opcija za definisanje polja SQL 2005? Moj kod za insert iz VS C# je jednostavan i ide preko TabeAdapter, otprilike ovako nesto:
tblTableAdapter.Insert((decimal)TextBox.Text.Trim());

[ bigguy @ 30.01.2009. 12:40 ] @
Sorry Marvine ali kad bolje razmislim ipak bi mi tvoj predlog dobro dosao :) Nikad se nezna kada ce mi kasnije zatrebati korisnikov podatak. Molim te samo ako moze malo detaljnije objasnjenje jer, kako sam vec naveo, sa bazama nisam radio puno sem definisanja tabela i tome slicno.
[ mmix @ 30.01.2009. 14:20 ] @
Pazi, decimal nije floating point, kao sto ni money to nije, decimal je broj sa fiksnim zarezom i interno se drugacije skladisti nego float i kad se radi implicitna konverzija iz float u decimal dolazi do nekog gubitka preciznosti. Medjutim to je marginalno i ovo mi je veoma neverovatno:
Citat:
Pazi ja jesam postavio polje u SQL 2005 npr. decimal(5,2) i u njega sam insertovao npr. broj 13.24567, ali mi on u tabeli upise vrednost 13.24

upravo sam probao ovo kod sebe i na sql2005 i 2008 i na oba je upisao 13.25. Mozda je tebi problem u klijentu koji koristis koji neispravno zaokruzi broj pre nego ga posalje sql serveru? Probaj iz management studia direktno... Sql server koristi roundup mehanizam za zaokruzivanje (slicno kao onaj sto ucismo u skoli samo sto se ne gleda parnost poslednje cifre vec se takav ostatak uvek zaokruzuje na gore, R(1.5) = 2, R(2.5) = 3), th mozda si ti ocekivao da 13.245 zaokruzi na 13.24?

Citat:
bigguy: Nikad se nezna kada ce mi kasnije zatrebati korisnikov podatak. Molim te samo ako moze malo detaljnije objasnjenje jer, kako sam vec naveo, sa bazama nisam radio puno sem definisanja tabela i tome slicno.

Ovo treba da ti zavisi od toga sta zapravo skladistis u tom polju. AKo su to iznosi stavki onda ih drzi zaokruzene zbog agregacije, SUM(ROUND) nije isto sto i ROUND(SUM) zbog parcijalnih ostataka i ovo je cest uzrok zasto u nekim programima na fakturama stavke sabrane zajedno digitronom ne daju total vec se razlikuju za poneku paru. Dakle, da bi ti bilo ko preporucio sta ti je bojle moramo da znamo sta je to sto zaokruzujes...
[ mkaras @ 30.01.2009. 16:04 ] @
Nikada ne sakati podatke koje već imaš a mogu ti zatrebati. Čuvaj podatke onako kako ih dobijaš. Jedan od načina je da koristiš klijentsku aplikaciju za zaokruživanje koje ti treba. Ako to nije moguće ili ne želiš, kao osnovu za dalji rad koristi upit koji ti prikazuje ono što želiš. Ako i to ne želiš iskoristi pogodnost koju ti daje SQL server a to je da dodaš još jedno polje u tabelu koje će biti izračunatog tipa. Ne opterećuje server previše a trenutno imaš podatak za prikazivanje onako kako želiš čim uneseš pravu vrednost.
[ .:Marvin:. @ 31.01.2009. 11:17 ] @
Drugim recima, posto je covek nov: vecina se slaze da je najbolje da skladistis podatak kao float. A kad ti zatreba da ga prikazes i / ili racunas, onda zaokruzuj. Ali obrati paznju na primedbu o Round(sum) i Sum(Round).
Na primer, ako zelis da ti se prikaze zaokruzeno na dve decimale, SQL upit bi izgledao ovako nekako:

select round(KOLONA,2) -- zaokruzuje na 2 decimale
from TABELA

Posto koristis table adapter, nisam siguran kako bi se tu implementirao ovakav upit. Alternativa je da koristis data adapter, sto bi ti svakako pre ili kasnije zatrebalo pa probaj da proucis malo.