MS Access

Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
- - Dernière réponse : Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
- 12 févr. 2016 à 23:03
Bonjour Messieurs,
Débutant soyez indulgents. Merci

J'ai une base access avec une table ayant une colonne numérique Reel Double
avec 4 chiffres après la virgule.
Les données sont stockées dans la base au format " 24,9999 " (avec virgule).

J'utilise VB2008 Express
Pour faire un tri sur la colonne numérique afin de sélectionner une plage de données entres deux chiffres, c'est a dire entre " 24,9999 " et " 9,9999 ",
j'ai écrit :

Dim X As Double = CDbl(Format(CDbl(24.9999), ("00.0000")))
Dim Y As Double = CDbl(Format(CDbl(9.9999), ("00.0000")))
pour formater le nombre " 24.9999 " et " 9.9999 " au format " 24,9999 " et " "9,9999 " car VB2008 ne reconnait pas le chiffre " 24,9999 " (avec une virgule) comme un numérique voir un Double, mais " 24.9999 " (avec un point) OUI.

Requête
Sql = "SELECT ID, Date_, Code, Article, Total, Sortie, PourCent FROM Partage" _
+ " WHERE PourCent BETWEEN '" & Y & "' AND '" & X & "'" _
+ " ORDER BY PourCent ASC"

La réponse est l'exception : "Type de données incompatible dans l'expression du critère."

j'ai compris que le format de stockage n'est pas compatible avec le format de ma requête
j'ai enlevé la conversion, remplacé Double par Decimal puis par Single, la réponse est toujours la même. Quand je met la colonne a TEXT le tri ne marche pas et ne peut être ordonné.

Quel est le bon format? ou comment reformuler ma requête pour réussir le tri?
Merci d'avance

--
Afficher la suite 

4 réponses

Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279
0
Merci
Bonjour,

pour commencer, tu peux lire cet article
http://codes-sources.commentcamarche.net/faq/11151-pourquoi-mon-code-vb6-vba-ne-marche-pas-en-vb-net

Tu y trouveras des conseils pour entre autre ne pas utliser de mots clé de VB6 dans VB.Net.



Dim X As Double = CDbl(Format(CDbl(24.9999), ("00.0000"))) 
Dim Y As Double = CDbl(Format(CDbl(9.9999), ("00.0000")))

pour formater le nombre " 24.9999 " et " 9.9999 " au format " 24,9999 " et " "9,9999 " car VB2008 ne reconnait pas le chiffre " 24,9999 " (avec une virgule) comme un numérique voir un Double, mais " 24.9999 " (avec un point) OUI.


Donc, pour faire des conversions, on utilise la Classe Convert.
Ensuite dans le code, un némrique est toujours écrit avec un point comme séparateur décimal, car en générral en informatique c'est comme ça. Pour autant que je m'en souvienne c'était pareil avec VB6.
Par contre, un texte (string), issu d'un contrôle ou d'un fichier, va subir la politique de conversion que tu lui demandes, si tu ne demandes rien (comme dans ton exemple écrit en VB6....) c'est la politique numérique du PC qui est appliqué, si le symbole décimal est la vrigule alors seuls les textes avec virgules seront convertis, ou l'inverse si le symbole décimal est le point.

Donc pour être capable de te répondre, il faut savoir:
  • d'ou vient la donnée d'entrée:
    • contrôle,
    • fichier,
    • Base de données, méthode d'extraction
    • valeur figée dans le code, il me semble assez improbable que dans ton code tu doives juste convertir 24.9999 et 9.99999, mais on ne sait jamais.
  • ton besoin exact, que veux tu faire de cette virgule? L'afficher quelque part?



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279 -
PS pour mettre un code sur le forum, merci de suivre cette procédure
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
> Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
-
Bonsoir Whismeril
Merci pour votre réponse. Voila en quelque sorte la réponse a votre question.

La donnée d'entrée vient d'un contrôle textbox qui affiche le résultat d'un calcul donc elle n'est pas figée.
En fait j'ai deux textbox ( A et B) qui contiennent des données numériques integer non figées. Lorsque la valeur de B est réduite, un calcul de pourcentage est fait et s'affiche dans un troisième textbox (C) au format double.
Dim X as Double
X = Round(CDbl((valeur_B * 100) / valeur_A), 4)
C.Text=Cstr(CDbl(x).Tostring
C'est cette valeur X qui s'affiche dans le texbox C qui est stocké dans la base.
Mon problème est que je voudrais trier ces valeurs en 4 catégories. et les afficher dans un datagridview:
1 Celles supérieures à 70%
2 Celles comprises entre 70% et 50%
3 Celles comprises entre 50% et 25%
4 Celles inférieures à 25%

merci d'avance
Commenter la réponse de Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279
0
Merci
Bonjour.

Tout cela n'a aucun rapport avec Access, qui est le titre de ce sujet.
Je t'ai donné un lien, vers un article, que tu n'as forcément pas lu et appliqué puisque tu présentes à nouveau du code vb6.
Enfin je t'ai demandé d'utiliser la coloration syntaxique pour poster du code.

Pas d'efforts de ta part, pas de réponse de la mienne.
cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
-
Bonjour Whismeril

Je vous demande d'avance pardon, mais je ne suis qu'un débutant dans le Basic et je n'ai jamais fais du VB6 et ne l'ai même pas. le VB2008 je l'ai télécharger.Tout ce que j’écris je le fais par intuition après beaucoup de lecture et comme j'ai mis OPTION STRICT à ON, c'est VB2008 qui corrige pour moi. Tout ce que je fais j'accepte les corrections et voila.

Pour le lien sur les conversions, si vous pouvez me voir, j'ai passer la nuit a remplacer mes Cstr, CInt, Cdbl et autres, puisque je viens d'encaisser une nouvelle connaissance. Merci pour cela, vous m'aviez déjà aider indirectement.

Pour la coloration syntaxique, j'avoue encore être un ignorant, je ne sais pas comment faire sinon croyez moi c'est avec plaisir que je le ferai.

Merci quand même.
Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279 > cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
-
Pour la coloarion je t'ai mis le lien vers la procédure plus haut.
cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
> Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
-
Merci.
Voila
' Pour le calcul
    
STotalOut = Convert.ToInt32(Me.MTotalOut.Text)
STotalIn = Convert.ToInt32(Me.MTotalIn.Text)
PrCent = Convert.ToDouble(Round((Convert.ToDouble(STotalOut * 100) / STotalIn), 4))
Convert.ToDouble(PrCent)
Me.MPrCent.Text = (Convert.ToDouble(PrCent)).ToString


Merci encore cela prouve votre patience.
C'est le résultat affiché dans le textbox MPrCent qui est enregistré dans la base a la colonne numérique PourCent.

Pour extraire en faisant un tri

 
' pour tous les enregistrement supérieures à 70,0000
Dim X As Double = Convert.ToDouble(Format(Convert.ToDouble(69.9999), ("00.0000")))
Connection()
Sql = "SELECT ID, [Date_] as [Date], Code, Article, Total, Sortie, [PourCent] as [% Sortie] FROM Pourcentage" _
+ " WHERE PourCent >= '" & X & "' ORDER BY [PourCent] ASC"
Cmd = New OleDb.OleDbCommand(Sql) :
PrcTA = New OleDb.OleDbDataAdapter(Cmd)
Cmd.Connection() = GP
CDSet = New DataSet
PrcTA.Fill(CDSet, "Pourcentage")
PrcT = CDSet.Tables("Pourcentage")
Grid.DataMember = "Pourcentage"
Grid.DataSource = CDSet


Merci d'avance
Commenter la réponse de Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279
0
Merci
Cela étant dit.
Il existe des versions plus récentes et gratuites de Visual Studio, Express 2010, 2012, Community 2013 et 2015.

Je te conseille de passer à la plus récente compatible avec ton ordinateur.

Option Strict à On, c'est bien, mais il faut aussi enlever la référence à Visual Basic, c'est écrit dans mon article. Et là plus de Round, Format etc....

Pour faire des arrondis et les fonctions mathématiques en général, on utilise la classe Math, si tu ne sais pas ce qu'est une classe, ça n'est pas la peine d'aller plus loin, il faut commencer par les bases.
Dans mon article il y a un lien vers un très bon cours.

En fait j'ai deux textbox ( A et B) qui contiennent des données numériques integer non figées. Lorsque la valeur de B est réduite, un calcul de pourcentage est fait et s'affiche dans un troisième textbox (C) au format double

Non un textebox affiche du texte, pas des nombres, ce texte peut être la représention d'un nombre, mais là encore c'est la base....
cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
-
Merci
mais c'est en forgeant que l'on devient forgeron.
j'apprends ainsi en côtoyant ceux qui sont expérimentés.
Merci
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209 > cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
-
Bonjour, cs_colby,
Forgeron, je l'ai été par hobby il y a (il fut ?) quelques décennies.
Je te promets que j'ai commencé par apprendre ce qu'étaient le soufflet, le charbon, le foyer, le métal, la température, la malléabilité atteinte, la masse et l'enclume avant même de tenter de commencer à forger.
Et je te promets que le "reste" est ensuite venu assez facilement.
J'avais à l'époque un copain qui, lui, avait une autre approche (à tâtons et sans commencer par là). Il a, lui, abandonné très rapidement de tenter de forger. Il n'en a même plus parlé ....
J'espère que tu comprends la signification de mes propos....
Commenter la réponse de Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279
0
Merci
La partie base de données, je ne connais pas donc je ne le traiterai pas

Pour ton calcul
 STotalOut = Convert.ToInt32(Me.MTotalOut.Text)
   STotalIn = Convert.ToInt32(Me.MTotalIn.Text)
 

Ceci est correct.

Par contre cette ligne n'a pas de sens
PrCent = Convert.ToDouble(Round((Convert.ToDouble(STotalOut * 100) / STotalIn), 4))


D'abord, round je le répète, c'est du VB6.
Ensuite arrondir un nombre est rarement utile dans les calculs, au moment de l'affichage oui, mais on y reviendra.

Ensuite StotalOut et STotalIn sont déjà des nombres et un Entier en math c'est aussi un Décimal et ben en informatique aussi....

Alors oui
STotalOut * 100 / STotalIn
retourne un entier et donc tronque le résultat.
Une opération qui ne comprends que des entiers retourne un entier, mais il suffit qu'un seul membre soit un décimal pour que le résultat soit décimal.
Donc ça
STotalOut * 100.0 / STotalIn
suffit.

Enfin tu veux afficher le résultat dans un textbox, il faut donc retranscrire en texte.
Tous les objets de VB dérivent de Object et possèdent donc une méthode ToString, qui pour les nombres retourne le texte représentant ce nombre.

MPrCent.Text = PrCent.ToString
va donc afficher le nombre dans le textBox avec la politique par défaut:
  • point ou virgule dépend de la config du pc
  • nombre de décimales affichées dépend du résultat 50 => 50.0, 1.9999999 affichera la même chose.


Si tu veux appliquer ta propre politique, il suffit d'utiliser une surcharge de ToString, voir ici
https://msdn.microsoft.com/fr-fr/library/kfsatb94(v=vs.110).aspx
cs_colby
Messages postés
111
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
23 mars 2018
-
Merci Whismeril

J'ai appris en deux jours plus que je n'en espérais. merci encore
Mais mon problème reste toujours là.
Comment écrire mon SQL pour réussir le tri entre deux valeurs double

 Sql = "SELECT ID, [Date_] as [Date], Periode, Code, Article, Total, Sortie,  [PourCent] as [% Sortie]" _
+ " FROM Pourcentage WHERE PourCent BETWEEN '" & X & "' AND '" & Y & "' ORDER BY [PourCent] DESC"


ou X est la valeur la plus grande et Y la plus petite. je voudrais toutes les valeurs entre les deux.

Je reçois toujours comme réponse l'exception " TYPE DE DONNÉES INCOMPATIBLES DANS L'EXPRESSION DU CRITÈRE "

Merci d'avance
Whismeril
Messages postés
13401
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
16 juin 2019
279 -
Bonsoir,

au risque de me répéter,
La partie base de données, je ne connais pas donc je ne le traiterai pas

Et commence par les bases avant de vouloir décrocher la lune.
Si pour construire une maison tu commences par le toit, quand tu voudras t'attaquer au mur, ça va coincer.
Commenter la réponse de Whismeril