Bonjour Snopie Snopie1,
Il y a beaucoup de points à analyser séparément et posément dans ton
mail, et il manque des informations pour que la communauté puisse
(peut-être) t'aider. Pour ma part je ne suis pas spécialiste de mysql.
D'abord :
- sur quelle version OOo es-tu ? il semble que ce soit une version
1.9.xxx (à préciser).
- Quel OS ?
Message du 2005-08-29 19:31:
bonjour liste,
j'ai qlqs problemes avec la recuperation des resultats
de requetes SQL ainsi qu'avec les nombres et les
conversions string->currency.
je fais un acces odbc->mysql avec un select qui me
renvoie une somme.
lorsque je l'execute en ligne de commande mysql, ca
marche, mais lors d'un acces a partir d'OOo, j'ai mon
nombre qui est tronque de sa partie decimale:
Question : y-a-t-il un problème seulement avec une somme, ou aussi en
récupérant une valeur d'un enregistrement? Parce que la somme est
calculée par le moteur mysql (sauf erreur de ma part).
=============
'la source est correctement connecte
res=req.executeQuery("select nom,sum(credit) from
clients group by idclients")
Do while res.next
nom =res.Columns(0).String
str_solde=res.Columns(1).String 'type String...
quel est le type du champ Columns(1) dans ta base mysql ?
quelle est la version de mysql ?
est-ce que tu as bien défini :
Dim str_solde As String
msgbox("str_solde=" & str_solde) 'renvoie la sommme
tronquee!
qu'est-ce que ça veut dire, tronquée ? il faudrait des exemples réels
avec le contenu de la base et le résultat dans Basic. Il y a peut-être
un problème de Locale (point ou virgule décimale, séparateur de milliers).
' traiter nom, str_solde
Loop
==============
si je fais res.Columns(1).Short, la troncature est
aussi effectuee.
de toute façon .Short va supprimer les décimales.
.Double n'est pas acceptable car les
calculs doivent etre exacts (cf. plus loin).
ça ce n'est pas évident. Les .Short .String .Double font des conversions
entre le *résultat* de la requête et une représentation dans un type Basic.
Mais le sum() dans la requête étant traité par le moteur de la base de
données, le type final n'a pas d'impact sur la précision du calcul.
__________________________________________________________
je sépare, car ce qui suit est un autre problème qui aurait mérité
d'être un mail séparé.
puis il y a ce code:
===============
Sub Main
Dim s As String
Dim c As Currency, d As Currency, g As Currency
Dim e As Integer
c=100/8/2 'voici d'un coup le resultat qu'on veut
c=100
d=100/8 '=12.5 ok
c=d
d=c/2 '=0 ko!
e=2
d=c/e '=0 ko!
g=2
d=c/g '=0 ko!
Moi je ne vois plus ces erreurs avec ma "vieille" 1.9.113
en lisant "Programmation OOo" d'eyrolles, je vois que
val() renvoie un flottant, or je veux un calcul
_exact_ a 4 decimales.
en principe cela devrait marcher à condition de faire un arrondi à 4
décimales lors de la conversion Double > Currency. Pour cela je viens de
concocter une fonction qui a l'air de marcher (sur 1.9.xxx) :
Function Dbl2Curr(d As Double) As Currency
Dbl2Curr = LTrim(str(CDbl(format(d, "0.0000"))))
End Function
tjs dans le meme livre p58: les currency ne supportent
que + et - pour la version 1.1.
oui, (à l'époque la version 1.9 n'était pas disponible)
ma question est: comment fait-on pour convertir sans
perte d'information (en deca de 4 decimales, et sans
la troncature des flottants) ainsi que pour effectuer
des operations de division et multiplication sur les
currency?
- soit passer à la version 1.9 (en supportant les fautes résiduelles
diverses)
- soit employer un autre langage que Basic. Si dans ton application, OOo
n'est qu'un simple moyen de "reporting" il peut être plus judicieux
d'utiliser un langage indépendant (Python, Java, Delphi, C++) pour
interroger la base et faire des calculs, et de lui faire piloter OOo
pour sortir les rapports.
M. Marcelly devrait mettre en gras le passage p58 pour
la prochaine edition. ;)
on y pensera éventuellement; quoique dans ce petit chapitre, le lecteur
devrait le voir facilement.
C'est une illustration de plus que OOoBasic n'est pas VBA, même s'il y
ressemble. Programmeurs VB, faites attention.
Bernard
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]