-
sum(XPATH) retourne NaN
Ma base interbase contient un champ monnétaire (décimal,2) et je voudrais sortir un sous total par regrouppements (maître détail). Mais le champ monétaire est à priori converti en texte car la somme sur la grappe en utilisant sum() ne marche pas. J'ai essayé avec un champ 'entier' (année du montant) et ça marche. Il doit y avoir un pb de format de nombre.
Mais impossible d'inserer number() dans le sum() car il ne considère pas cela comme un chemin valide.
Du coup j'ai inséré un dbextract avec SUM SQL mais cela m'oblique à parcourir deux fois la base et allonge le process.
Y a t il une solution pour utiliser le sum('chemin') dans XSL au vu des données ci-dessus?
-
Quel est le caractère utilisé pour séparer tes décimals ? une "," ou un "." ?
-
-
XPath et calcul
la fonction sum() de XPath attend un node-set pour pouvoir calculer la somme de tous les elements de ce node-set.
Le float accepté par cette fonction est à séparateur . (point) et pas , (virgule).
La fonction qui permettrait de transformer tes séparateurs , en . ne renvoie pas de node-set, d'où soucis...
il faudrait en l'occurence chainer les trois fonctions XPath sum(number(translate(XPath, ',', '.'))), ce qui est incorrecte à cause de cette histoire de node-set. Ca ne marche donc pas :)
Et tant mieux, parce que l'utilisation de ce genre de function XPath est normallement prohibée : le résultat du calcul est une donnée, et toute donnée doit se trouver auparavant dans le XML. Il faudrait donc plutôt faire le calcul soit en SQL, soit par code dans la DLL.
Clairement, XSL n'est pas fait pour ce genre de chose : il n'est là que pour la transformation, et pas pour du calcul.
Maintenant, si tu tiens vraiment vraiment à faire ce calcul en XSL :lol:
Tu peux prendre un peu les devants et faire en sorte que l'élément XML contienne la valeur bien formatée :
tu peux rajouter un Field dans ton DBExtract, dont le nom sera le nom du champ type monétaire, le type FLOAT et le formatage %.2f par exemple (même type de formatage qu'en Delphi. Fonction Format() utilisée).
Ca te permettra d'avoir dans la grappe de données XML tes valeurs float bien formatées qui seront alors bien transtypées par sum().
-
Merci du conseil ! Je pensais au contraire qu'il valait mieux utiliser le plus possible XSL pour éviter les requêtes à la base.
La solution que j'ai mise en oeuvre, fut bien sûr un DBExtract supplémentaire.
Je n'utiliserai pas la conversion que tu préconises (float...) Car si je m'amuse à transformer mes données en monnétaire d'autres modules ne fonctionneront plus... Ce serait déshabiller Pierrette pour habiller Paulette 8O
En tout cas tjs aussi pédagogique le nico ! (et patient avec les lourdingues comme moi)