Notpa
Messages postés125Date d'inscriptiondimanche 13 janvier 2019StatutMembreDernière intervention 8 janvier 2021
-
28 juin 2020 à 08:52
Notpa
Messages postés125Date d'inscriptiondimanche 13 janvier 2019StatutMembreDernière intervention 8 janvier 2021
-
28 juin 2020 à 16:44
Bonjour,
J'ai dans une table Accces une zone de format Text qui contient des nombres avec le point comme séparateur de décimales (ex : 123.0). Je remplis une grille avec ces données que je trie en ordre croissant. Le problème est que la zone est de format texte et non numérique, donc la séquence de tri est :
Comme on peut le voir, après 10.9, on ne passe pas à 11.0 mais à 100.0. Le 11.0 est beaucoup plus loin.
Je décide donc de changer le type de zone de Text en Integer (copie de la table dans une nouvelle table dont le champ est numérique) pour avoir un tri dans l'ordre numérique. Le problème est que le champ d'origine contient un point, ce qui n'est pas accepté come séparateur sur nos machines en Europe.
Changer le point en virgule est simple, mais remet en cause beaucoup de code qui est basé sur le texte avec un point. J'ai vu qu'il existait en VBA une instruction qui permeet de définir la valeur du séparateur décimal (Application.decimalSeparator = ".") mais pas valide en VB.
Question : existe-t-il en VB6 un moyen de forcer pour une zone numérique le séparateur de décimales à un point ?
Whismeril
Messages postés19020Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention15 avril 2024656 28 juin 2020 à 13:34
Oui normalement ça devrait le faire si le numéro d’ordre ne dépasse pas 9.
Sinon, il te faudra appliquer le même principe dans la seconde partie
Par exemple pour des numéros d’ordre pouvant dépasser 99.
0001.001 => 0001.100
Sinon, tu mets 2 champs entier dans ta table et tu tries par page puis par ordre
Whismeril
Messages postés19020Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention15 avril 2024656 28 juin 2020 à 09:38
Bonjour
Je n’est pas la réponse à ta question finale, mais p’tet des pistes pour toi.
Je décide donc de changer le type de zone de Text en Integer (copie de la table dans une nouvelle table dont le champ est numérique) pour avoir un tri dans l'ordre numérique. Le problème est que le champ d'origine contient un point, ce qui n'est pas accepté come séparateur sur nos machines en Europe.
Je vais ignorer le terme Integer, puisqu’on parle de nombres décimaux.
Dans la base de elle-même, il n’y a ni point ni virgule. Ce qui est enregistré c’est un double ou float, format qui combine un nombre binaire entier (n) et un exposant entier (e) tel que x = n * 2^e avec x valeur binaire du nombre décimal (voir ici pour plus d’explications https://www.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3 )
Le symbole décimal intervient à 2 moments
à l’affichage
à la saisie (et c’est là que ça coince)
En effet, il y a quasiment autant de façon de représenter les nombres décimaux qu’il y a de pays.
Donc forcément pour que l’ordinateur s’y retrouve, il faut respecter une « culture »
Quoiqu’il en soit, pour que ta base de données considère ces valeurs comme des nombres décimaux, t’as pas le choix, il faut que tu les saisisses avec la bonne culture.
mais remet en cause beaucoup de code qui est basé sur le texte avec un point.
Bon, on va passer sur l’erreur de conception (faire des calculs sur du texte et non des nombres). Quand tu lis la base de données, tu convertis le nombre en texte et ensuite tu fais un replace de virgule en points
Une autre solution consisterait à multiplier toutes tes valeurs par 10 (en supposant qu’il n’y ait toujours qu’une décimale) et la tu les stockes dans un champ entier.
A la lecture tu construis ton texte en concatenant les résultats de la division euclidienne et du modulo par 10.
Notpa
Messages postés125Date d'inscriptiondimanche 13 janvier 2019StatutMembreDernière intervention 8 janvier 20211 28 juin 2020 à 09:50
Bonjour whishmeril et merci de répondre.
faire des calculs sur du texte et non des nombres
Je ne fais pas de calculs. Ces nombres correspondent à des n° de pages et un n° d'ordre dans la page. Ex , 123.1 fait référence à la page n° 123 et au n°d'ordre 1. Jamais de calculs là dessus !
Je pense à une autre solution : modifier la base de données pour avoir toujours 4 chiffres suivis du point et d'un chiffre. Ex : 1.2 devient 0001.2, 123.5 : 0123.5, etc.
Avec cette méthode je n'ai plus besoin de zone numérique et garde ma zone format texte : le tri sera alors croissant et dans le bon ordre.
Notpa
Messages postés125Date d'inscriptiondimanche 13 janvier 2019StatutMembreDernière intervention 8 janvier 20211 28 juin 2020 à 14:57
OK. Je vais faire comme ça. Le deuxième chiffre ne dépasse jamais 9.
Merci pour ton aide. Comment fais-je maintenant pour ce sujet ? Le passer en Résolu n'est pas correct puisque je n'ai pas de solution mais juste un bypass. Peut-on marquer le sujet comme Annulé ou Bypassé ?
Whismeril
Messages postés19020Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention15 avril 2024656 28 juin 2020 à 15:08
Ha non, y'a pas de marquage en demi teinte, c'est résolu ou pas.
A toi de voir
Vous n’avez pas trouvé la réponse que vous recherchez ?