IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

SQL: afficher résultats par niveau de probabilité [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut SQL: afficher résultats par niveau de probabilité
    Bonjour,

    Je dois réaliser un programme sous Access pour analyser des particules, le but étant de comparer des matériaux (leur composition en différents éléments chimiques) avec les résultats d'une analyse.

    Jusque là ça semble simple je fais une requête SQL qui regarde pour chaque élément chimique si on est bien dans l'intervalle de tolérance du matériau. j'ai fait comme ce ci et ça marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ' Si l'analyse révèle la présence de silicium
            If (txtSiMass <> "") Then
                Dim minSi As String
                Dim maxSi As String
     
                minSi = txtSiMass - 3 * txtSiSigma.Value
                maxSi = txtSiMass + 3 * txtSiSigma.Value
     
                minSi = Replace(minSi, ",", ".")
                maxSi = Replace(maxSi, ",", ".")
     
                If (Append) Then
                    SQL = SQL & " And (SiMaxCompo >= " & minSi & ") And (SiMinCompo <= " & maxSi & ")"
                Else
                    SQL = SQL & " (SiMaxCompo >= " & minSi & ") And (SiMinCompo <= " & maxSi & ")"
                End If
    Mais ce qui complique la tâche c'est que je voudrais qu'un matériau soit quand même affiché dans les résultats de la requête s'il est dans les tolérance pour 4 éléments chimiques sur les 5 éléments détectés. En gros les résultats serait classé de cette façon, par exemple les 3 premiers matériaux matchent pour 4/5 élements, 2 autres sur 3/5 et ensuite 2 sur 2/5, etc.

    Je pensais utiliser à la fin du code ci dessus (de manière schématique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim correspondance as integer
    correspondance = 0
    For Each résultat de la requête
              correspondance = correspondance + 1 'A la fin les matières qui ont la plus grande valeur de correspondance sont les premières affichées
             Next
    'là je devrais relancer une requête SQL pour l'élément suivant et faire de même ainsi de suite...
    Ma question est de savoir si c'est possible d'attribuer à chaque matière ce système de "correspondance" ou s'il existe des solutions plus fiables ou plus simples.

    Je vous remercie d'avance pour votre aide !

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour,

    ton domaine n'est pas du tout dans mes connaissances aussi la sugestion suivante peut etre totalement farfelue.

    Est-ce que tu pourrais associer un score ou une note a ta composition de materiaux.

    Par exemple le materiau attendu qui rencontre toutes tes contraintes a une note de 10. Donc si j'ai bien compris le nombre de contraintes.

    Le materriau candiat1 rencontre 5 contraintes, alors il a une note de 5.
    Le materriau candiat2 rencontre 8 contraintes, alors il a une note de 8.
    Le materriau candiat3 rencontre 3 contraintes, alors il a une note de 3.

    Apres tu peux slectionner sur la note ce qui me parait plus facile.

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci pour ta réponse !

    Oui ton idée correspond en gros à ce que je veux faire. Il faudrait que j'attribue 1 point, pour chaque élément chimique de l'analyse, à tous les matériaux qui répondent au critère de cet élément et les matériaux avec le plus de points seront classés premiers.

    C'est pour réaliser le code que je coince. Dans le code que j'ai mis j'utilise SQL & " And ... " mais du coup ça ne garde que les matériaux qui ont 10/10. Je sais pas si ça marcherait en utilisant plutôt SQl & " Or ... " comme ça ça garde ceux qui répondent au moins à un critère. Après je sais pas comment donner 1 point à chaque fois à tous les matériaux qui répondent à la requête SQL.

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Le schéma (les champs utiles) des tables concernées, quelques enregistrements et un tableau du résultat souhaité. Cela aide beaucoup à comprendre.
    @+

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Sur la base du code que tu as posté, voici comment je ferai pour créer un critère sur une note.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Dim sCritNote As String, AppendCritNote As Boolean
     
            ' Elément silicium
            If (txtSiMass <> "") Then
                Dim minSi As String
                Dim maxSi As String
     
                minSi = txtSiMass - 3 * txtSiSigma.Value
                maxSi = txtSiMass + 3 * txtSiSigma.Value
     
                minSi = Replace(minSi, ",", ".")
                maxSi = Replace(maxSi, ",", ".")
     
                If (AppendCritNote) Then
                   sCritNote = sCritNote & " + "
                End If            
                sCritNote = sCritNote & "Abs([SiMaxCompo] BETWEEN " & minSi & " AND " & maxSi & ")"
                AppendCritNote = True
            End If
     
            ' Elément suivant
            ' ....
     
            ' Elément suivant
            ' ....
     
           ' etc...
     
            If Len(sCritNote)>0 Then
                If (Append) Then
                    SQL = SQL & " And ((" & sCritNote & ")>=4)"
                Else
                    SQL = SQL & " ((" & sCritNote & ")>=4)"
                End If
            End if
    Le critère de note est construit dans la variable sCritNote, sous la forme d'une expression SQL qui fait la somme arithmétique des critères sur les éléments.
    A cette fin, j'utilise la fonction Abs qui convertit une expression booléenne (Vrai/Faux) en entier (1/0).
    En résumé:
    critère note = Critère_Element1 + Critère_Element2 + ...
    où chaque Critère_Elementi vaux 1 ou 0.

    A la fin je restreint ce critère 'note' au minimum souhaité (4 dans cet exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            If Len(sCritNote)>0 Then
                If (Append) Then
                    SQL = SQL & " And ((" & sCritNote & ")>=4)"
                Else
                    SQL = SQL & " ((" & sCritNote & ")>=4)"
                End If
            End if
    Voila, j'espère que tu vois le principe et qu'il correspond à ce que tu cherches.

    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci infiniment LedZeppII c'est exactement ce que je cherchais !!

    J'ai juste gardé ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Ta requête 
    sCritNote = sCritNote & "Abs([SiMaxCompo] BETWEEN " & minSi & " AND " & maxSi & ")"
     
    'Ma requête
    sCritNote = sCritNote & "Abs(([SiMaxCompo] >= " & minSi & ") And ([SiMinCompo] <= " & maxSi & "))"
    La différence est subtile mais le mieux est de l'illuster avec un schéma:

    Nom : recherche particule étape 6.jpg
Affichages : 226
Taille : 37,0 Ko

    Pour le silicium (losange bleu) avec ta requête le matériau n'apparaitrait pas car sa composition max en Si n'est pas entre les valeurs de l'analyse bien que l'on soit dans les tolérances, mais là je chipote je n'aurai jamais trouvé ça sans toi .

    Je vais utiliser le "sCritNote" dans un formulaire pour que l'utilisateur choisisse la note qu'il veut. Pour cela je pense qu'il suffit de remplacer le ">=4" par un ">= Me.txtSCritNote" par exemple.

    Il y a une chose que je ne sais pas faire aussi (s'il n'y en avait qu'une ^^), c'est de faire un order by sur la variable sCritNote pour afficher en premier les résultats avec la meilleure note.

    alassanediakite je ne peux hélas pas mettre d'enregistrements car ce sont des données confidentielles mais voilà une image des deux tables contenant les données ainsi que le formulaire d'analyse:
    Nom : TablesBDD.jpg
Affichages : 226
Taille : 79,5 KoNom : formulaire analyse.jpg
Affichages : 221
Taille : 136,5 Ko

    Merci encore !

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Je n'avais pas vu que le test s'effectuait sur deux champs différents (SiMaxCompo et SiMinCompo)

    Si l'instruction SQL se trouvant dans la variable SQL ne contient pas déjà une clause ORDER BY, tu peux l'ajouter:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            If Len(sCritNote)>0 Then
                SQL = SQL & " ORDER BY (" & sCritNote & ") DESC"
            End if
    ... tout en gardant à l'esprit qu'il faut respecter cet ordre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM ...
    WHERE ...
    GROUP BY ...
    HAVING ...
    ORDER BY ...
    A+

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci encore LedZeppII j'ai ajouté en plus un contrôle (sliderElements) qui permet à l'utilisateur de choisir sa valeur de "scritnote" entre 1 par défaut et 5 max.

    Nom : contrôle défilement.jpg
Affichages : 204
Taille : 6,9 Ko

    Le code correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            If Len(sCritNote) > 0 Then
                If (Append) Then
                    SQL = SQL & " And ((" & sCritNote & ")>= " & Me.SliderElements & ")"
                Else
                    SQL = SQL & " ((" & sCritNote & ")>= " & Me.SliderElements & ")"
                End If
            Append = True
            End If
    Je suis pénible mais en voyant la longue liste de résultats que j'obtiens parfois (impossible à réduire uniquement en changeant la valeur de scritnote car l'utilisateur souhaite parfois voir ABSOLUMENT tous les résultats), j'ai cherché pour voir comment colorer les lignes suivant par exemple la valeur de "scritnote" (une couleur par valeur de scrinote) et apparemment le plus simple serait de créer un sous-formulaire.
    Le problème c'est que je manque de temps pour transformer ma liste de 47 colonnes en sous formulaire et je me demandais donc si ça ne serait pas possible directement en vba de dire
    "for scritnote = 2 color= blue" (pour schématiser car la couleur se définit avec des valeurs barbares je crois, du genre #77C0D4). Est-ce aussi possible de faire ça pour les colonnes ? Si j'ai rempli la case de l'élément silicium, dans les résultats la colonne montrant les valeurs de silicium est coloriée afin de la repèrer facilement au milieu des autres.

    Voilà un exemple de quelques colonnes de résultats pour illustrer:
    Nom : exemple résultats.jpg
Affichages : 205
Taille : 277,7 Ko

    Merci d'avance !

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Je ne suis pas super pro concernant le type de mise en forme que tu souhaites.
    Ce que je peux dire c'est que on se sait pas, dans un formulaire en continu ni même dans une zone de liste (ce à quoi ressemble ta copie d'écran), attribuer des propriétés différentes à un même champ d'une même colonne.
    Si on modifie une propriété (couleur de texte ou couleur de fond par exemple), elle se répercute dans toute la colonne.

    L'alternative au problème évoqué plus haut est la mise en forme conditionnelle.
    Cependant cette technique a aussi ses limite. Dans Access 2007 (pour 2010 je ne sais) on est limité à trois conditions de mise en forme conditionnelle.
    De plus il faut un certain à Access pour appliquer la mise en forme quanf on fait défiler les enregistrements.

    La seule solution que je verrai serait d'exporter le résultat dans Excel, où chaque cellule est indépendante des autres.
    Par contre ça veut dire beaucoup de code.

    De mon point de vue et avec mes connaissances, je ne vois pas de solution purement Access autre que la mise en forme conditionnelle.

    • Il faudra que les données soient affichées dans un sous formulaire.
    • Il faudra aussi que "scritnote" soit un champ de la requête et non un simple critère, de manière à pouvoir créer une mise en forme de type «expression» permettant de créer une condition sur ce champ.
      Par exemple si on l'appelle chCritNote dans la requête (expression_CritNote As chCritNote) l'expression pour la mise en forme conditionnelle pourra être «[chCritNote] > 3» de manière à appliquer la mise en forme pour les valeurs 4 et 5.


    Pour info, si tu veux passer d'une zone de liste à un sous-formulaire, ce n'est pas compliqué.
    Il suffit de créer une requête (par exemple R_Result_Rech) qui servira de source au sous-formulaire.
    Etant donnée que ton code crée le code SQL d'une requête de sélection, tu peux l'affecter à cette requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.QueryDefs("R_Result_Rech").SQL = SQL
    Après cela, il faut simplement actualiser le sous-formulaire en lui faisant re-exécuter la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.[Nom_Du_Contrôle_SousFormulaire].Form.RecordSource = ""
    Me.[Nom_Du_Contrôle_SousFormulaire].Form.RecordSource = "R_Result_Rech"
    A+
    {Edit 22:13 Ajout pièce jointe exemple}
    Fichiers attachés Fichiers attachés

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Je n'ai pas fini de te remercier je crois ^^

    L'aspect est déjà bien mieux car j'ai pu espacer un peu les lignes ça fait moins peur !

    Par contre je viens de me rendre compte d'un bug assez gênant de la requête. En effet, pour chaque matériau j'ai des éléments qui ne sont pas présents donc j'ai laissé un champ vide pour ces éléments. Si je fais une analyse avec par exemple du silicium, tous les matériaux qui n'ont pas de silicium du tout sont éliminés alors qu'ils devraient juste avoir 0 pour cet élément ! Si je mets des 0 dans tous les éléments non présents l'erreur disparait. Le problème c'est que ça fait vraiment pas propre dans les résultats de voir un "pavé" de 0,00%!

    Voilà le code que j'ai légèrement modifié depuis la dernière fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    'Silicium
            'Silicon
            If (txtSiMass <> "") And IsNull(txtSiSigma) Then
                MsgBox "Vous avez oublié de rentrer l'incertitude de l'analyse du silicium"
                Exit Sub
                ElseIf (txtSiMass <> "") And (txtSiSigma <> "") Then
                Dim minSi As String
                Dim maxSi As String
     
                minSi = txtSiMass - 3 * txtSiSigma.Value
                maxSi = txtSiMass + 3 * txtSiSigma.Value
     
                minSi = Replace(minSi, ",", ".")
                maxSi = Replace(maxSi, ",", ".")
     
                If (AppendCritNote) Then
                   sCritNote = sCritNote & " + "
                End If
                sCritNote = sCritNote & "Abs(([SiMaxCompo] >= " & minSi & ") And ([SiMinCompo] <= " & maxSi & "))"
                AppendCritNote = True
            End If
    Y a-t-il une autre solution que de faire une condition comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If not IsNull((SiMincompo) And (SiMaxCompo)) Then
    Sachant que des fois le SiMinCompo vaut 0% et SiMaxCompo 1% par exemple ça ne considérera pas SiMinCompo comme nul ?

    Merci de ton aide !

    EDIT: J'ai oublié une chose, je comptais ajouter un système de graphique qui apparait en cliquant sur l'enregistrement voulu. avec la listbox c'est facile l'événement doubleclic existe mais pour les sous-formulaires j'ai vu qu'il n'y a que "sur entrée" et "sur sortie". Il n'est pas possible de créer des événements sur sélection d'un enregistrement ?

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,
    Citation Envoyé par jonsnow43 Voir le message
    Par contre je viens de me rendre compte d'un bug assez gênant de la requête. En effet, pour chaque matériau j'ai des éléments qui ne sont pas présents donc j'ai laissé un champ vide pour ces éléments. Si je fais une analyse avec par exemple du silicium, tous les matériaux qui n'ont pas de silicium du tout sont éliminés alors qu'ils devraient juste avoir 0 pour cet élément ! Si je mets des 0 dans tous les éléments non présents l'erreur disparait. Le problème c'est que ça fait vraiment pas propre dans les résultats de voir un "pavé" de 0,00%!
    Le problème vient du fait que si on a une valeur Null dans une expression booléenne, le résultat de l'expression n'est pas un booléen mais Null. Par exemple ....
    Null Or True -> Null
    False And Null -> Null
    Même chose avec une expression arithmétique...
    1 + Null + 1 +1 -> Null

    Ça doit se résoudre en utilisant la fonction Nz([NomChamp], ValeurDeRemplacementPourNull) dans le critère de requête.
    Avec Nz([SiMaxCompo], 0) par exemple, Nz retourne 0 quand le champ SiMaxCompo est Null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                If (AppendCritNote) Then
                   sCritNote = sCritNote & " + "
                End If
                sCritNote = sCritNote & "Abs((Nz([SiMaxCompo], 0) >= " & minSi & ") And (Nz([SiMinCompo], 0) <= " & maxSi & "))"
                AppendCritNote = True

    Citation Envoyé par jonsnow43 Voir le message
    EDIT: J'ai oublié une chose, je comptais ajouter un système de graphique qui apparait en cliquant sur l'enregistrement voulu. avec la listbox c'est facile l'événement doubleclic existe mais pour les sous-formulaires j'ai vu qu'il n'y a que "sur entrée" et "sur sortie". Il n'est pas possible de créer des événements sur sélection d'un enregistrement ?
    J'ai actualisé mon exemple précédent (cliquer bd_SEL_Avec_Sfm.zip).
    Le principe:
    Dans le sous-formulaire je crée une fonction qui gérera l'événement double-clic des contrôles de mon choix.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function fnDoubleClicCommun()
    Dim oCtl As Access.Control
    Dim sCtlNom As String, sCtlValeur As String
    Dim sMsg As String
     
    sCtlNom = Screen.ActiveControl.Name
    sCtlValeur = Nz(Screen.ActiveControl.Value, "<Vide>")
    sMsg = "Clé de l'enregistrement: " & Me.CodMedia & vbCrLf & vbCrLf & _
           "Valeur du contrôle: " & sCtlValeur
     
    MsgBox sMsg, vbInformation, "Double-clic sur contrôle {" & sCtlNom & "}"
    End Function
    "Dans le sous-formulaire", ça signifie que j'ouvre le sous-formulaire en mode création, puis que j'affiche son code pour y coller ma fonction.

    Etape suivante: relier l'événement double-clic à ma fonction.
    Je sélectionne tous les contrôles de mon sous-formulaire que je veux connecter à ma fonction.
    J'affiche la feuille de propriétés.
    Je vais dans l'onglet «Evénement»
    En face de «Sur double clic» je colle =fnDoubleClicCommun().
    Et voila le tour est joué.

    A+

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci les explications sont très claires et je fais un bond en avant à chaque fois ^^

    Aussi grand que soient mes bonds, je vais faire un bond en arrière (mais c'est pour prendre de l'élan )

    je reviens à le mise en forme conditionnelle. En fait j'avais mal paramétré mon sous -formulaire ce qui fait que je ne voyais pas l'option de MFC. Ce problème est maintenant résolu mais je n'arrive pas à faire passer les critères (scritnote, minC, maxC, etc) en champ dans la requête.

    Comme tu l'as expliqué avec sCritNote, il faut utiliser (expression_minC As chMinC) avec par exemple expression = "Nz([CMaxCompo], 0) >= minC" (oui je voudrais que pour chaque élément dans l'analyse ça soit vert si cet élément et OK, rouge s'il ne l'est pas, ça permet de voir par exemple pour scritnote = 2, quels éléments retournent la valeur 1).

    Enfin bref je n'arrive pas à voir où il faut ajouter ce code, je dois créer des champs (créer une table spéciale avec tous ces champs?) et les ajouter dans la requête? Du peu que j'ai vu, je n'ai pas remarqué de limitation à trois conditions pour access 2010 mais je confirmerai ça quand j'arriverai à en faire déjà une

    J'ai un autre souci assez étrange. Je veux afficher les valeurs entrées pour l'analyse au dessus du sous-formulaire. Pour cela, j'ai un champ texte pour minC, un pour maxC, idem pour tous les éléments. J'ai le code qui marche mais la valeur affichée n'est pas au bon format.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms("Results").Controls("Cmin") = minC
    Je lance cette ligne après l'ouverture du formulaire "Results" et ça met dans le champ correspondant ("Cmin") 0,007 au lieu de 0,7% (le champ texte est réglé au format pourcentage avec 2 décimales)

    J'ai essayé ça aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms("Results").Controls("Cmin") = FormatPercent(minC, 2)
    Et là ça met 0,49% !!? Je me suis dit 0,7² ça fait 0,49 mais je vois pas pourquoi ça ferait sa j'ai essayé de remplacer le 2 par 3 et ça met 0,486% donc c'est bien le nombre de décimales.

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    Comme tu l'as expliqué avec sCritNote, il faut utiliser (expression_minC As chMinC) avec par exemple expression = "Nz([CMaxCompo], 0) >= minC" (oui je voudrais que pour chaque élément dans l'analyse ça soit vert si cet élément et OK, rouge s'il ne l'est pas, ça permet de voir par exemple pour scritnote = 2, quels éléments retournent la valeur 1).
    Enfin bref je n'arrive pas à voir où il faut ajouter ce code, je dois créer des champs (créer une table spéciale avec tous ces champs?) et les ajouter dans la requête?
    On peut appliquer le même principe.
    Ces expressions ajoutées à la requêtes sous forme de champs (colonnes) sont dénommés «champs calculés».
    Il s'ajoutent dans la partie SELECT de la requête, en leur attribuant un alias (nom de colonne) avec As NomAlias, comme avec expression_minC As chMinC.
    S'il y a vraiment beaucoup de champs calculés à ajouter, moi je préfère passer par une table liée au formulaire.

    Peut-être plus simple pour de la mise en forme conditionnelle, les variables temporaires.
    Depuis Access 2007, on peut utiliser des variable temporaires qui sont accessibles depuis Visual Basic et depuis les requêtes.

    Création (ou modification si elle existe) d'une variable MinC:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    TempVars.Add "MinC", 1.17
    Ensuite dans la mise en forme conditionnelle, tu peux créer un expression sur la valeur du champ et la comparer à [TempVars]![MinC] (qui va être francisé en [VarTemp]![MinC]).

    Le travail de ton code sera de créer/modifier toutes les variables temporaires nécessaires à la mise en forme conditionnelle.

    Je lance cette ligne après l'ouverture du formulaire "Results" et ça met dans le champ correspondant ("Cmin") 0,007 au lieu de 0,7% (le champ texte est réglé au format pourcentage avec 2 décimales)
    Ça pour moi, c'est un problème à régler au niveau des propriétés «Format» et «Décimales» de la zone de texte.
    Mais il semble que tu l'as déjà fait.
    Désolé, je vois pas.

    A+

  14. #14
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Bonjour,

    Le problème vient du fait que si on a une valeur Null dans une expression booléenne, le résultat de l'expression n'est pas un booléen mais Null. Par exemple ....
    Null Or True -> Null
    False And Null -> Null
    Même chose avec une expression arithmétique...
    1 + Null + 1 +1 -> Null
    Bonjour,

    je m'insère (très) brièvement dans la discussion pour revenir sur ce point.
    Null ne se "propage" pas de manière systématique au sein d'une expression. En fait, pour faire simple, Null signifie "je ne sais pas" ou encore "valeur inconnue".
    Dans ces conditions, False And une valeur inconnue renvoie bien une valeur inconnue (False And Null -> Null)
    Et 1 + une valeur inconnue + 1 +1 renvoie bien une valeur inconnue (1 + Null + 1 +1 -> Null)
    En revanche, une valeur inconnue Or True renvoie True, puisque l'opérateur Or renvoie True dès lors qu'au moins de ses opérandes est True (peu importe que la valeur de l'autre opérande soit inconnue). Donc Null Or True -> True.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Merci J1 pour ton éclaircissement ça explique pourquoi la requête fonctionnait quand même bien qu'il y ait des valeurs "null".

    Si tu as une idée aussi sur le formatage d'un champ texte en pourcentage (le 0,007 qui se transforme en 0.49% ! ) je suis preneur !

    LedZepp j'ai pas encore eu le temps de tester la MFC je regarde ça dès que je peux.

    Bon Week-End !

  16. #16
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,
    Citation Envoyé par jonsnow43 Voir le message
    Merci J1 pour ton éclaircissement
    +1

    Merci de m'avoir corrigé, j'ai généralisé un peu vite le phénomène de propagation de Null.

    A+

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai cru devenir fou mais j'ai réussi à faire cette satanée mise en forme conditionnelle!! Malheureusement ce que j'ai lu sur d'autres topics au sujet de la lenteur de la mise en couleur des cases n'a pas disparu avec l'évolution des versions d'access Je n'ai fait la mfc que pour une colonne alors 40 ça me fait peur...

    Il n'y a sûrement rien à faire contre ça...

    Pour ceux que ça intéresse voilà le code j'ai simplement remplacé le 1.17 (au début j'ai cru qu'il fallait donner obligatoirement une valeur numérique tu m'as fait peur LedZepp ) mais avec mon minC et maxC calculés auparavant ça passe nickel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim minC As String
                Dim maxC As String
     
                minC = txtCMass - 3 * txtCSigma.Value
                maxC = txtCMass + 3 * txtCSigma.Value
                TempVars.Add "minC", minC
                TempVars.Add "maxC", maxC
    Nom : MFC.jpg
Affichages : 173
Taille : 55,8 Ko

    Je ne devrais pas avoir à poser des questions aussi stupides mais j'ai un problème concernant ma requête select qui ne tient pas sur une ligne tellement elle est longue (je ne peux plus rien saisir) normalement il suffit d'ajouter ça en fin de ligne ( _) avec l'espace avant le _ mais j'ai un message d'erreur (Attendu: fin d'instruction) je ne comprends pas pourquoi!!
    J'ai essayé de rajouter un & en début de ligne mais là l'erreur se déplace sur le AS du champ suivant...

    Nom : erreur requête.jpg
Affichages : 188
Taille : 22,9 Ko

    A+

  18. #18
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonjour,

    Vu que c'est du texte, il ne faut pas oublier de mettre chaque ligne entre " et les concaténer.
    Du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql = " SELECT champ1, champ2 as.................." _
    & " champx, cchampy AS ,............" _
    & " FROM LATABLE;"
    Ne pas oublier les espaces avant les mots réservés FROM, WHERE, GROUP, ....


    Bonne continuation

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup Madefemere !!

    ça me permet d'avoir un code plus joli et surtout de finir ma requête

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 44
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Je reviens un mois après pour vous remercier pour votre aide qui a été essentielle à la réalisation de mon stage.

    J'ai dû apporter quelques modifications et je souhaitais vous les faire partager pour les personnes qui souhaiteraient faire des choses similaires.

    Tout d'abord je me suis rendu compte d'un bug sur la MFC quand les pourcentages étaient inférieurs à 0,1%. La MFC m'indiquait que les pièces étaient hors tolérance alors que la requête d'analyse les classait comme bon (c'est elle qui avait raison ^^)
    Par exemple pour 0,02% la requête affichait 2.000001E-4 et cette valeur était utilisée par la MFC mais elle n'avait pas l'air de l'apprécier ! il faut savoir que le calcul se faisait dans la requête via une variable String.

    La solution a été de créer des champs dans une table, qui enregistraient ces valeurs (le "txtCMass - 3 * txtCSigma.Value" visible dans les autres messages)et les attribuaient aux variables temporaires au format cette fois-ci Single (Réel simple) et là bingo la MFC remarchait !!

    Un second problème: quand les % mini passaient en dessous de 0, le code attribuait 1 point aux alliages qui n'avaient aucune valeur pour cet élément. Cela venait du fait que si on a aucune valeur pour un élément, le code met 0 à la place sinon ça bug. Du coup le 0 était compris entre le %mini négatif et le % maxi positif (logique). J'ai trouvé une solution "à l'arrache" en regardant si le premier caractère du %mini de l'élément était un "-" et si c'est le cas le code remplace cette valeur par "0,00001" histoire que les alliages avec 0 comme valeur ne soient pas dans la tolérance.

    Je vous mets donc le code pour un élément à titre d'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
        'Chrome
        'Chromium
        TempVars.Remove ("minCr") 'Variables temporaires utilisées pour la mise en forme conditionnelle (MFC)
        TempVars.Remove ("maxCr") '(couleur verte ou rouge suivant la valeur de cette variable). On les supprime pour
                                  'remettre à 0 la MFC à chaque nouvelle analyse.
        If (txtCrMass <> "") And IsNull(txtCrSigma) Then 'Si on a rempli la case "%Masse" du chrome mais pas la case "Sigma" alors.
            If (VariablesPubliques.French) Then
                MsgBox "Vous avez oublié de rentrer l'écart-type de l'analyse du Chrome."
            ElseIf (VariablesPubliques.English) Then
                MsgBox "You forgot to enter the standard deviation for Chromium analysis."
            End If
            Exit Sub              'On quitte la procédure de recherche de particules.
            ElseIf (txtCrMass <> "") And (txtCrSigma <> "") Then 'Sinon, si les deux cases sont remplies alors.
            Dim minCr, maxCr As String   'Déclaration des variable servant à la comparaison des minimum et maximum en
                                  'Chrome de l'analyse avec les compositions des différents alliages.
            Dim MFCMinCr, MFCMaxCr As Single 'Variables temporaires au format réel simple (MFC)
     
            minCr = txtCrMass - 3 * txtCrSigma.Value 'Définition des valeurs de ces deux variables,
            maxCr = txtCrMass + 3 * txtCrSigma.Value 'Elles sont égales à %Masse de Chrome + ou - 3*Sigma du chrome.
            MFCMinCr = oRst("CrMin")    ' Récupère les valeurs calculées équivalentes à "minCr et "maxCr" et les
            MFCMaxCr = oRst("CrMax")    ' attribue aux variables temporaires
            TempVars.Add "minCr", MFCMinCr 'On enregistre ces valeurs dans les variables temporaires respectives.
            TempVars.Add "maxCr", MFCMaxCr
            minCr = Replace(minCr, ",", ".") 'Les cases sont au format numérique pourcentage et obligent de mettre des
            maxCr = Replace(maxCr, ",", ".") 'virgules mais elles doivent être remplacées en points par le code pour qu'il marche.
            If InStr(minCr, "-") = 1 Then   ' Si la valeur mini de Cr de l'analyse est négative (signe -) , alors minCr = 0.00001.
                minCr = "0.00001"
            End If
     
            If (AppendCritNote) Then 'si on déjà analysé selon d'autres éléments (Mn,Si,etc.)alors.
               sCritNote = sCritNote & " + " 'On ajoute ce critère à la requête de recherche
            End If
            sCritNote = sCritNote & "Abs((Nz([CrMaxCompo], 0) >= " & minCr & ") And (Nz([CrMinCompo], 0) <= " & maxCr & "))"
            'sCritNote est le critère de recherche, il faut que la composition max en Chrome de l'alliage soit supérieure
            'ou égale au minimum de l'analyse pour le Chrome ET que la composition mini de l'alliage soit infèrieure ou
            'égale au maximum de l'analyse.
            AppendCritNote = True 'Passe à "Vrai" pour indiquer que l'on analyse selon au moins un élément.
        End If
    Voilà encore merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête SQL : afficher résultat même si champ vide
    Par nlbmoi dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/09/2014, 15h05
  2. [SQL] Afficher X résultats par page ! (LIMIT)
    Par CaLeDo dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 13/08/2007, 23h21
  3. [SQL] Nombre de résultats par pays
    Par flOZ dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2006, 05h29
  4. Réponses: 7
    Dernier message: 24/05/2006, 11h52
  5. [MySQL] SQL et résultat de recherche par mot clef
    Par carelha dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/04/2006, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo