Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Una medesima query funziona in MSAccess e non in VB6

La seguente istruzione SQL funziona nell'ambiente MSAccess e restituisce una 
serie di record
SELECT TabGite.Nome,  TabGite.Long_vetta FROM TabGite WHERE 
Cdbl(Replace(TabGite.Long_vetta&'0','.',',')) >7.3;
mentre presa pari pari con un copia ed incolla NON funziona nell'ambiente 
VB6: viene visualizzato l'errore -
2147217900
 "Funzione 'replace' non 
definita nell'espressione".
Long_vetta contiene stringhe del tipo "7.22976486" con il punto come 
separatore decimale.
Lo '0' (zero) aggiunto a Long_vetta serve a far si che eventuali valori 
nulli siano lo stesso processati.
Puň essere un'ipotesi pensare che dipenda da diversi settaggi internazionali 
? Preciso che comunque il malfunzionamento capita su uno stesso computer, 
non su 2 diversi.
Quale puň essere la causa e come rimediare ?
San Google non mi ha fatto la grazia e quindi chiedo a voi; grazie 
anticipatamente.
AlpVir

 Può essere un'ipotesi pensare che dipenda da diversi settaggi internazionali?
No! Le funzioni CDbl(), Replace() e la tua funzione personalizzata
Long_vetta()  non possono essere usate in una istruzione Sql ADO.
Comunque basta che ti fai una routine che ti restituisce la stessa
cosa che ti restituisce Cdbl(Replace(TabGite.Long_vetta&'0','.',','))
e crei la query Sql in maniera congruente.
Ciao

 ha scritto nel messaggio 
news:876b8013-cc59-46b3...@m3g2000hsc.googlegroups.com...


Non definirei Long_vetta()  una mia funzione personalizzata. E' un campo 
della mia tabella TabGite.
Riguardo l'impossibilità di usare CDbl e Replace all'interno di una 
istruzione Sql ADO l'ho verificato nel Web esaminando ulteriormente il 
problema.
Avrei però delle difficoltà a realizzare una funzione che restituisse 
Cdbl(Replace(TabGite.Long_vetta&'0','.',',')) essendo appunto 
TabGite.Long_vetta un campo, per sua definizione variabile.
Ho comunque risolto (temporaneamente) il problema ribaltandolo ed 
effettuando il controllo non fra numeri ma fra stringhe (la latitudine e la 
longitudine sono sì dei numeri ma io ho memorizzato questi dati in stringhe 
nel formato  gg.ddddd per la latitudine e g.ddddd per la longitudine; questo 
mi fa molto comodo per velocizzare la creazione di mappe di Google: vedi 
www.lalpinistavirtuale.it
).
Poichè la latitudine varia - per quanto mi riguarda - fra 44 e 46 e la 
longitudine fra 6 e 9 ecco che l'ordinamento alfabetico coincide con 
l'ordinamento, per cosi dire, numerico.
Se avessi una longitudine >= 10 allora il mio sistema non funzionerebbe più.
Ecco il criterio da me applicato, e funziona (longView è un double) :
Criterio = "SELECT IDGita,Long_vetta,Lat_vetta FROM TabGite WHERE Long_vetta 
 > '" + Replace(CStr(longView1), ",", ".") + "'"
Grazie comunque i suggerimenti.
AlpVir

 Quale può essere la causa e come rimediare ?
Come devono essere passati i decimal? A vedere da quel che scrivi direi col
punto, quindi devi fare una funzione che trasformi i dati formattati col
punto (un Str() con qualche controllo in più). Essendo un campo del DB però
deve funzionare come ho scritto.
Se TabGite.Long_vetta  è una variabile o un qualcosa di VB6 o altro dovrai
fare:
"... WHERE " &  MyFormatNum(Variabile) & " >7.3;"
MyFormatNum sarà la tua funzione che restituisce una stringa con . come
separatore decimale.

 separatore decimale.
TabGite.Long_vetta  non è una variabile o qualcosa di VB6. E' il nome del 
campo della mia tabella TabGite per cui mi sembra che non possa essere 
attivata una funzione "MyFormatNum(V)" che restituisce una stringa con . 
come separatore decimale.
Comunque, come ho scritto in un altro post, ho risolto il problema 
sfruttando il fatto che ho delle latitudini fra 44 e 46 gradi e delle 
longitudini fra 5 e 9 gradi. Quindi l'ordinamento alfabetico è uguale a 
quello numerico, in questo particolare caso. Se viceversa avessi delle 
longitudini con 2 cifre intere (10 gradi) allora sarei nei pasticci 
adottando questa mia soluzione che, ripeto, al momento mi soddisfa 
pienamente.
Vero è che non è molto elegante.
Grazie e ciao
AlpVir 

 
una soluzione potrebbe essere salvare il tutto come stringa a lunghezza 
fissa.
puoi salvare le coordinate come testo a lunghezza fissa e convertirle poi 
in numero alla bisogna, sapendo esattamente dove posizionare punti e/o 
virgole.
nel campo salvi quindi:
Lat	45°28'38"28 N -> 45283828
Long	09°10'53"40 E -> 09105340
in questo modo anche l'ordinamento alfabetico funziona correttamente.
magari e' una castroneria, ma non sono pratico di coordinate...
;-P
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 Vero è che non è molto elegante.
Oltre a non essere elegante direi che come hai visto te, non funzionerà
sempre. O trasformi in numeri, oppure usi stringhe nel formato
040.75 > 100.73

 040.75 > 100.73
In conclusione è sufficiente che aggiunga uno 0 iniziale alle mie 
longitudini e questo solo quando esse sono minori di 10 gradi (ossia - 
attualmente - nella totalità dei casi). In tal modo avrò sia latitudini che 
longitudini nel formato GG punto DDDDDD ed il riordinamento alfabetico 
coinciderà con quello numerico.
Ma questo in futuro, quando arriverò a  lavorare con queste "alte" 
longitudini (zona del Veneto più o meno).
Ciao
AlpVir