Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[FoxPro] Kako je ovo moguće?

[es] :: Baze podataka :: [FoxPro] Kako je ovo moguće?

[ Pregleda: 3318 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

amladjo
Mladen Arbutina
Novi Sad

Član broj: 30160
Poruke: 53
*.ptt.yu.

Sajt: www.dynasoft.rs


Profil

icon [FoxPro] Kako je ovo moguće?13.06.2006. u 22:46 - pre 217 meseci
Ajmo Fox-ovci!

Code:

Local oCN
oCN=Createobject("ADODB.Connection")
oCN.Open("Provider=SQLOLEDB.1;"+;
  "Data Source=(Local);"+;
  "Initial Catalog=master;"+;
  "User ID=sa;"+;
  "Password=<ovde lozinka za sa>;")
With oCN.Execute("select convert(decimal(10,3),8.04) as Kolicina")
  If .State=1
    Messagebox(.Fields("Kolicina").Value) && Rezultat 8,04
    Messagebox(.Fields("Kolicina").Value*100) && Rezultat 804
    Messagebox(Int(.Fields("Kolicina").Value*100)) && Rezultat 803!!!!
  Endif
Endwith


Testirano na verziji Visual FoxPro 8.0.
Primer je uprošten radi lakšeg izvršavanja.

Inače, problem sam rešio.
Više mi je muke zadalo da uopšte otkrijem da Int() funkcija, u ovom slučaju, nije ispravna.

Nikad se nisam upuštao u pronalaženje razloga ovakvog ponašanja, pa ako neko ima objašnjenje...

Pozdrav
 
Odgovor na temu

Zed Mc Jack
Programer
Bečej

Član broj: 93120
Poruke: 137
*.adanet.co.yu.

Sajt: www.subakov.com


Profil

icon Re: [FoxPro] Kako je ovo moguće?14.06.2006. u 08:40 - pre 217 meseci
Ne znam kako si dobio vrednost 803, ali evo probao sam jednostavno:

Code:

CREATE CURSOR x (broj n(10,3))
INSERT INTO x VALUES (8.04)
?broj                    && rezultat 8,040
?broj*100             && rezultat 804,000
?INT(broj*100)      && rezultat 804
?INT(broj)*100      && rezultat 800


I dobio sve očekivane rezultate, ajde probaj ponovo
www.subakov.com Jedini Visual FoxPro sajt u Srbiji
 
Odgovor na temu

amladjo
Mladen Arbutina
Novi Sad

Član broj: 30160
Poruke: 53
*.ptt.yu.

Sajt: www.dynasoft.rs


Profil

icon Re: [FoxPro] Kako je ovo moguće?14.06.2006. u 09:15 - pre 217 meseci
Nije:
Code:

Int(broj)*100


nego:
Code:

Int(broj*100) && ceo izraz pod Int() funkcijom


i nemože Fox-ov kursor već mora ADO i MS SQL.
Naveo sam da sam problem uprostio radi lakšeg testiranja kod Vas.

Select komanda je inače upućena na konkretno polje Kolicina u jedno MS SQL tabeli

U originalnom kodu je:
Code:

If Int(.Fields("Kolicina").value*100)!=.Fields("Kolicina").value*100
  * ovaj deo se izvršava ako količina ima više od dve decimale
Endif


i predstavlja kod kontrole da li je polje Kolicina u dozvoljenim vrednostima.
Nisam ni pomislio da će program ući u If ako je Kolicina=8.04
 
Odgovor na temu

Zed Mc Jack
Programer
Bečej

Član broj: 93120
Poruke: 137
*.adanet.co.yu.

Sajt: www.subakov.com


Profil

icon Re: [FoxPro] Kako je ovo moguće?14.06.2006. u 10:05 - pre 217 meseci
Nemam MS SQL, tako da ništa od testiranja ovde.

Ne verujem da je INT() funkcija problem, dosad bi to već neko primetio.
Probaj da ne konvertuješ polje u SQL SELECT-u, nego probaj da konverziju uradiš naknadno

www.subakov.com Jedini Visual FoxPro sajt u Srbiji
 
Odgovor na temu

amladjo
Mladen Arbutina
Novi Sad

Član broj: 30160
Poruke: 53
*.ptt.yu.

Sajt: www.dynasoft.rs


Profil

icon Re: [FoxPro] Kako je ovo moguće?14.06.2006. u 17:12 - pre 217 meseci
Citat:
Zed Mc Jack:
Probaj da ne konvertuješ polje u SQL SELECT-u, nego probaj da konverziju uradiš naknadno


Nema konverzije, postoji polje Kolicina decimal(10,3) u SQL tabeli.
Čak ne pomaže i spremanje u lokalnu varijablu:
Code:

lnKolicina=.Fields("Kolicina").value
MessageBox(Int(lnKolicina*100)) && Rezultat 803


Izgleda je problem u Fox-ovom mapiranju SQL polja decimal. (ili je možda kriv ADO?)

Zaključeno na osnovu sledećeg koda:

Code:

MessageBox(Int(lnKolicina*10000)) && Rezultat 80399
MessageBox(Int(lnKolicina*100000)) && Rezultat 803999
MessageBox(Int(lnKolicina*10**14)) && Rezultat 803999999999999
MessageBox(Int(lnKolicina*10**15)) && Rezultat 8040000000000000


Vartype() i Type() vraćaju redovno rezultat N.
Pokušao sam napraviti sličnu varijablu u Fox-u ali bez uspeha.
Izgleda je presudna kombinacija MS SQL i Fox.

Dakle, ono što je u SQL-u 8.04 to je u Fox-u "skoro" isto.
Ne mogu da verujem da im je tako nešto promaklo.
 
Odgovor na temu

Zed Mc Jack
Programer
Bečej

Član broj: 93120
Poruke: 137
*.adanet.co.yu.

Sajt: www.subakov.com


Profil

icon Re: [FoxPro] Kako je ovo moguće?15.06.2006. u 09:30 - pre 217 meseci
Pa, kol'ko ja vidim nema greške.

Vrednost u tom polju je 8.03999999999999
kada to izmnožiš sa 100 dobijaš 803.999999999999, a celobrojna vrednost od toga je 803, što je tačno.

Znači koristi ROUND() ili SET DECIMALS TO da dobiješ preciznost koja tebi odgovara, pa tek onda pretvori u celobrojnu vrednost.
www.subakov.com Jedini Visual FoxPro sajt u Srbiji
 
Odgovor na temu

amladjo
Mladen Arbutina
Novi Sad

Član broj: 30160
Poruke: 53
*.ptt.yu.

Sajt: www.dynasoft.rs


Profil

icon Re: [FoxPro] Kako je ovo moguće?15.06.2006. u 14:12 - pre 217 meseci
Verovatno nisam dovoljno jasan.

U Microsoft SQL bazi podataka stoji tačno 8.04 a Fox to interpretira kao 8.03999.....

Nije problem rešiti ovaj bug, može i sa Round(). Sve to stoji.

Pitanje je zašto Fox pogrešno predstavlja ovu varijablu.
Zanima me prosto da bih slične nedoslednosti znao zaobići.
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: [FoxPro] Kako je ovo moguće?16.06.2006. u 18:31 - pre 217 meseci
Pošto se ne razumem ni u Fox ni u SQL server, ne bih puno da mudrujem, ali mi ovo izgleda prilično očigledno. Izgleda da interfejs pretvara podatak u float ili double, pa se onda broj 8,04 ne može tačno predstaviti.

Ovo nije najgore što može da se desi. Imao sam slučaj kada sam iz Oracle baze hteo da preko ODBC-a povučem podatke iz Access baze. Number polje iz Access-a je postalo VARCHAR2(1) u Oracle bazi!

Probaj prostu stvar: 0,1 se ne može predstaviti tačno u double, za razliku od 0,5. Ako ti program pravi grešku za 0,1 a ne za 0,5 onda je problem u interfejsu koji decimal konvertuje u double.
 
Odgovor na temu

amladjo
Mladen Arbutina
Novi Sad

Član broj: 30160
Poruke: 53
*.ptt.yu.

Sajt: www.dynasoft.rs


Profil

icon Re: [FoxPro] Kako je ovo moguće?16.06.2006. u 21:52 - pre 217 meseci
Citat:
djoka_l:Probaj prostu stvar: 0,1 se ne može predstaviti tačno u double, za razliku od 0,5. Ako ti program pravi grešku za 0,1 a ne za 0,5 onda je problem u interfejsu koji decimal konvertuje u double.

Definitivno ima neke veze sa Fox-ovom interpretacijom. I vrlo verovatno je vezano za real i double.
Probao sam 0.1 i 0.5 očekujući to što si mi rekao ali za 0.1 daje ispravne rezultate!!!

Nije mi bilo teško pa sam napravio petlju i umesto 8.04 iz koda u prvoj poruci postavio sam redom brojeve od 0.01 do 9.99 i prva pogrešna interpretacija je tek 4.02 (daje 4.0199..).

Zanimljivo je da izraz Int(Kolicina*100)==Kolicina*100 nije tačan ali izraz Int(Kolicina*100) za 4.02 daje 402.

Evo nekoliko brojeva za koje If izraz Int(Kolicina*100)==Kolicina*100 nije tačan:
Code:

Kolicina=4.02, Int(Kolicina*100)= 402, Int(Kolicina*100000)= 401999
Kolicina=4.06, Int(Kolicina*100)= 406, Int(Kolicina*100000)= 405999
Kolicina=4.10, Int(Kolicina*100)= 410, Int(Kolicina*100000)= 409999
Kolicina=4.11, Int(Kolicina*100)= 411, Int(Kolicina*100000)= 411000
Kolicina=4.14, Int(Kolicina*100)= 414, Int(Kolicina*100000)= 413999
Kolicina=4.15, Int(Kolicina*100)= 415, Int(Kolicina*100000)= 415000

Tražio sam na google ali nisam našao ništa slično.
Probao sam na verziji 9.0 i daje iste rezultate.
Jedino što mi preostaje jeste da decimal vrednosti iz SQL-a nikada ne prihvatam bez Round() funkcije.
 
Odgovor na temu

[es] :: Baze podataka :: [FoxPro] Kako je ovo moguće?

[ Pregleda: 3318 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.