6 messages in org.openoffice.fr.progRe: [prog] requietes SQL et operation...
FromSent OnAttachments
Snopie Snopie1Aug 29, 2005 10:31 am 
Bernard MarcellyAug 30, 2005 3:17 am 
Snopie Snopie1Aug 30, 2005 8:25 am 
Bernard MarcellyAug 31, 2005 12:46 am 
Snopie Snopie1Aug 31, 2005 5:09 am 
Bernard MarcellyAug 31, 2005 8:12 am 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:Re: [prog] requietes SQL et operations sur CurrencyActions...
From:Bernard Marcelly (marc@club-internet.fr)
Date:Aug 30, 2005 3:17:21 am
List:org.openoffice.fr.prog

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