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 :

Requête conditionnelle


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Requête conditionnelle
    Bonjour à tous et à toutes,

    J'ai un problème qui semble simple sur papier mais je ne suis incapable de le régler dans Access. Voici le contexte:

    J'ai une table Excel liée qui se nomme lab_results. Elle ressemble à ceci:

    Sample_Type Sample_No Au1_1ppm

    Routine Sample1 2.55

    Reassay Sample1 2.84

    Routine Sample2 0.02

    Je dois créer une requête qui fait en sorte que lorsque Sample_Type est = a Reassay, elle place la valeur du Reassay dans un champ Au2_1ppm (créé dans Access) qui n'existe pas dans ma table Excel lab_results. Il ne doit plus rester 1 seul Sample_type = à Reassay au final et je ne peux pas avoir 2 Sample_No identique. Le résultat doit ressembler à ceci:

    Sample_Type Sample_No Au1_1ppm Au2_1ppm

    Routine Sample1 2.55 2.84

    Routine Sample2 0.02

    J'ai essayé d'utiliser l'assistant Build dans Access sans succès alors peut-être que le tout est plus simple en SQL mais je ne connais pas beaucoup le langage alors je tourne en rond. Besoin d'aide svp

    Un gros merci!

    Bryan

  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
    Non ce n'est pas simple car cela contrevient à une base de données en 3ième forme normale qui est la forme quasi idéale pour les bases de données relationnelles.

    Ce point de théorie mentionné :-).

    Pourquoi as-tu besoin de cela ? Quel usage vas-tu faire du résultat ?

    Il y a une solution, avec du code, pour faire cela mais il n'est peut-être pas nécessaire de le faire ou de le faire comme tu le décris.

    A+

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    J'ai besoin de cela car avec mon logiciel (Gemcom qui est la référence dans le domaine minier), il ne faut pas que 2 samples aient le même numéro. Par contre, un sample peut avoir plusieurs valeurs car il arrive qu'un échantillon soit réanalysé pour confirmation. Il se peut aussi que la ré-analyse se fasse avec une autre méthode. Je dois voir toutes ces valeurs sur une seule ligne lorsque c'est le cas.

    Ma table Excel lab_results est le résultat d'une compilation de certificats d'analyse. En gros, il existe 3 méthodes d'analyse: Fire assays, Metallic Seive et Gravimetric. Quand je recois un certificat, je sais quelle méthode à été utilisée mais si une ré-analyse a été faite sur un Fire assay, je ne peux pas le savoir à cette étape alors je ne peux pas créer une colonne "réanalyse fire assays" par exemple. Je dois séparer les résultats originaux (routine) et les réanalyse (reassay) avec une requête dans Access en créant une colonne "réanalyse fire assays" on the fly avec une/des conditions me permettant de placer la valeur du reassay sur la même ligne que le routine mais dans la colonne "réanalyse fire assays". Les résultats sont par la suite transmient à nos clients et comme c'est des compagnie minières (pour l'or principalement), il faut que la base de données soit nickel car elle peut être re-transmise à des compagnies vérificatrices pour des calculs de ressources.

    Ouff je ne sais pas si tu me suis j'ai fais du mieux que j'ai pu pour faire ça le plus court et simple possible. Alors voilà. Quelle serait la meilleure solution selon toi ?

    Merci énormément!

    Bryan

  4. #4
    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
    OK, donc cela te prends une table ou une requête, on ne peut pas s'en tirer avec un champ mémo. Personnellement j'irai vers une table qui évitera d'avoir à recacluler les résultats à chaque fois et parce que tes données semblent assez statiques une fois générées.

    Les requêtes ou tables de Access ne peuvent pas dépasser 255 champs.

    Sais-tu combien de valeurs au maximum tu peux avoir pour un Sample_Type ?

    A+

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je peux avoir 5 valeurs car il y aurait techniquement 5 méthodes. Mes Sample_type sont: routine, fa_reassay, fa_reassay1, ms, grav.

    Cela revient à dire qu'un sample pourrait avoir été analysé 5 fois en conservant toujours le même numéro donc par exemple N1377678 pourrait avoir les valeurs 1,2,3,4,5 et si c'est le cas, elles doivent toutes être sur la même ligne (mon problème actuel).

    As-tu besoin d'autres informations ?

    Merci beaucoup

    Bryan

  6. #6
    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
    Voici une solution à adapter à tes besoins, parcticulièrement pour les noms de table et de champs.

    Créer une table (je vais l'appeler Resultat) qui contiendra tes données 'mis en ligne'.

    Resutat :
    ClefSample champText
    ValeurSample1 champ réel double
    ValeurSample2 champ réel double
    ValeurSample3 champ réel double
    ValeurSample4 champ réel double
    ValeurSample5 champ réel double

    Créer une requête pour vider cette table (je vais l'appeler rViderResultat).

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    delete [Resultat].* from [Resultat];

    Créer une requête présentant les données trié dans l'ordre voulu (je vais l'appeler rSample). Un truc du genre

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select [Sample].* from [Sample] order by [Sample].[ClefSample];

    À mettre dans un module

    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
    40
    41
    public sub TraiterSample()
     
       dim ClefSampleRef as string 'Je suppose que c'est du texte
       dim cptSample as long
     
       dim db as dao.database:set db=currendb
       db.querydefs("rViderResultat").execute
     
       dim rSample as dao.recordset:set r=db.openRecordset("rSample")
     
       dim rResultat as dao.recordset:set r=db.openRecordset("Resultat")
     
       do while not rSample.eof()
     
          if clefSampleRef<>rSample.clefSample then
             rResultat.addNew 'Ajoute un nouvel enregsitrement
             rResultat![ClefSample]=rSample![ClefSample]
             rResultat.update
     
             clefSampleRef=rSample![ClefSample] 'Note la nouvelle clef de référence
             cptSample=0 'Reinitialise le compteur de valeur
          end if
     
          rResultat.findFirst("[ClefSample]=""" & rSample![ClefSample] & """")
     
          if not rResultat.NoMatch then
               rResultat.Edit
               cptSample=cptSample+1
               rResultat.fields("ValeurSample" & cptSample)=rSample![ValeurSample] 'Recopie la valeur dans le résultat dans la colonne voulue
             else
               Error 5 'Cas impossible, soit il existait soit on l'a créé
          end if
     
          rSample.MoveNext 'Lit le sample suivant
       loop
     
       rResultat.close:set rResultat=nothing 'Ferme la source de données, libère la mémoire
       rSample.clsoe:set rSample=nothing 'Ferme la source de données, libère la mémoire
     
       set db=nothing 'Libère la mémoire utilisé par l'objet db
    end sub
    A+

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Impresionnant! Merci beaucoup René c'est exactement ce que je cherchais tu as lu dans mes pensées Je vais tester cela sur le champ!

    Petite question par contre, est-ce que je dois mettre:

    rResultat.fields("ValeurSample1" & cptSample)=rSample![ValeurSample1]
    rResultat.fields("ValeurSample2" & cptSample)=rSample![ValeurSample2]
    rResultat.fields("ValeurSample3" & cptSample)=rSample![ValeurSample3]
    ...

    pour chaque sample type (5 sample type) dans la boucle sur des lignes de codes différentes ou toutes sur la même ligne de code ? C'est la seule partie qui m'échappe sinon pour le reste tout est clair.

    Merci énormément!!

    Bryan

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
               cptSample=cptSample+1
               rResultat.fields("ValeurSample" & cptSample)=rSample![ValeurSample] 'Recopie la valeur dans le résultat
    Pour chaune des lignes dans rSample, le programme va copier la valeur dans la colonne correspondante dans le résultat. C'est cptSample qui va déterminer dans quelle colonne (1 à 5) est mise la valeur courante.

    A+

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon j'ai adapté les noms et les champs voici ce que ça donne:

    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
    40
    41
    Public Sub TraiterSample()
     
       Dim ClefSampleRef As String 'Je suppose que c'est du texte
       Dim cptSample As Long
     
       Dim load_assays As dao.Database: Set load_assays = CurrentDb
       load_assays.QueryDefs("Empty_Result_temp").Execute
     
       Dim Populate_export As dao.Recordset: Set Populate_export = load_assays.OpenRecordset("Populate_export") 'rSample
     
       Dim Result_temp As dao.Recordset: Set Result_temp = load_assays.OpenRecordset("Result_temp") 'rResultat
     
       Do While Not Populate_export.EOF()
     
          If ClefSampleRef <> Populate_export![Sample_no] Then
             Result_temp.AddNew 'Ajoute un nouvel enregsitrement
             Result_temp![Sample_no] = Populate_export![Sample_no]
            Result_temp.Update
     
             ClefSampleRef = Populate_export![Sample_no] 'Note la nouvelle clef de référence
             cptSample = 0 'Reinitialise le compteur de valeur
          End If
     
         Result_temp.FindFirst ("[Sample_no]=""" & Populate_export![Sample_no] & """")
     
          If Not Result_temp.NoMatch Then
               Result_temp.Edit
               cptSample = cptSample + 1
              Result_temp.Fields("ValeurSample" & cptSample) = Populate_export![ValeurSample] 'Recopie la valeur dans le résultat dans la colonne voulue
             Else
               Error 5 'Cas impossible, soit il existait soit on l'a créé
          End If
     
          Populate_export.MoveNext 'Lit le sample suivant
       Loop
     
       Result_temp.Close: Set Result_temp = Nothing 'Ferme la source de données, libère la mémoire
       Populate_export.Close: Set Populate_export = Nothing 'Ferme la source de données, libère la mémoire
     
       Set load_assays = Nothing 'Libère la mémoire utilisé par l'objet db
    End Sub
    J'ai un Runtime error 3251 qui dit "Operation is not supported for this type of object" sur la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result_temp.FindFirst ("[Sample_no]=""" & Populate_export![Sample_no] & """")
    Je me suis documenté sur ce type d'erreur et utiliser le keyword Me et Recordsetclone reviennent souvent dans les solutions mais je suis incapable de régler le problème. Aurais-tu une idée ?

    Merci beaucoup

    Bryan

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Result_temp = load_assays.OpenRecordset("Result_temp",dbOpenDynaset)
    Devrait résoudre ton problème, le FindFirst ne marche pas sur une table locale ouverte avec les paramètres par défaut.

    A+

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci René tu es vraiment mon sauveur! le opendynaset a bel et bien régler l'erreur 3251 mais maintenant, j'ai l'erreur 3265 "Item not found in this collection" sur la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result_temp.Fields("Au1_1ppm" & cptSample) = Populate_export![Au1_1ppm]
    J'ai remplacé le "ValeurSample" par le nom du champ (Au1_1ppm) où se trouve mes valeurs dans ma table Result_temp. J'ai vérifié que le champ existe dans ma table et qu'il est bien écrit. Quand je Mouseover sur Populate_export![Au1_1ppm] je vois la valeur 0.03 ce qui est correct. Le problème est forcément dans le Result_temp.Fields. J'ai essayé avec et sans guillemets mais l'erreur persiste.

    Encore une fois, merci beaucoup pour ton temps.

    Bryan

  12. #12
    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
    Peux-tu poster la structure de la table Result_temp ?

    A+

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Sample_no text Numéro de l'échantillon
    Au1_1ppm double valeur original du lab méthode Fire Assay
    Au2_1ppm double Ré-échantillonnage de la valeur de Au1_1ppm Fire Assay
    Au1_2ppm double Méthode Metallic Seive
    Au1_3ppm double Méthode Gravimetric
    Cert_date Date du certificat d'analyse
    Cert_no Text Numéro du certificat d'analyse
    Hole-ID Text Numéro du trou de forage
    From Double Intervalle d'échantillonage (borne inférieure)
    To Double Intervalle d'échantillonage (borne supérieur)
    Lab_id Text Nom du lab

    Donc chaque sample contient ces informations. Un cas fréquent est lorsque la valeur de Au1_1ppm est élevée, on demande une ré-analyse qui génère une valeur Au2_1ppm. S'il y a toujours un doute, on demande soit un Au1_2ppm ou un Au1_3ppm selon le cas mais il peut arriver qu'on demande toutes les méthodes. Il faut ultimement que toutes ces valeurs soient sur une seule ligne. Désolé pour la ré-itération du problème mais peut-être que ça peut clarifier certaine chose.

    Un gros merci!

    Bryan

  14. #14
    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
    OK c'est un poil plus complex.

    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
    40
    41
    42
    43
    Public Sub TraiterSample()
     
       dim tNomChamp as variant:tNomChamp=array("Au1_1ppm", "Au2_1ppm", "Au1_2ppm","Au1_3ppm") 'Défini les colonnes résulat
     
       Dim ClefSampleRef As String 'Je suppose que c'est du texte
       Dim cptSample As Long:cptSample=-1
     
       Dim load_assays As dao.Database: Set load_assays = CurrentDb
       load_assays.QueryDefs("Empty_Result_temp").Execute
     
       Dim Populate_export As dao.Recordset: Set Populate_export = load_assays.OpenRecordset("Populate_export") 'rSample
     
       Dim Result_temp As dao.Recordset: Set Result_temp = load_assays.OpenRecordset("Result_temp") 'rResultat
     
       Do While Not Populate_export.EOF()
     
          If ClefSampleRef <> Populate_export![Sample_no] Then
             Result_temp.AddNew 'Ajoute un nouvel enregsitrement
             Result_temp![Sample_no] = Populate_export![Sample_no]
            Result_temp.Update
     
             ClefSampleRef = Populate_export![Sample_no] 'Note la nouvelle clef de référence
             cptSample = -1 'Reinitialise le compteur de valeur
          End If
     
         Result_temp.FindFirst ("[Sample_no]=""" & Populate_export![Sample_no] & """")
     
          If Not Result_temp.NoMatch Then
               Result_temp.Edit
               cptSample = cptSample + 1
              Result_temp.Fields(tNomChamp(cptSample)) = Populate_export![ValeurSample] 'Recopie la valeur dans le résultat dans la colonne voulue
             Else
               Error 5 'Cas impossible, soit il existait soit on l'a créé
          End If
     
          Populate_export.MoveNext 'Lit le sample suivant
       Loop
     
       Result_temp.Close: Set Result_temp = Nothing 'Ferme la source de données, libère la mémoire
       Populate_export.Close: Set Populate_export = Nothing 'Ferme la source de données, libère la mémoire
     
       Set load_assays = Nothing 'Libère la mémoire utilisé par l'objet db
    End Sub

  15. #15
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2012
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je vais essayé ça.

    Merci

Discussions similaires

  1. [SQL2K] Faire un requête conditionnelle pour un CURSOR
    Par zooffy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/08/2007, 14h00
  2. [MySQL] Pb de requête conditionnelle
    Par jakkihm dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/03/2007, 21h40
  3. requêtes "conditionnelles"
    Par _marabout dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/04/2006, 14h46
  4. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

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