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 :

Insertion de données manquante (fonction coalesce sous Access)


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Insertion de données manquante (fonction coalesce sous Access)
    Bonjour à vous tous,

    Lors d'une question précédente dans la section Oracle SQL, on m'a aidé à construire avec succès une requête pour trouver les séquences manquantes tout en allant chercher les valeurs associées à l'enregistrement précédent. Pour y arriver, nous avons utilisé la fonction Oracle "coalesce". Malheureusement, cette fonction ne semble pas exister sous MsAccès (DAO), quoique je ne connais pas très bien MsAccess.

    Donc, j'aimerais que vous puissiez m'aider à construire une fonction compatible MsAccess 2003 qui me permettrait de faire sensiblement la même chose que sous Oracle. Attention si vous regardez mon post sous Oracle, car dans ma question originale, je ne devais pas traiter de colonne "Groupe".

    Mon objectif est d'insérer les données manquantes dans une table, et ce, en fonction de l'enregistrement précédent du même groupe.

    À titre d'exemple, j'ai une table "MaTable" qui contient une liste de données (colonnes "Pb" et "Code") qui sont fonction d'un numéro de semaine (NoSem). Ces données sont regroupées via une colonne "Groupe". Malheureusement, les données dans "MaTable" sont incomplètes et je dois combler les "trous". Pour la colonne "NoSem", je dois inscrire le numéro de semaine manquant. Pour les colonnes "Pb" et "Code", je dois aller chercher les valeurs associées au numéro de semaine précédente (s'il n'y a pas de semaine précédente, alors il faut aller chercher la dernière disponible). Ces traitements doivent se faire pour chaque "Groupe".

    Aux fins de simplifications, on peut considérer qu'il n'y que 6 semaines possible (1 à 6). Donc, si les données de "MaTable" étaient définies par la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH MaTable AS(
    SELECT 'A1A1A' AS Groupe, 2 AS NoSem, 327 AS Pb, 'bbb' AS Code FROM dual union ALL
    SELECT 'A1A1A'	 	, 3         , NULL     , 'ccc'         FROM dual union ALL
    SELECT 'A1A1A'	 	, 5         , 349      , NULL          FROM dual union ALL
    SELECT 'B2B2B'		, 2         , 222      , 'bbb'         FROM dual union ALL
    SELECT 'B2B2B'		, 3         , 333      , 'ccc'         FROM dual union ALL
    SELECT 'B2B2B'		, 4         , 444      , 'ddd'         FROM dual union ALL
    SELECT 'B2B2B'		, 5         , 555      , 'eee'         FROM dual union ALL
    SELECT 'B2B2B'		, 6         , 666      , 'fff'         FROM dual
    )
    J'aimerais que les enregistrements suivants soient ajoutés dans "MaTable"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        GROUPE	  LVL     FROMID         PB CODE
    ---------- ---------- ---------- ---------- ----
         A1A1A          1          5        349      
         A1A1A          4          3            ccc  
         A1A1A          6          5        349      		 
         B2B2B          1          6        666 fff

    Dans l'exemple précédent, on doit ajouter les semaines 1, 4 et 6 du groupe "A1A1A", car elles sont manquantes dans "MaTable". On doit aussi ajouter la semaine 1 du groupe "B2B2B".

    Pour la semaine 1 du groupe "A1A1A", on inscrit les valeurs des colonnes "Pb" et "Code" de la semaine 5, car il n'y a aucun NoSem précédant la semaine 1. Il faut savoir que les semaines bouclent (c'est la semaine 6 qui précède la semaine 1). Or, comme le NoSem=6 n'existe pas dans "MaTable", il faut prendre les valeurs de la semaine précédente à cette 6e semaine manquante, ce qui correspond à la semaine NoSem=5. J'espère être assez clair...
    Pour la semaine 4 du groupe "A1A1A", on inscrit les valeurs des colonnes "Pb" et "Code" de la semaine 3, car la semaine 3 correspond à la semaine précédente la semaine 4 manquante de "MaTable".
    Pour la semaine 6 du groupe "A1A1A", on inscrit les valeurs des colonnes "Pb" et "Code" de la semaine 5, car la semaine 5 correspond à la semaine précédente la semaine 6 manquante de "MaTable".
    Pour la semaine 1 du groupe "B2B2B", on inscrit les valeurs des colonnes "Pb" et "Code" de la semaine 6, car il n'y a aucun NoSem précédant la semaine 1. Il faut savoir que les semaines bouclent (c'est la semaine 6 qui précède la semaine 1).

    Merci beaucoup!

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Une solution brutale :

    1. Mettre un index unique composé de [Groupe] et de [NoSem] sur la table de résultat
    2. Faire un produit croisé [Groupe], [NoSem] pour générer toutes les semaines possibles pour tous les groupes possibles.
    3. Faire une requête d'ajout qui ajoute tous les enregistrements du produit croisé dans la table de résultat
    4. Ignorer les erreurs du au doublon.


    Solution un peu plus douce :

    1. Inventorier les comibaisons [Groupe], [NbSem] existant dans la table de resultat.
    2. Faire un produit croisé [Groupe], [NoSem] pour générer toutes les semaines possibles pour tous les groupes possibles.
    3. Faire une requête d'ajout qui ajoute tous les enregistrements du produit croisé qui ne sont pas dans la liste des combinaisons existantes dans la table de résultat


    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Salut marot_r,

    Merci pour ta réponse, mais si je comprends bien, ce que tu proposes va simplement me permettre de trouver les trous par "Groupe", mais pas me permettre d'aller chercher les valeurs associées à l'enregistrement précédent disponible ou au dernier enregistrement du groupe s'il n'y a aucun enregistrement précédent.

    À ma connaissance, je crois qu'on a pas le choix de faire ça en code VBA.

    Merci encore

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Si j'ai bien compris, tu te moques des valeurs qui précédent, tu veux juste que toutes tes semaines soient là et c'est ce que je propose. Avec ma solution je suis sur que toutes les semaines seront là.

    J'ai peut-être mal compris ton besoin.

    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Rebonjour marot_r,

    J'ai dû mal m'exprimer. Je me moque effectivement des valeurs qui précèdent, mais uniquement pour les semaines, car je veux avoir toutes les semaines, et ce, pour tous les groupes pris individuellement. Ce volet est effectivement couvert par ce que tu proposes.

    Par contre, pour mes autres colonnes ("Pb" et "Code"), je dois impérativement aller chercher les valeurs de l'enregistrement précédent, et ce, pour son groupe uniquement. Je t'invite à regarder mon exemple de résultat attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        GROUPE	  LVL     FROMID         PB CODE
    ---------- ---------- ---------- ---------- ----
         A1A1A          1          5        349      
         A1A1A          4          3            ccc  
         A1A1A          6          5        349      		 
         B2B2B          1          6        666 fff
    Dans cet exemple, la colonne "LVL" fait référence à la semaine manquante, la colonne "FROMID" fait référence à la semaine où l'on doit aller chercher les valeurs des colonnes "Pb" et "Code". Finalement, les colonnes "Pb" et "Code" correspondent aux valeurs de la semaine précédente du groupe (celle de FROMID) qui devront être utilisées pour la semaine manquante courante.

    J'espère ne pas avoir ajouté trop de confusion.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Si tu connais la semaine qui te manque (FormID) à priori
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DFirst("Pb";"TaTable";"[GROUPE]=""" & [GROUPE] & """ and [LVL]=" & [FormID])
    devrait te donner l'info dont tu as besoin.

    A+

Discussions similaires

  1. Chriffrer les données d'une BDD sous Access 2003
    Par megatoune dans le forum Sécurité
    Réponses: 3
    Dernier message: 27/01/2008, 00h25
  2. fonction String sous Access 2003
    Par nonaparus dans le forum VBA Access
    Réponses: 3
    Dernier message: 17/10/2007, 16h52
  3. Fonction "mode" sous access
    Par mim62 dans le forum Access
    Réponses: 5
    Dernier message: 15/06/2006, 16h14
  4. Fonction SI sous access
    Par LeSqual dans le forum Access
    Réponses: 2
    Dernier message: 23/04/2006, 11h22
  5. Réponses: 2
    Dernier message: 02/12/2005, 11h53

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