Bonjour Bernard Marcelly,

> 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.
desole pour le manque d'info.
je suis sous ubuntu hoary 5.04 avec la derniere
update. 
OOo 1.1.3 est installe (je cherche une version
stable).
je dois avoir une 1.1.4 sur une knoppix dans le coin.

> 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).
le probleme est general au passage de res. mysql aux
vars OOBasic. 
pour l'instant, en passant par val(string), j'arrive
tout juste a
recuperer la "partie entiere", comme si j'avais accede
au champ .Short!

d'autant plus que je ne peux pas faire confiance au
calcul flottant.

le contournement a consiste a multiplier par 100...

> quel est le type du champ Columns(1) dans ta base
> mysql ?
decimal(12,2)

> quelle est la version de mysql ?
mysql  Ver 12.22 Distrib 4.0.23, for pc-linux-gnu
(i386)


> est-ce que tu as bien défini :
>   Dim str_solde As String
oui, je suis en Option Explicit

> >     msgbox("str_solde=" & str_solde) 'renvoie la
> sommme
> > tronquee!

> qu'est-ce que ça veut dire, tronquée ? il faudrait
tronquer au sens mathematique: 13.45 est une
troncature de 13.4512.
on appelle ca arrondi, aussi.

> des exemples réels 
> avec le contenu de la base et le résultat dans
qu'a cela ne tienne!

=====mysql======
mysql> desc mouvements_clients;
+-----------------------------------+------------------+------+-----+---------+----------------+
| Field                             | Type            
| Null | Key | Default | Extra          |
+-----------------------------------+------------------+------+-----+---------+----------------+
| idmouvements_clients              | bigint(20)      
|      | PRI | NULL    | auto_increment |
| responsabilites_idresponsabilites | bigint(20)      
|      | MUL | 0       |                |
| clients_idclients                 | int(10) unsigned
|      | MUL | 0       |                |
| acompte                           | decimal(12,2)   
| YES  |     | NULL    |                |
| debit                             | decimal(12,2)   
| YES  |     | NULL    |                |
| credit                            | decimal(12,2)   
| YES  |     | NULL    |                |
+-----------------------------------+------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

mysql> select * from mouvements_clients  where
responsabilites_idresponsabilites=7 and
clients_idclients=1;
+----------------------+-----------------------------------+-------------------+---------+----------+--------+
| idmouvements_clients |
responsabilites_idresponsabilites | clients_idclients
| acompte | debit    | credit |
+----------------------+-----------------------------------+-------------------+---------+----------+--------+
|                   40 |                              
  7 |                 1 |    0.00 |   145.75 |   0.00
|
|                   41 |                              
  7 |                 1 |    0.00 | 15000.90 |   0.00
|
+----------------------+-----------------------------------+-------------------+---------+----------+--------+
2 rows in set (0.01 sec)

mysql> select (sum(acompte)-sum(debit)+sum(credit))
from mouvements_clients where
mouvements_clients.responsabilites_idresponsabilites=7
and clients_idclients=1;
+---------------------------------------+
| (sum(acompte)-sum(debit)+sum(credit)) |
+---------------------------------------+
|                             -15146.65 |
+---------------------------------------+
1 row in set (0.00 sec)

=====mysql======

===mysqldump===
DROP TABLE IF EXISTS `mouvements_clients`;
CREATE TABLE `mouvements_clients` (
  `idmouvements_clients` bigint(20) NOT NULL
auto_increment,
  `responsabilites_idresponsabilites` bigint(20) NOT
NULL default '0',
  `clients_idclients` int(10) unsigned NOT NULL
default '0',
  `acompte` decimal(12,2) default NULL,
  `debit` decimal(12,2) default NULL,
  `credit` decimal(12,2) default NULL,
  PRIMARY KEY  (`idmouvements_clients`),
  KEY `mouvements_clients_FKIndex1`
(`clients_idclients`),
  KEY `mouvements_clients_FKIndex2`
(`responsabilites_idresponsabilites`)
) TYPE=MyISAM;

INSERT INTO `mouvements_clients` VALUES
(40,7,1,'0.00','145.75','0.00');
INSERT INTO `mouvements_clients` VALUES
(41,7,1,'0.00','15000.90','0.00');
===mysqldump===

on pourra enlever les lignes contenant les cles
etrangeres.

on voit bien que le probleme est externe a mysql.

maintenant le code Basic:

================
Public maConnexion

Dim maRequete As Object
Dim res as Object
Dim sSQL As String,sSQL100 As String
Dim str_solde As String, str_solde100 As String
Dim solde As Currency, solde100 As Currency


        ConnecterSource()
        
        sSQL="select (sum(acompte)-sum(debit)+sum(credit))
from mouvements_clients where
mouvements_clients.responsabilites_idresponsabilites=7
and clients_idclients=1"
        sSQL100="select
(sum(acompte)-sum(debit)+sum(credit))*100 from
mouvements_clients where
mouvements_clients.responsabilites_idresponsabilites=7
and clients_idclients=1"
        
        maRequete = maConnexion.createStatement()
        res=maRequete.executeQuery(sSQL)
        res.next
        
        str_solde=res.Columns(0).String
        solde=val(str_solde)
        
        
        maRequete = maConnexion.createStatement()
        res=maRequete.executeQuery(sSQL100)
        res.next
        
        str_solde100=res.Columns(0).String
        solde100=val(str_solde100)/100
        
        msgbox "str_solde=" & str_solde & chr(13) & "solde="
& solde & chr(13) & chr(13) & "str_solde100=" &
str_solde100 & chr(13) & "solde100=" & solde100
'       str_solde="-15146", solde=-15146.0000,
str_solde100="-1514665", solde100=-15146.6500
================



> un problème de Locale (point ou virgule décimale,
> séparateur de milliers).
peut-etre, mais la conversion us->fr se passe
correctement. (les points sont convertis en virgules)

> de toute façon .Short va supprimer les décimales.
vrai

> .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.
si, justement. un Int, Short ou Long ne garderont que
la "partie entiere" (environ...)
un Double pourrait etre imprecis pour le stockage d'un
nombre a decimales.

__________________________________________________________

>    je sépare, car ce qui suit est un autre problème
> qui aurait mérité 
> d'être un mail séparé.
vrai, mais le code montre le lien.


> Moi je ne vois plus ces erreurs avec ma "vieille"
> 1.9.113
hum, 1.1.3
 
> en principe cela devrait marcher à condition de
> faire un arrondi à 4 
> décimales lors de la conversion Double > Currency.
le probleme est que le double perd deja l'information
(cf la norme ieee du codage de flottant). c'est pour
ca, que je ne veux pas passer par le calcul flottant.

> Pour cela je viens de 
> concocter une fonction qui a l'air de marcher (sur
je prends note.

> - soit passer à la version 1.9 (en supportant les
> fautes résiduelles 
> diverses)
est-ce qu'il y a une doc ou je pourrais evaluer le
travail de migration 1.1.(3|4) -> 1.9 ?

> - soit employer un autre langage que Basic. Si dans
> ton application, OOo 
> n'est qu'un simple moyen de "reporting" il peut être
j'ai vu ca. ;)

> 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.
ou en est justement le statut de python pour OOo?
j'imagine que java est pret depuis longtemps pour la
production.
je serais interesse de passer a ces deux langages, vu
toutes les 
complications qu'on a eues a developper cette appli.

Ouf! c'etait un peu long.

merci beaucoup,
snopie


        

        
                
___________________________________________________________________________ 
Appel audio GRATUIT partout dans le monde avec le nouveau Yahoo! Messenger 
Téléchargez cette version sur http://fr.messenger.yahoo.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Répondre à