Autore Topic: [RISOLTO] Errore in lettura campi float su database MSSQL  (Letto 697 volte)

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
[RISOLTO] Errore in lettura campi float su database MSSQL
« il: 29 Ottobre 2014, 09:41:01 »
Buongiorno, sono un nuovo utente e saluto tutti i componenti di questo forum a cui spero di poter dare anch'io il mio contributo.
Mi scuso anticipatamente degli eventuali errori che potrò fare ma sono sicuro che voi, pazientemente, mi correggerete  :)

Premetto che uso gambas3 solo da poche settimane anche se, grazie alla sua semplicità e a una mia esperienza di vecchia data con il Visual Basic, sono riuscito in breve tempo a sviluppare un programma di accesso a database molto utile per il mio lavoro.

Non ho avuto alcuna difficolta a collegarmi a vari tipi di database, come sqlite3, mysql e MSSQL, ma ho riscontrato un unico, grosso problema con MSSQL nella lettura di dati di tipo 'float'; problema che penso di dover addebitare a gambas3, perchè la stessa query, con gli stessi driver freeTDS, utilizzata da terminale fornisce dati corretti.

Mi spiego meglio: questa query utilizzata da terminale (con isql) fornisce dei valori float decimali corretti per il campo ap_esist:

Codice: sql [Seleziona]
SQL> SELECT ap_codart, ap_magaz, ap_esist FROM artpro WHERE ap_codart = 'A-001-014-501'
+-------------------+-----------+-----------------------+
| ap_codart          | ap_magaz| ap_esist                |
+-------------------+-----------+-----------------------+
| A-001-014-501    | 1           | 1904,616               |
| A-001-014-501    | 2           | 0                         |
| A-001-014-501    | 10         | 0                          |
| A-001-014-501    | 293        | 0,8                       |
+-------------------+-----------+-----------------------+


mentre la stessa query utilizzata con gambas3 mi da valori pari a ZERO! questo per qualsiasi campo di tipo float (i campi integer sono corretti). Ma la cosa strana è che se richiedo il valore del campo moltiplicato per 1000 il risultato è corretto:

Codice: sql [Seleziona]
SELECT ap_codart, ap_magaz, ap_esist, ap_esist*1000 AS ap_esist2 FROM artpro WHERE ap_codart = 'A-001-014-501'

ap_codart ap_magaz ap_esist ap_esist2
A-001-014-501 1 0 1904616
A-001-014-501 2 0 0
A-001-014-501 10 0 0
A-001-014-501 293 0 800


Purtroppo non ho trovato in questo forum molti post dedicati a MSSQL, ma spero che qualcuno di voi possa illuminarmi in merito a questo bug che mi sta letteralmente bloccando lo sviluppo del programma.  :rolleyes:

Concludo assicurando che la lettura di campi di tipo float per database mysql e sqlite3 fornisce dati assolutamente corretti.

Grazie anticipatamente per qualsiasi vostro intervento.
« Ultima modifica: 30 Ottobre 2014, 12:41:02 da gianfry56 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Errore in lettura campi float su database MSSQL
« Risposta #1 il: 29 Ottobre 2014, 12:44:11 »
...problema che penso di dover addebitare a gambas3...

Io non sono esperto di database MSSQL, ma suppongo che, per poter consentire una verifica, forse dovresti copiare qui la parte del codice, con la quale ottieni e scrivi quei valori di tipo Float.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Re: Errore in lettura campi float su database MSSQL
« Risposta #2 il: 29 Ottobre 2014, 15:41:50 »
Grazie vuott per la risposta.

Evito di postare il blocco di codice completo, perché sarebbero centinaia di righe, magari di non facile comprensione e che comunque non porterebbero alcun aiuto in quanto la connessione al database è perfettamente funzionante, solamente che nel set di risultati della query i campi stringa e numerici sono corretti mentre i campi float hanno tutti i valori a zero. Quindi il problema secondo me è la comunicazione tra il driver freeDTS e gambas.

La mia speranza era quella di capire se altri utenti, nel forum, avevano avuto il mio stesso problema.

Comunque, se può aiutare, questi sono i parametri utilizzati:

Nel file /etc/freetds.ini:
Codice: sql [Seleziona]
[nome-server]
host = 192.168.42.3
port = 1433
tds version = 4.2


nel file /etc/odbcinst.ini
Codice: sql [Seleziona]
[ms-sql]
Description = TDS Connection
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
Debug = 0
CommLog = 1
UsageCount = 1
FileUsage = 1


nel file .odbc.ini
Codice: sql [Seleziona]
[nome-host]
Description = ms-sql
Driver = ms-sql
Servername = nome-server
Database = nome-database


nel codice gambas (sinteticamente)
Codice: vb [Seleziona]
Dim Connection As Connection
Dim Risultato As Result

Connection = New Connection
Connection.Type = "odbc"
Connection.Host = "nome-host"
Connection.User = "xxxx"
Connection.Password = "yyyy"
Connection.Open()
Risultato = Connection.Exec("SELECT ap_codart, ap_magaz, ap_esist FROM artpro WHERE ap_codart = 'A-001-014-501'")
Do While Risultato.MoveNext()
print Risultato["ap_codart"],Risultato["ap_magaz"],Risultato["ap_esist"]
Loop
Connection.Close()


che fornisce i risultati che ho evidenziato nel primo post, cioè con i valori a zero nel campo ap_esist di tipo float

Grazie

Offline gianfry56

  • Gambero
  • **
  • Post: 78
    • Mostra profilo
Re: Errore in lettura campi float su database MSSQL
« Risposta #3 il: 30 Ottobre 2014, 12:40:08 »
Ho risolto il problema, con un colpo di fortuna,  utilizzando una funzione di sqlserver nella query, la STR() per l'esattezza;
quindi al posto di chiedere il campo ap_esist faccio la richiesta come STR(ap_esist) AS ap_esist e magicamente il risultato è perfetto...
non domandatemi il perché, è un mistero... non mai dovuto usare questo espediente in tanti anni di interrogazioni... ma alla fine quello che interessa è che il risultato sia corretto...  :2birre:
Spero possa servire ad altri  :ok:

Grazie comunque.  :ciao: