Newsgroup: it.comp.lang.vo-clipper
Titolo: ODBC e decimali

Ho sviluppato un programma che accedendo a dati che si trovano su un As/400
IBM tramite ODBC li trasformo in formato DBF e su questi faccio statistiche
e report.
Per poter sviluppare il programma in assenza dell'As/400, ho trasformato le
tabelle originali di cui avevo bisogno, in identiche tabelle di tipo DBF, mi
sono creato un DSN di tipo DBF simulando pienamente la presenza dell'host
IBM.
Il problema è il seguente: un campo sconto che sull'As/400 è definito con 2
interi e 2 decimali mi viene importato sull'archivio temporaneo di tipo DBF
con le stesse caratteristiche ma perde il valore del secondo decimale,
ad esempio 12,34 viene trasformato in 12,30 opp. 39,09 in 39,00.
altri campi invece con quattro decimali vengono importati correttamente.
Il codice:
--------------------------------------------------
    cSelect := "SELECT DISTINCT ANAP.APMS10, ANAP.APDPRO, LISTI.LIAPUB,
CONV.CVSCO1,  CONV.CVQMIN, CONV.CVQCEV, Anag.AGRSO2, LISTI.LIAIVA,
Conv.CVQOMA, ANAP.APCCAS, ANAP.APECAS, CONV.CVPRCO, LISTI.LIAVEN,
ANAP.APTPRO, CONV.CVPVEN, Conv.CVPOMA, CONV.CVSCLI, CONV.CVNSEQ,
CONV.CVCVEN, CONV.CVIVAL, CONV.CVDVAL " +;
         "FROM Anae anae, Anag anag, ANAP anap, CONV conv, LISTI listi " + ;
         "WHERE CONV.CVCPRO = ANAP.APCODI AND " + ;
         "CONV.CVCPRO = LISTI.LICPRO AND " + ;
         "ANAP.APCCAS = Anae.AECCAS AND " + ;
         "ANAP.APECAS = Anae.AEECAS AND " + ;
         "Anae.AECFOR = Anag.AGCANA AND " + ;
         "((Anae.AETREC='P') AND " + ;
         "(CONV.CVTREC='P') AND " + ;
         "(CONV.CVCVEN='" + SELF:oDbOfferte:CODICE + "') AND " + ;
         "(CONV.CVIVAL=" + DToS(SELF:oDbOfferte:DATINI) + "0" + ") AND " + ;
         "(CONV.CVDVAL=" + DToS(SELF:oDbOfferte:DATFIN) + "0" + ")) " + ;
         "ORDER BY CONV.CVNSEQ, ANAP.APDPRO"
SELF:oSelect := SQLSelect{cSelect, oConneCC}
.........
.........
  DO WHILE !SELF:oSelect:EOF   && Popola l'archivio temporaneo DBF con i
risultati della query
    IF oListFil:append()
     oListFil:FIELDPUT(#APMS10, SELF:oSelect:FIELDGET(#APMS10))
     oListFil:FIELDPUT(#APDPRO, SELF:oSelect:FIELDGET(#APDPRO))
     oListFil:FIELDPUT(#LIAPUB, SELF:oSelect:FIELDGET(#LIAPUB))
     oListFil:FIELDPUT(#CVSCO1, SELF:oSelect:FIELDGET(#CVSCO1))
..........
..........
    SELF:oSelect:skip()
    ApplicationExec( ExecWhileEvent )
ENDDO
..........
..........
---------------------------------------------------
Qualcuno ha suggerimenti ?
Grazie a tutti

 con le stesse caratteristiche ma perde il valore del secondo decimale,
Hai provato a visualizzare il valore effettivo che ti viene letto con
FIELDGET() dalla query? Così puoi cominciare a capire se il problema è a
monte o a valle.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 EMG
Ho già mandato la modifica con questa emissione, l'As/400 si trova a 300 Km.
da me, in più so solo che il campo è numerico ma di tipo Zoned e non Compact
come gli altri numerici con decimali che invece non mi danno problemi
Ciao, grazie

 ha scritto nel messaggio
news:TeLgc.72297$hc5.3...@news3.tin.it...


 solo 2) ?
Si avevo provato anche questo,
ma grazie a informazione di colleghi che hanno cozzato con lo stesso
problema ho risolto in questo modo ho modificato la seguente:
cSelect := "SELECT DISTINCT ANAP.APMS10, ANAP.APDPRO, LISTI.LIAPUB,
CONV.CVSCO1,  ...
con
cSelect := "SELECT DISTINCT ANAP.APMS10, ANAP.APDPRO, LISTI.LIAPUB,
(CONV.CVSCO1*100) as CVSCO1,  ...
e poi a livello di codice ho diviso il risultato per 100.
Non è "elegante", lo so ma solo in questo modo ho potuto raggirare il
problema dei driver IBM
Buon lavoro a tutti
Claudio
